看来我有一个案例,\ifx\\#2\\
虽然#2
是空的,但却是假的。
以下是日志文件中的相关摘录,其中\tracingcommands
和\tracingmacros
处于打开状态:
\lastpageref ->\lastpagereftxt
\lastpagereftxt #1->\pagesLTS@@pageref #1*\END
#1<-pagesLTS.arabic
\pagesLTS@@pageref #1*#2\END ->\ifx \\#2\\\pagesLTS@@@pageref {#1}\else \expand
after \pagesLTS@@@pagerefstar \fi
#1<-pagesLTS.arabic
#2<-
{restricted horizontal mode: \ifx}
{false}
结果,\pagaesLTS@@@pagerefstar
被调用,结果一片混乱。尤其是因为这发生在输出例程中,在排版复杂的页眉时,下一个标记恰好是\cr
。但这一切都不是重点,重点是这种情况不可能发生!然而它却发生了。
我的问题:如何调试这样的问题?假设它不是 TeX 引擎本身的错误,那么它一定有一些自然的解释。我已经验证(使用\show
)这\ifx
确实意味着\ifx
这一点,我向你保证代码中也没有\unless
潜伏着什么。据我所知,这已经耗尽了可能的解释范围。你能想出更多我可以寻找的可能性吗?
编辑:我设法将问题文件缩小到合适的大小。这是我的输入文件:
\errorcontextlines=99
\documentclass{blargh}
\begin{document}
(Dummy text to ensure we get a page.)
\end{document}
我的类文件从 300 多行精简为这个问题的基本内容,并命名为blarhg.cls
:
\NeedsTeXFormat{LaTeX2e}
\LoadClass{report}
\RequirePackage[pagecontinue=false]{pageslts}
\AtBeginDocument{\thispagestyle{Eks}}
\def\PageText#1#2{Page #1 of #2}
\newtoks\firstpageupperright
\firstpageupperright{\PageText{\thepage}{\lastpageref{pagesLTS.arabic}}}
% Taken from pageslts.sty, so I could add \showtokens
\def\pagesLTS@@pageref#1*#2\END{%
\ifx\\#2\\% no star
\pagesLTS@@@pageref{#1}%
\else% star
\showtokens{"#2"}%
\expandafter\pagesLTS@@@pagerefstar%
\fi%
}
\def\ps@Eks{\let\@mkboth\@gobbletwo
\def\@oddhead{\hfill \vtop to 0pt{\let\\\cr
\halign{\strut\hfil####\cr
\relax\tracingall
\the\firstpageupperright\cr
\llap{}\cr}\vss}}
\def\@oddfoot{}\let\@evenfoot\@oddfoot
\let\@evenhead\@oddhead}
答案1
更新,在类文件末尾的 MWE 中更改
\let\\\cr
到
\def\\{\cr}
如果\\
是\cr
那么\ifx\\\\
是有趣的:-)
以下纯 TeX 显示\ifx\\\\
扩展为 false
{\tracingall
\def\\{\hfill\break}
\def\tablecr{{\global\let\\\relax}}
\halign{%
\expandafter
#\cr
\noexpand\ifx\\\\ A \else B \fi
C\cr
}
}
\bye
{\ifx: (level 1) entered on line 7}
{false}
{\else: \ifx (level 1) entered on line 7}
{the letter B}