有时,我会定义新的命令,如下所示。
\newcommand{\comment}[1]{\textbf{#1}}
%\necommand{\comment}[1]{\emph{#1}}
以上命令使我能够一次性更改代码部分的样式。如果我想生成两种可能的样式,每次修改源代码以启用所需的样式时,我必须编译两次LaTeX文档。
在这种情况下,有没有办法避免源代码修改?也就是说,我可以传递一些命令行参数,以便我可以根据该参数选择要使用的样式吗?
答案 0 :(得分:56)
也就是说,我可以将一些命令行参数传递给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
。
答案 1 :(得分:5)
当您需要相当灵活的一次性选项时,您应该使用Will的方法,例如更改简历上的位置线。如果otoh你正在制作相同的选项而不是&然后你应该考虑避免使用命令行参数,或者将它们用于构建脚本或makefile。
我将提供两种避免命令行参数的技巧:
技巧1:如果您正在制作一个必须保持可访问的固定文档数组,就像您的两个样式示例一样,那么我建议您只在其他tex文件中实现Will的乳胶代码,即thesis.tex包含\providecommand\comment[1]{\emph{#1}}
和论文-ugly.tex由\newcommand\comment[1]{\textbf{#1}} \input thesis.tex
组成。
除非您对中间文件#la ln -s thesis.aux thesis-ugly.aux
和ln -s thesis.bbl thesis-ugly.bbl
进行符号链接,否则您必须在使用此技术时重新运行bibtex等工具。
技巧2:我发现改变文档文件化的技巧1很尴尬,所以我写了下面的perl脚本,简称为papersize。命令papersize A4 teaching.tex
修改了teaching.tex,将symlinks teaching.pdf修改为教学A4.pdf,以便运行pdflatex teaching
创建教学A4.pdf,但不会干扰已有的教学-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
你显然可以将paperise工作到构建脚本或makefile中,或者修改.dvi文件的上述脚本..或者将脚本概括为其他修改。
答案 2 :(得分:0)
为了提供我所需要的,丑陋的,树浪费的格式以及更紧凑的更漂亮版本的论文,我使用了ifthen
和make
和sed
的重写,重写了一下标题。
我认为Will's approaches 所有更好。