Open note286 opened 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}
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} ```
装进盒子也能解决问题,如 \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
包。
已搜索到 https://github.com/CTeX-org/ctex-kit/issues/59 ,但是没能解决。
上面是
\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}
的情况。此外,一旦增加内容,就会导致上述问题无法复现,例如,我们增加部分文字。
上述代码仅增加了一行
你
。可以看到又完全正常显示了。