在 verbatim 环境中,如何显示我声明为‘\ifcondition’的‘if’语句?

在 verbatim 环境中,如何显示我声明为‘\ifcondition’的‘if’语句?

我已经声明了几个以下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不与任何东西匹配,从而引发错误。

解决方案是在逐字后添加两个\fis,这样它们就不会执行任何操作。一种可能性是{\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}

相关内容