仅包括与条件表达式对应的文档部分

仅包括与条件表达式对应的文档部分

假设我有一个 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

相关内容