LaTeX \if 条件

LaTeX \if 条件

我在 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扩展\mycmd1,剩下\if11。这将测试特点的代码与1相对1,并且它们是相等的(当然),因此输出defed, 1

最后,在 之后\def\mycmd{0},我们得到(在 中\if01展开 之后),这是假的,因为不是。因此,输出。\mycmd\if\mycmd101defed

相关内容