Передача аргументов командной строки в документ LaTeX
Иногда я определяю новые команды, например следующие.
\newcommand{\comment}[1]{\textbf{#1}}
%\necommand{\comment}[1]{\emph{#1}}
Вышеприведенные команды позволяют мне изменять стиль частей моего кода одновременно. Если я хочу сгенерировать оба возможных стиля, я должен скомпилировать свой документ LaTeX два раза каждый раз, изменяя исходный код, чтобы включить желаемый стиль.
Есть ли способ избежать модификации исходного кода в таких случаях? То есть, могу ли я передать латексу некоторые аргументы командной строки, чтобы я мог выбрать, какой стиль использовать на основе этого аргумента?
Ответы
Ответ 1
То есть, могу ли я передать латексу некоторые аргументы командной строки, чтобы я мог выбрать, какой стиль использовать на основе этого аргумента?
Да. Три варианта:
Один
В исходном файле напишите
\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
за вашей спиной.
Ответ 2
Вы должны использовать подходы Уилла, когда вам нужны довольно гибкие одноразовые варианты, например, скажем, изменить линию позиции в вашем резюме. Если вы используете один и тот же выбор параметров снова и снова, то вам следует избегать аргументов командной строки или работать в сборке script или makefile.
Я дам два метода для избежания аргументов командной строки:
Trick 1: Если вы создаете фиксированный массив документов, которые должны оставаться доступными, например, ваш пример с двумя стилями, то я бы рекомендовал просто реализовать код латекс Will внутри другого файла tex, т.е. thesis.tex содержит \providecommand\comment[1]{\emph{#1}}
и thesis-ugly.tex состоит из \newcommand\comment[1]{\textbf{#1}} \input thesis.tex
.
Вы должны, конечно, повторно использовать инструменты, такие как bibtex, при использовании этой техники, если вы не свяжете файлы-посредники, ala ln -s thesis.aux thesis-ugly.aux
и ln -s thesis.bbl thesis-ugly.bbl
.
Trick 2: я нашел трюк 1 неудобным для изменения документов, поэтому я написал следующий perl script, называемый просто paperize. Команда papersize A4 teaching.tex
изменяет learning.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; @[email protected];
$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
Очевидно, что вы можете работать с документами в сборке script или makefile или изменить приведенный выше файл script для файлов .dvi.. или обобщить script на другие модификации.
Ответ 3
Чтобы предоставить мою диссертацию как в требуемом, уродливом формате траты деревьев, так и в компактной более красивой версии, я использовал ifthen
a kludge make
и sed
, который переписал бит заголовка.
Я думаю, Подходит к, все приятнее.