Подтвердить что ты не робот

Передача аргументов командной строки в документ LaTeX

Иногда я определяю новые команды, например следующие.

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

Вышеприведенные команды позволяют мне изменять стиль частей моего кода одновременно. Если я хочу сгенерировать оба возможных стиля, я должен скомпилировать свой документ LaTeX два раза каждый раз, изменяя исходный код, чтобы включить желаемый стиль.

Есть ли способ избежать модификации исходного кода в таких случаях? То есть, могу ли я передать латексу некоторые аргументы командной строки, чтобы я мог выбрать, какой стиль использовать на основе этого аргумента?

4b9b3361

Ответ 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, который переписал бит заголовка.

Я думаю, Подходит к, все приятнее.