CTeX-org / ctex-kit

Macro Packages and Scripts for Chinese TeX users
965 stars 124 forks source link

pifont宏包可能会触发中文不显示 #688

Open note286 opened 7 months ago

note286 commented 7 months ago

已搜索到 https://github.com/CTeX-org/ctex-kit/issues/59 ,但是没能解决。

\documentclass[zihao=-4]{ctexart}
\usepackage{fancyhdr}
\usepackage{pifont}
\fancypagestyle{xxx}{\fancyhead{测试aaa}}
\pagestyle{xxx}
% \setmainfont{Times New Roman}
\usepackage{zhlipsum}
\begin{document}
\zhlipsum[1-2]
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
\par
\ding{"B7}
% {\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char"B7}
% {\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\makexeCJKinactive\char"B7}
\end{document}

image

上面是\ding{"B7}的情况。

image

上面是{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char"B7}的情况。和 https://github.com/CTeX-org/ctex-kit/issues/59 描述的一致。

image

上面是{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\makexeCJKinactive\char"B7}的情况。


此外,一旦增加内容,就会导致上述问题无法复现,例如,我们增加部分文字。

\documentclass[zihao=-4]{ctexart}
\usepackage{fancyhdr}
\usepackage{pifont}
\fancypagestyle{xxx}{\fancyhead{测试aaa}}
\pagestyle{xxx}
% \setmainfont{Times New Roman}
\usepackage{zhlipsum}
\begin{document}
\zhlipsum[1-2]
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你你
\par
\ding{"B7}
% {\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char"B7}
% {\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\makexeCJKinactive\char"B7}
\end{document}

上述代码仅增加了一行

image

可以看到又完全正常显示了。

muzimuzhi commented 7 months ago

看起来和 TeX 的分页方式有关。

解决 #59 的结果之一是,如果 pifont 加载,xecjk 就重定义 \Pifont\ding 会展开到这个命令),局部地使用 \makexeCJKinactive,它把 \XeTeXinterchartokenstate 从 1 改为 0。但在特殊的输入组合下,这个局部的状态改变会泄漏到前一页的页脚。

目前我的建议是,把 \makexeCJKactive 加到页眉页脚的开头。 https://github.com/CTeX-org/ctex-kit/blob/bed900600bb0cae8ed247302eb82d2540b2ea9a1/xeCJK/xeCJK.dtx#L9020-L9024

以下的例子,\abc 的定义局部地从 outer 改为 inner,可以看到这个局部的状态改变泄漏到了第一页的页眉页脚。用 pdflatex、xelatex、lualatex 均可复现。(最好简化到能用 Knuth TeX 复现)

\documentclass{article}
\usepackage[papersize={6cm,5cm}, margin={1cm,.5in}]{geometry}
\renewcommand{\thepage}{\abc, \arabic{page}}
\parindent=0pt

\def\abc{outer}

\begin{document}
foo \\ bar \\ baz \\
foo \\ bar \\ baz \par
{\def\abc{inner}xx}
\end{document}

image

xeCJK 的例子,展示页眉和页脚都受影响

```tex % !TeX program = xelatex \documentclass{article} \usepackage[papersize={6cm,5cm}, margin={1cm,.5in}]{geometry} \usepackage{xeCJK} \usepackage{fancyhdr} \usepackage{pifont} \fancypagestyle{xxx}{% \fancyhead[L]{\the\XeTeXinterchartokenstate 测试aaa}% \fancyfoot[C]{}% \fancyfoot[L]{\the\XeTeXinterchartokenstate 测试bbb}} \pagestyle{xxx} \parindent=0pt \begin{document} 你你 \\ 你你 \\ 你你 \\ 你你 \\ 你你 \\ 你你 \par \ding{"B7}测试 \end{document} ```

image

muzimuzhi commented 7 months ago

装进盒子也能解决问题,如 \hbox{\def\abc{inner}xx}\hbox{\ding{"B7}}

如果 \dingzjuthesis 文档类里使用的,也许能通过装进 \hbox 解决。我没下载 https://github.com/TheNetAdmin/zjuthesis/issues/350#issuecomment-1827358438 里的附件,不清楚那个 \ding 符号是文档类还是用户使用的。

Sophanatprime commented 7 months ago

\ding 之前进入水平模式也可以:

\renewcommand\Pisymbol[2]{{\ifvmode\expandafter\indent\fi \Pifont{#1}\char#2}}
muzimuzhi commented 7 months ago

为什么用 \indent,而不是 \leavevmode 进入水平模式?

啊,都行吧。注意 \indent 的行为就行

我还是觉得,塞一个 \indent\Pisymbol 里,不好。

Sophanatprime commented 7 months ago

\mode_leave_vertical: (以及 \leavevmode@ifvmode)就是使用这个定义,我是参考的这个。(当然直接用这两个宏会更好,避免误展开 \ifvmode

\mode_leave_vertical:\leavevmode 在实际使用时会有什么副作用吗?我没有使用前者而不使用后者的理由,同时也没有不使用后者的理由。

note286 commented 7 months ago

如果 \dingzjuthesis 文档类里使用的,也许能通过装进 \hbox 解决。我没下载 TheNetAdmin/zjuthesis#350 (comment) 里的附件,不清楚那个 \ding 符号是文档类还是用户使用的。

@muzimuzhi 我确认了一下,是用户自己加载的pifont包。