![\if@ 语句解释](https://linux22.com/image/233862/%5Cif%40%20%E8%AF%AD%E5%8F%A5%E8%A7%A3%E9%87%8A.png)
我正在尝试进行一些调整.cls
以满足我的需要,如果有人能向我解释这些陈述,我将不胜感激:
\if@radseminar%
...
\else
...
\fi
如果我理解正确的话,它会匹配@radseminartrue
,对吧?我该如何使用 OR 语句?例如,我尝试过
\if{@radtehnicka% or @radseminar%}
但也不匹配。
答案1
没有宏\if@
...您看到的宏被称为\if@radseminar
(是的,@
并且所有后续内容都是宏名称的一部分)。
TeX 不支持布尔运算。您不能像在其他编程语言中一样将多个条件连接在一起。您需要通过嵌套来分别测试这些条件:
\if@radseminar
<true>
\else
\if@radtehnicka
<true>
\fi
<else>
\fi
但是,有 LaTeX 软件包可以实现这一点,例如etoolbox
或者ifthen
(我听说后者不应该再使用)。
使用etoolbox
,它看起来应该大致像这样:
\ifboolexpr{bool {@radseminar} or bool {@radtehnicka}}{<true>}{<false>}
答案2
正如其他人指出的那样,这\if@
不是宏,只是宏名的一部分。对于初学者和/或文档来说,使用更高级的宏(如前面提到的etoolbox
包中的宏)应该是首选。
使用较低级别的宏对多个 if 开关进行或组合的常用方法是使用\ifcase
。它等待一个数字(0 或更高),然后仅执行相应的分支。分支由 分隔\or
。最后一个分支可以用 分隔,\else
如果没有该数字的明确分支,则执行该分支。
\ifcase0%
\if@radtehnicka 1\fi
\if@radseminar 1\fi
\relax
% case 0: neither 'radtehnicka' or 'radseminar'
\else
% case 1: 'radtehnicka' or 'radseminar'
\fi
这里使用了一个技巧:0%
给出默认值。由于%
TeX 一直在寻找可以跟在后面的数字,0
并且将其作为单个数字的一部分。TeX 会扩展所有后续标记(例如宏),直到找到非数字。然后这里使用两个 if 开关,1
如果它们是,则插入一个,但不插入其他标记真的并扩展到零,如果错误的。因此 TeX 继续寻找更多标记并处理更多\if@... \fi
行。它会在 处停止寻找数字\relax
。如果两个 if 开关都不符合真的最终数字是,0
因此执行 case 0 分支。如果其中一个是真的最终数字是01
ie 1
,因此执行 case 1 分支。如果两者都是真的最终数字是011
,即将执行 case 11 分支。但是,由于使用了 ,11
因此不存在 case 1 或 11。在这两种情况下,都会执行分支,从而有效地将两个 if 开关进行或组合。\else
\else