假设我有一个 LaTeX 文档,它使用条件。即。
\ifdefined\submit
[....]
\else
[....]
\fi
因此,如果我们定义了
\def\submit{}
然后解析条件的第一部分(或任何正确的术语),否则解析第二部分。
TeX 中是否有某种方法可以对文档进行后处理,以删除所有条件,并且仅包含与已定义部分相对应的部分\ifdefined\submit
和\submit
未定义部分?这不是什么大问题,但很好奇这样的事情是否可能。
答案1
我认为这在技术上是可行的:TeX 可以扫描每一行并将其丢弃或将其写入新文件。它还可以检查每行上的第一个标记以查看是否是,\ifsubmit
或者\ifdon'tsubmit
在两种行为之间切换。beamer
该类针对脆弱的帧执行类似操作。
但实际上,正如 egreg 在评论中所说,我会通过 Perl 脚本来执行此操作。此外,我会以一种方式执行此操作,这样 Perl 就不必费心处理 TeX。所以我的 TeX 文件看起来会像这样:
%%% Version: submit
\ifsubmit
...
%%% Version: other
\else
...
%%% Version: all
\fi
脚本如下:
#! /usr/bin/perl -w
my $print = 1;
my $otype = (@ARGV ? shift @ARGV : "all");
while (<>) {
if ($otype eq "all") {
print;
next;
}
if (/^%%% Version: (\w*)/) {
my $type = $1;
if (($type eq $otype) || ($type eq "all")) {
$print = 1;
} else {
$print = 0;
}
<>;
} else {
if ($print) {
print;
}
}
}
如果您更喜欢以下形式的语法:
\ifsubmit %%% Version: submitted
然后把线拿出来<>;
。
答案2
看看标记包裹。
以下是一个小例子:
\usepackage{tagging}
[...]
\usetag{sunny}
\droptag{rainy} % (Not needed, default - just for illustration)
[...]
\iftagged{sunny}{%
The sun will shine today
}{%
There will be no sunshine at present
}
\untagged{rainy,sunny}{%
There will be no weather today
}
答案3
如果您只想在两个值之间切换,则只需使用\iftrue
。将其更改为\iffalse
将切换到\else
部分。
\iftrue
%\iffalse
.... done for \iftrue
\else
... done for \iffalse
\fi