如果尚未定义,如何定义 \ifcommand?

如果尚未定义,如何定义 \ifcommand?

为了处理多个文件的编译选项混乱问题,我使用了一些\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

但是,有一种情况是,当整个构造位于/分支内时,参数中的\ifSomethingafter可能会引起麻烦。那么诀窍是:\newif\if\else\csname

\makeatletter
\@ifundefined{ifSomething}{%
  \expandafter\newif\csname ifSomething\endcsname
  \Somethingtrue
}{}
\makeatother

答案2

etoolbox包包含\providebool

\documentclass{article}
\usepackage{etoolbox}

\newif\ifSomething

\providebool{Something}
\providebool{SomethingElse}

\begin{document}

\texttt{\meaning\Somethingtrue}

\texttt{\meaning\SomethingElsetrue}

\end{document}

在此处输入图片描述

相关内容