使用宏有条件地显示/隐藏文档的某些部分

使用宏有条件地显示/隐藏文档的某些部分

我目前正在使用以下方法有条件地显示/隐藏文档的某些部分:

% PREAMBLE

\def\MyVersion{1}

% BODY

\ifnum\MyVersion=1
This is version one.
% possibly other paragraphs, math blocks, tables, figures, etc
\fi

\ifnum\MyVersion=2
This is version two.
% possibly other paragraphs, math blocks, tables, figures, etc
\fi

为了稍微整理一下,我尝试为序言中的\ifnum和语句定义宏:\fi

\def\StartVersionOne{\ifnum\MyVersion=1}
\def\StopVersionOne{\fi}
\def\StartVersionTwo{\ifnum\MyVersion=2}
\def\StopVersionTwo{\fi}

但是,这会产生以下错误:

! Incomplete \ifnum; all text was ignored after line ...

奇怪的是,如果我只使用宏\StartXXX而不是\StopXXX宏,一切都会正常工作。有人能解释一下发生了什么吗?我是否错误地定义了宏\fi

答案1

这不起作用,因为\StopVersionOne当 位于路径中时,它从不扩展,因此TeX 永远不会看到\else包含。在路径内部,TeX 会跳过而不扩展宏,直到找到与 相同的宏,例如它本身或与 相同的宏。但是,其他包含和它们的结束也计算在内。\fifalse\fi\fi\let\if...\fi

为了使其工作,您需要将\let这些宏分别更改为\iffalse/\iftrue\fi,例如每次您将相应的宏更改\MyVersion\let\iftrue将所有其他宏更改为\iffalse。所有\Stop...宏都更改\let为 `\fi。

\if..然而,如果您的文本包含 unmatch / \fis,这仍然不起作用。

另一种方法是使用comments包逐字跳过所有内容以避免这些问题。

答案2

代替

\def\StopVersionOne{\fi}

\let\StopVersionOne=\fi

那么它应该可以工作。解释:TeX 会提前扫描以找到\fi与 匹配的\ifnum,但它会扫描无需扩大如果测试结果为假,那么就\def找不到\fi

如果你正在使用嵌套条件,请阅读马丁的回答(以及对我的回答的评论)。

答案3

如果你计算版本 1,2,3,.. 那么使用\ifcase

\documentclass{minimal}
\def\MyVersion{1}
\begin{document}

\ifcase\MyVersion\or
This is version one.
% possibly other paragraphs, math blocks, tables, figures, etc
\or
This is version two.
% possibly other paragraphs, math blocks, tables, figures, etc
\fi

\end{document}

相关内容