我已经声明了几个以下if
形式的命令
\newif\iffinal
\newif\ifsolutions
现在我想在同一个文档中写一下!所以我想写一些类似的东西
\iffinal
(...)
\begin{verbatim}
\iffinal
\ifsolutions
\end{verbatim}
(...)
\fi
显示命令的语法,但我一直收到以下错误
! Incomplete \iffalse; all text was ignored after line [NUMBER]
每当我将逐字环境包含在注释掉的条件范围内时
%\iffinal
如果条件没有被注释掉:
\iffinal
verbatim 环境运行良好。
line [NUMBER]
是我最后使用声明条件之一的地方if
。
答案1
当 TeX 遇到一个\if
且测试为假时,它会开始寻找匹配项\fi
,而不会扩展其间的任何内容并忽略任何括号(因为扩展可能会产生副作用)。来自 TeX by Topic ( texdoc texbytopic
):
\if... ... \fi
测试结果为假。测试结束后,TeX 将开始跳过不扩展的材料,不计算括号,但平衡嵌套条件,直到\fi
遇到标记。如果\fi
未找到,则会在文件末尾显示错误消息:
Incomplete \if...; all text was ignored after line ...
其中所示的行号是 TEX 开始跳过的行号,也就是发生条件的行号。
因此,在您的例子中,TeX 遇到\iffinal
并开始寻找匹配的\fi
。由于\begin{verbatim}
未展开,其 catcode 技巧永远不会被应用,因此 TeX\if
在 verbatim 环境中看到两个 。它将\ifsolutions
和匹配\fi
,而其他两个\if
不与任何东西匹配,从而引发错误。
解决方案是在逐字后添加两个\fi
s,这样它们就不会执行任何操作。一种可能性是{\def\foo{\fi\fi}}
(括号在那里,以便立即恢复分配):
\documentclass{article}
\newif\iffinal
\newif\ifsolutions
\finaltrue
\begin{document}
\iffinal
(...)
\begin{verbatim}
\iffinal
\ifsolutions
\end{verbatim}
{\def\foo{\fi\fi}}
(...)
\fi
\end{document}
当然还有其他方法可以达到同样的目的。例如发明一个新的注释字符:
{\catcode`@=14
@\fi\fi
}
答案2
避免这些问题的一个解决方案是不对此类代码使用 if 开关。该comment
包允许您定义透明的环境或忽略其内容(如注释)(即逐字跳过内容)。这样,这些环境就不会与逐字代码中的 if 开关发生冲突。
\documentclass{article}
\usepackage{comment}
%\includecomment{final}% instead of \finaltrue (or triggered by \iffinal)
\excludecomment{final}% instead of \finalfalse (or triggered by \iffinal\else)
\begin{document}
% ...
\begin{final}
(...)
\begin{verbatim}
\iffinal
\ifsolutions
\end{verbatim}
(...)
\end{final}
% ...
\end{document}