\ifx\\\\ 怎么会是假的?

\ifx\\\\ 怎么会是假的?

看来我有一个案例,\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}

相关内容