我正在阅读TeX 按主题分类,但要分成小块(而不是从第一页到最后一页),并且只阅读条件语句的内容。我想确保我理解 TeX 开始跳过某些内容时发生了什么。到目前为止,我了解到的是,例如,然后\iffalse ... \fi
:
TeX 不进行扩展。
TeX 跟踪
\if...
s 以确保 真正\fi
匹配\iffalse
。
我想要确保自己能正确理解最后一点。确切的问题如下:
到底什么是\if...
?
我担心的一个原因是我的代码中有一些伪 if,其中一个命令开始 \if...
但实际上并不是\if
。另一方面,如果我有一个命令没有从三个字符开始\if
,但碰巧是\let
?\if
那么,例如,\if
当宏(不是它的定义)用于\iffalse ... \fi
:
\let\ifabc=\ifx
(因此,要清楚,在 中发生了什么\iffalse ... \ifabc ... \fi
,算作\ifabc
吗\if
?\def\ifabc{\ifx}
\edef\ifabc{\ifx}
\let\ifabc=\SomePreviouslyDefinedCommandThatIsntAnIf
\let\abc=\ifx
答案1
当 TeX 跳过错误的条件路径它查看每个标记而不扩展它并修改如果-counter 与括号计数器非常相似。如果标记是原始\if...
标记(例如,\let
对于 TeX 的任何原始条件,如\if
、\ifx
、\ifnum
、 ...),则计数器会增加,如果它与 相同\fi
(即\fi
或任何宏 let 到它),则计数器会减少。宏的名称并不重要。条件里面从未见过其他宏。
详细回答您的问题:
\let\ifabc=\ifx
(因此,要清楚,在 中发生了什么\iffalse ... \ifabc ... \fi
,算作\ifabc
吗\if
?A:是的,
\ifabc
算作如果。\def\ifabc{\ifx}
A: 不,
\ifabc
不是if
。它将在真的路径,因为它在那里扩展,但没有在错误的小路。\edef\ifabc{\ifx}
A:这行不通,因为
\ifx
被扩展,因此等待它的两个输入标记和最后的\fi
。即便如此,原语也不能被扩展为其基本含义,否则它们就不是原语了。\let\ifabc=\SomePreviouslyDefinedCommandThatIsntAnIf
A:正如我上面所说,名字并不重要;这不是
if
。\let\abc=\ifx
A:名字不重要;这是一个
if
。
有关 if-switch 的更多信息,请参阅TeXBook在 ”第 20 章:定义(也称为宏)",第 207 页及后续页。