如果尚未定义,我想创建一个条件。以下是我失败的尝试。
%%% 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}