我在 LaTeX 文档中的自定义命令中使用\if
条件。我想知道在哪里可以找到关于\if
命令的良好解释。我遵循了维基百科\if
页面但这只是一个例子;没有任何解释。
答案1
一个很好的条件句参考包含在第十三章 条件语句的TeX 按主题分类。特别地,TeX 中的条件语句有以下两种形式之一
\if...<test tokens><true text>\fi
\if...<test tokens><true text>\else<false text>\fi
这里\if
通常用于引用一大堆条件语句(,,,,,\if
... )。\ifcat
\ifx
\ifdim
\ifnum
让我们使用你的例子:
\documentclass{minimal}
\begin{document}
\ifx\mycmd\undefined
undefed
\else
\if\mycmd1
defed, 1
\else
defed
\fi
\fi
\def\mycmd{1}
\ifx\mycmd\undefined
undefed
\else
\if\mycmd1
defed, 1
\else
defed
\fi
\fi
\def\mycmd{0}
\ifx\mycmd\undefined
undefed
\else
\if\mycmd1
defed, 1
\else
defed
\fi
\fi
\end{document}
它使用了嵌套的\ifx
和\if
条件。让我们看看外层\ifx
定义。从第节13.2 字符和控制序列测试(具体部分13.2.3\ifx
),
代币的平等性在更强的意义上受到考验[...]
\ifx<token1><token2>
[...]
如果控制序列是具有相同参数文本和替换文本的宏,并且相对于\outer
和具有相同的状态,则它们是相等的\long
。例如,\def\a{z} \def\b{z} \def\c1{z} \def\d{\a} \ifx\a\b %is true \ifx\a\c %is false \ifx\a\d %is false
遵循此测试的令牌不会被扩展。
因此,在您的示例中,我们从 开始\ifx\mycmd\undefined
。这是正确的,因为\mycmd
和\undefined
都不存在,因此输出undefed
。后续测试\ifx\mycmd\undefined
均为假,因为\mycmd
已被\def
设定为某物(并且 不存在未定义且不同于\undefined
)。
现在看看\if
测试。从 TeX 按主题(特别是部分13.2.1\if
),
此后TeX 会一直扩展,直到得到两个不可扩展的标记,因此在使用 测试
\if
可扩展控制序列和活动字符时,需要在它们前面加上前缀。\noexpand
\if
我们可以忽略第一个,因为\mycmd
未定义。在\def\mycmd{1}
执行第二个测试之前,因此\if\mycmd1
扩展\mycmd
为1
,剩下\if11
。这将测试特点的代码与1
相对1
,并且它们是相等的(当然),因此输出defed, 1
。
最后,在 之后\def\mycmd{0}
,我们得到(在 中\if01
展开 之后),这是假的,因为不是。因此,输出。\mycmd
\if\mycmd1
0
1
defed