不能在条件语句内使用 \newif

不能在条件语句内使用 \newif

如果尚未定义,我想创建一个条件。以下是我失败的尝试。

%%% in file A
\documentclass{article}

\newif\ifdraft\drafttrue
\def\OptionLoaded{}

%%% in file B
\ifx \OptionLoaded \undefined
  \newif\ifdraft\draftfalse
\fi

\begin{document}
hello
\end{document}

Incomplete \ifx当我编译示例代码时出现错误。

答案1

如果你使用 LaTeX 测试,他们会小心地从 tex 原始条件中提取出真假分支:

%%% in file A
\documentclass{article}

\newif\ifdraft\drafttrue
\def\OptionLoaded{}

%%% in file B
\makeatletter
\@ifundefined{OptionLoaded}{\newif\ifdraft\draftfalse}{}
\makeatother

\begin{document}
hello
\end{document}

您的版本失败了,因为当定义条件时,\ifx测试为假,因此

\ifx \OptionLoaded \undefined
  \newif\ifdraft\draftfalse
\fi

Tex 尝试跳过\newif\ifdraft\draftfalse而不评估任何内容,因此它\newif只是一个惰性标记,但是当跳过时它确实匹配\if标记,因此会看到\ifdraft和 ,\fi但它继续跳过,期望另一个\fi来关闭\ifx

答案2

正如解释的那样大卫·卡莱尔,当 TeX 读取 时\newif\ifdraft\draftfalse,它会忽略\newif并认为\ifdraft是条件语句的开头。因此另一个解决方法是用\ifdraft替换\csname ifdraft\endcsname

%%% in file A
\documentclass{article}

\newif\ifdraft\drafttrue
\def\OptionLoaded{}

%%% in file B
\ifx \OptionLoaded \undefined
  \expandafter\newif\csname ifdraft\endcsname\draftfalse
\fi

\begin{document}
\ifdraft
  hello
\else
  world
\fi
\end{document}

相关内容