53

有时,我会定义如下的新命令。

\newcommand{\comment}[1]{\textbf{#1}}
%\necommand{\comment}[1]{\emph{#1}} 

上述命令使我能够一次更改部分代码的样式。如果我想生成两种可能的样式,我必须编译我的 LaTeX 文档两次,每次修改源代码以启用所需的样式。

有没有办法避免在这种情况下修改源代码?也就是说,我可以传递 latex 一些命令行参数,以便我可以根据该参数选择要使用的样式吗?

4

4 回答 4

74

也就是说,我可以传递 latex 一些命令行参数,以便我可以根据该参数选择要使用的样式吗?

是的。三个选项:

在你的源文件中,写

\providecommand{\comment}[1]{\emph{#1}}% fallback definition

然后将 LaTeX 文档(“myfile.tex”)编译为

pdflatex (whatever options you need) "\newcommand\comment[1]{\textbf{#1}}\input{myfile}"

或者,

pdflatex "\let\ifmyflag\iftrue\input{myfile}"

然后在源代码中

\ifcsname ifmyflag\endcsname\else
  \expandafter\let\csname ifmyflag\expandafter\endcsname
                  \csname iffalse\endcsname
\fi
...
\ifmyflag
  \newcommand\comment[1]{\emph{#1}}
\else
  \newcommand\comment[1]{\textbf{#1}}
\fi

甚至

pdflatex "\def\myflag{}\input{myfile}"

\ifdefined\myflag
  \newcommand\comment[1]{\emph{#1}}
\else
  \newcommand\comment[1]{\textbf{#1}}
\fi

这可能是最短的,虽然有点脆弱,因为你永远不知道一个包裹什么时候会\myflag在你的背后定义。

于 2009-09-23T15:07:14.007 回答
5

当您需要相当灵活的一次性选项时,您应该使用 Will 的方法,例如更改简历上的职位线。如果 otoh 您一遍又一遍地生成相同的选项选择,那么您应该考虑避免使用命令行参数,或者将它们放入构建脚本或 makefile 中。

我将给出两种避免命令行参数的技术:

技巧1: 如果您要生成必须保持可访问性的固定文档数组,例如您的两种样式示例,那么我建议您在另一个tex 文件中简单地实现Will 的乳胶代码,即thesis.tex 包含a\providecommand\comment[1]{\emph{#1}}和thesis-ugly。 tex 由\newcommand\comment[1]{\textbf{#1}} \input thesis.tex.

使用此技术时,您当然必须重新运行 bibtex 等工具,除非您符号链接中间文件 alaln -s thesis.aux thesis-ugly.auxln -s thesis.bbl thesis-ugly.bbl.

技巧 2: 我发现技巧 1 在更改文档纸张大小时很尴尬,所以我编写了以下 perl 脚本,简称为纸张大小。该命令papersize A4 teaching.tex在原地修改 Teaching.tex,并将 Teaching.pdf 符号链接到 Teaching-A4.pdf,以便运行pdflatex teaching创建 Teaching-A4.pdf,但不会干扰预先存在的 Teaching-letter.pdf 并且不需要重新运行bibtex teaching。对于具有内部引用的文档,显然需要重新运行 pdflatex 两次。

#!/usr/bin/perl -i~ -n

BEGIN {
die "Usage: papersize letter/A4/etc. [filename]\n" if ($#ARGV < 0);
$SIZE = shift @ARGV;  @files=@ARGV;
$FLAG = "% paper size :: ";
}

if (/$FLAG(\w+)/) {
    if ($1 eq $SIZE) {
        s/^\% //;
    } else {
        s/^([^\%])/\% \1/;
    }
}
print $_;

END {
foreach (@files) {
    if (s/\.tex//) {
    $l = "$_-$SIZE.pdf";  $_ .= ".pdf";
    unlink($_) if (-l $_);
    symlink($l,$_) if (! -e $_);
} }
}

更改纸张大小时,必须将特殊注释添加% paper size :: ...到应更改的每个文件行。

\documentclass[letterpaper,11pt]{article}  % paper size :: letter
% \documentclass[a4paper,11pt]{article}  % paper size :: A4
\usepackage[text={6.5in,8.8in}]{geometry}  % paper size :: letter
% \usepackage[text={16.4cm,24.5cm}]{geometry}  % paper size :: A4

您显然也可以将 papersize 工作到构建脚本或 makefile 中,或者为 .dvi 文件修改上述脚本..或将脚本推广到其他修改。

于 2011-08-13T12:40:14.227 回答
1

对于所讨论的情况,这可能不是最佳解决方案(也是一个非常古老的帖子),但我想我会提出一个对我有用的替代解决方案。它只是在两个不同的文件中定义这两个命令,将第三个文件链接到所需的选项,然后 \input 第三个文件。例如,定义:

% in main.tex
\input{options}
% ...

.

% in option1.tex
\newcommand{\comment}[1]{\textbf{#1}}

.

% in option2.tex
\newcommand{\comment}[1]{\emph{#1}} 

然后使用 option1 进行编译,只需运行:

> ln -s option1.tex options.tex && pdflatex main.tex

我更喜欢这个,因为我对 bash 比晦涩的乳胶更舒服,文件的扩散没有问题(这些可以很容易地组织在子目录中),并且无论如何都有脚本编译我的文档,所以这个额外的步骤成本很低。

于 2021-10-05T20:10:48.190 回答
-1

为了提供我的论文所需的、丑陋的、浪费树的格式和一个紧凑的更漂亮的版本,我使用ifthen了一个 kludgemakesed重写了一些标题。

我认为威尔的方法更好

于 2009-09-23T18:26:51.657 回答