考虑一下这个MWE:
\documentclass[11pt]{book}
\def\entrytest{WORD}
\def\entrycurrent{NOWORD}
% \def\entrycurrent{WORD}
\ifx\entrytest\entrycurrent
\newif\ifsomething
\somethingfalse
\fi
\ifx\entrytest\entrycurrent
\ifsomething\typeout{Yes}\else\typeout{No}\fi
\fi
\begin{document}
\end{document}
在当前情况下,我本来期望它\ifsomething\typeout...
会受到\ifx
包装它的“保护”;但有些不对劲,因为代码暂停了:
...
No
! Extra \fi.
l.15 \fi
?
当然,如果\def\entrycurrent{WORD}
所有的\ifx
s 都在“真实”分支中运行,那么一切都会按预期工作。
那么我应该如何处理\newif
可能本身就有条件定义的 s 的使用呢?
答案1
在第二个中\ifx\entrytest\entrycurrent
,\ifsomething
未定义,因此第一的 \fi
匹配\ifx
,第二个\fi
不合适。
宏名称并不能使某事成为条件,而是一个标记定义并且相当于原始条件计数之一。
什么\newif\ifsomething
是
\let\ifsomething\iffalse
\def\somethingtrue{\let\ifsomething\iftrue}
\def\somethingfalse{\let\ifsomething\iffalse}
你可能想要类似的东西
\newif\ifsomething
\somethingtrue
\ifx\entrytest\entrycurrent
\somethingfalse
\fi
\ifx\entrytest\entrycurrent
\ifsomething\typeout{Yes}\else\typeout{No}\fi
\fi
但一开始就不清楚你为什么要这样做。