什么是 \if?

什么是 \if?

我正在阅读TeX 按主题分类,但要分成小块(而不是从第一页到最后一页),并且只阅读条件语句的内容。我想确保我理解 TeX 开始跳过某些内容时发生了什么。到目前为止,我了解到的是,例如,然后\iffalse ... \fi

  1. TeX 不进行扩展。

  2. TeX 跟踪\if...s 以确保 真正\fi匹配\iffalse

我想要确保自己能正确理解最后一点。确切的问题如下:

到底什么是\if...

我担心的一个原因是我的代码中有一些伪 if,其中一个命令开始 \if...但实际上并不是\if。另一方面,如果我有一个命令没有从三个字符开始\if,但碰巧是\let\if那么,例如,\if(不是它的定义)用于\iffalse ... \fi

  1. \let\ifabc=\ifx(因此,要清楚,在 中发生了什么\iffalse ... \ifabc ... \fi,算作\ifabc\if
  2. \def\ifabc{\ifx}
  3. \edef\ifabc{\ifx}
  4. \let\ifabc=\SomePreviouslyDefinedCommandThatIsntAnIf
  5. \let\abc=\ifx

答案1

当 TeX 跳过错误的条件路径它查看每个标记而不扩展它并修改如果-counter 与括号计数器非常相似。如果标记是原始\if...标记(例如,\let对于 TeX 的任何原始条件,如\if\ifx\ifnum、 ...),则计数器会增加,如果它与 相同\fi(即\fi或任何宏 let 到它),则计数器会减少。宏的名称并不重要。条件里面从未见过其他宏。

详细回答您的问题:

  1. \let\ifabc=\ifx(因此,要清楚,在 中发生了什么\iffalse ... \ifabc ... \fi,算作\ifabc\if

    A:是的,\ifabc算作如果。

  2. \def\ifabc{\ifx}

    A: 不,\ifabc不是if。它将在真的路径,因为它在那里扩展,但没有在错误的小路。

  3. \edef\ifabc{\ifx}

    A:这行不通,因为\ifx被扩展,因此等待它的两个输入标记和最后的\fi。即便如此,原语也不能被扩展为其基本含义,否则它们就不是原语了。

  4. \let\ifabc=\SomePreviouslyDefinedCommandThatIsntAnIf

    A:正如我上面所说,名字并不重要;这不是if

  5. \let\abc=\ifx

    A:名字不重要;这是一个if

有关 if-switch 的更多信息,请参阅TeXBook在 ”第 20 章:定义(也称为宏)",第 207 页及后续页。

相关内容