有时,我会定义如下的新命令。
\newcommand{\comment}[1]{\textbf{#1}}
%\necommand{\comment}[1]{\emph{#1}}
上述命令使我能够一次更改部分代码的样式。如果我想生成两种可能的样式,我必须编译我的 LaTeX 文档两次,每次修改源代码以启用所需的样式。
有没有办法避免在这种情况下修改源代码?也就是说,我可以传递 latex 一些命令行参数,以便我可以根据该参数选择要使用的样式吗?
也就是说,我可以传递 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
在你的背后定义。
当您需要相当灵活的一次性选项时,您应该使用 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.aux
和ln -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 文件修改上述脚本..或将脚本推广到其他修改。
对于所讨论的情况,这可能不是最佳解决方案(也是一个非常古老的帖子),但我想我会提出一个对我有用的替代解决方案。它只是在两个不同的文件中定义这两个命令,将第三个文件链接到所需的选项,然后 \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 比晦涩的乳胶更舒服,文件的扩散没有问题(这些可以很容易地组织在子目录中),并且无论如何都有脚本编译我的文档,所以这个额外的步骤成本很低。
为了提供我的论文所需的、丑陋的、浪费树的格式和一个紧凑的更漂亮的版本,我使用ifthen
了一个 kludgemake
并sed
重写了一些标题。
我认为威尔的方法都更好。