将命令行参数传递给LaTeX文档

rep*_*mer 41 latex tex

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

\newcommand{\comment}[1]{\textbf{#1}}
%\necommand{\comment}[1]{\emph{#1}} 
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*son 60

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

是.三种选择:

在你的源文件中,写

\providecommand{\comment}[1]{\emph{#1}}% fallback definition
Run Code Online (Sandbox Code Playgroud)

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

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

或者,

pdflatex "\let\ifmyflag\iftrue\input{myfile}"
Run Code Online (Sandbox Code Playgroud)

然后在源头

\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
Run Code Online (Sandbox Code Playgroud)

甚至

pdflatex "\def\myflag{}\input{myfile}"
Run Code Online (Sandbox Code Playgroud)

\ifdefined\myflag
  \newcommand\comment[1]{\emph{#1}}
\else
  \newcommand\comment[1]{\textbf{#1}}
\fi
Run Code Online (Sandbox Code Playgroud)

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

  • 使用 Latexmk 可以这样工作:`latexmk -pdf -pdflatex='pdflatex -interaction=nonstopmode -shell-escape "\newcommand{\pdfTitle}{MyTitle}\include{filename}"' filename.tex`。另请参阅:[将参数传递到文档](https://tex.stackexchange.com/questions/1492/passing-parameters-to-a-document) (3认同)

Jef*_*ges 5

当您需要相当灵活的一次性选项时,您应该使用Will的方法,例如更改简历上的位置线.如果你正在反复生成相同的选项,那么你应该考虑避免命令行参数,或者将它们用于构建脚本或makefile.

我将提供两种避免命令行参数的技巧:

技巧1: 如果你正在制作一个必须保持可访问的固定数组文档,比如你的两个样式示例,那么我建议只在其他tex文件中实现Will的乳胶代码,即thesis.tex包含一个\providecommand\comment[1]{\emph{#1}}和论文丑陋. tex包括\newcommand\comment[1]{\textbf{#1}} \input thesis.tex.

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

技巧2: 我发现改变文档文件的技巧1很尴尬,所以我编写了以下perl脚本,简称为papersize.该命令papersize A4 teaching.tex修改了teaching.tex,将symlinks teaching.pdf修改为教学A4.pdf,这样运行pdflatex teaching创建了教学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 $_);
} }
}
Run Code Online (Sandbox Code Playgroud)

您必须将特殊注释添加% 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
Run Code Online (Sandbox Code Playgroud)

您显然可以将paperize工作到构建脚本或makefile中,或者修改.dvi文件的上述脚本..或者将脚本概括为其他修改.