我目前正在使用以下方法有条件地显示/隐藏文档的某些部分:
% 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 会跳过而不扩展宏,直到找到与 相同的宏,例如它本身或与 相同的宏。但是,其他包含和它们的结束也计算在内。\fi
false
\fi
\fi
\let
\if...
\fi
为了使其工作,您需要将\let
这些宏分别更改为\iffalse
/\iftrue
和\fi
,例如每次您将相应的宏更改\MyVersion
为\let
,\iftrue
将所有其他宏更改为\iffalse
。所有\Stop...
宏都更改\let
为 `\fi。
\if..
然而,如果您的文本包含 unmatch / \fi
s,这仍然不起作用。
另一种方法是使用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}