ctex-kit
ctex-kit copied to clipboard
pifont宏包可能会触发中文不显示
已搜索到 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}
上面是\ding{"B7}的情况。
上面是{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char"B7}的情况。和 https://github.com/CTeX-org/ctex-kit/issues/59 描述的一致。
上面是{\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}
上述代码仅增加了一行你。
可以看到又完全正常显示了。
看起来和 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}
xeCJK 的例子,展示页眉和页脚都受影响
% !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}
装进盒子也能解决问题,如 \hbox{\def\abc{inner}xx} 和 \hbox{\ding{"B7}}。
如果 \ding 是 zjuthesis 文档类里使用的,也许能通过装进 \hbox 解决。我没下载 https://github.com/TheNetAdmin/zjuthesis/issues/350#issuecomment-1827358438 里的附件,不清楚那个 \ding 符号是文档类还是用户使用的。
在 \ding 之前进入水平模式也可以:
\renewcommand\Pisymbol[2]{{\ifvmode\expandafter\indent\fi \Pifont{#1}\char#2}}
为什么用 \indent,而不是 \leavevmode 进入水平模式?
啊,都行吧。注意 \indent 的行为就行
我还是觉得,塞一个 \indent 到 \Pisymbol 里,不好。
\mode_leave_vertical: (以及 \leavevmode@ifvmode)就是使用这个定义,我是参考的这个。(当然直接用这两个宏会更好,避免误展开 \ifvmode)
\mode_leave_vertical: 和 \leavevmode 在实际使用时会有什么副作用吗?我没有使用前者而不使用后者的理由,同时也没有不使用后者的理由。
如果
\ding是zjuthesis文档类里使用的,也许能通过装进\hbox解决。我没下载 TheNetAdmin/zjuthesis#350 (comment) 里的附件,不清楚那个\ding符号是文档类还是用户使用的。
@muzimuzhi 我确认了一下,是用户自己加载的pifont包。