为了处理多个文件的编译选项混乱问题,我使用了一些\ifSomething
开关。但是当我需要检查开关是否已定义,如果未定义则定义它时,我就会犯难。最小示例:
% This may or may not be present:
\newif\ifSomething
\Somethingfalse
% Later, (usually) in a different file:
\ifdefined \ifSomething
\else
\newif\ifSomething
\Somethingtrue
\fi
\documentclass{article}
\begin{document}
Everything ok?
\end{document}
我认为我理解了这个问题:因为\ifSomething
已经定义了,所以它在\else
子句中的出现被解释为开始一个条件——事实上它是\newif
尽管的论点。我甚至记得在 TeXbook 上读到过这个……但是如何应该我这么做吗?
答案1
例如:
\makeatletter
\@ifundefined{ifSomething}{%
\newif\ifSomething
\Somethingtrue
}{}
\makeatother
\@ifundefined
从参数字符串生成宏名并测试命令是否未定义(或\relax
)。这会\if...
从测试中删除标记。此外,分支在语法上是通过参数而不是通过来实现的\if...\else...\fi
。因此,定义或未定义\ifSomething
不会给造成麻烦\@ifundefined
。
但是,有一种情况是,当整个构造位于/分支内时,参数中的\ifSomething
after可能会引起麻烦。那么诀窍是:\newif
\if
\else
\csname
\makeatletter
\@ifundefined{ifSomething}{%
\expandafter\newif\csname ifSomething\endcsname
\Somethingtrue
}{}
\makeatother