将命令行parameter passing给LaTeX文档

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

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

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

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

也就是说,我可以传递乳胶一些命令行参数,以便我可以根据该参数select使用哪种样式?

是。 三个选项:

在你的源文件中,写

 \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

当你需要相当灵活的一次性select时,你应该使用威尔的方法,比如说改变简历上的职位。 如果你一直在生成相同的选项选项,那么你应该考虑避免命令行参数,或者将它们join到构build脚本或者makefile中。

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

诀窍1:如果你生产的文件必须保持可访问的固定数组,比如你的两个样式的例子,那么我build议在另一个tex文件里面实现Will的latex代码,即thesis.tex包含一个\providecommand\comment[1]{\emph{#1}} providecommand \providecommand\comment[1]{\emph{#1}}和thesis-ugly.tex包含\newcommand\comment[1]{\textbf{#1}} \input thesis.tex

在使用这种技术的时候,你当然必须重新运行像bibtex这样的工具,除非你把中间文件,ala ln -s thesis.aux thesis-ugly.auxln -s thesis.bbl thesis-ugly.bbl符号链接ln -s thesis.bbl thesis-ugly.bbl

窍门2:我发现伎俩1改变文件纸张尴尬,所以我写了下面的perl脚本,简称纸张大小。 命令将papersize A4 teaching.tex修改为tutorial.tex,并将teaching.pdf符号链接到teaching-A4.pdf,这样运行pdflatex teaching创build教学-A4.pdf,但不会打扰已有的教学信。 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 

你可以明显地将文件大小写入一个构build脚本或makefile中,或者修改.dvi文件的上述脚本。或者将脚本概括为其他修改。

为了给我的论文提供所需的,丑陋的,枯树的格式,以及一个紧凑漂亮的版本,我使用了一个makesed的kludge,重写了一些标题。

我认为威尔的方法更好。