53 votes

Passage d'arguments de ligne de commande au document LaTeX

Parfois, je définir de nouvelles commandes telles que les suivantes.

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

Les commandes ci-dessus me permettent de changer le style des parties de mon code tout à la fois. Si je veux générer à la fois des styles possibles, j'ai compiler mon document LaTeX deux fois à chaque fois modifier le code source pour activer le style désiré.

Est-il un moyen pour éviter de modifier le code source dans de tels cas? C'est, puis-je passer en latex certains arguments de ligne de commande afin que je puisse choisir le style à utiliser en se basant sur cet argument?

75voto

Will Robertson Points 19581

C'est, puis-je passer en latex certains arguments de ligne de commande afin que je puisse choisir le style à utiliser en se basant sur cet argument?

Oui. Trois options:

Un

Dans votre fichier source, écrire

\providecommand{\comment}[1]{\emph{#1}}% fallback definition

et puis compiler le document LaTeX ("monfichier.tex") comme

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

Deux

Sinon,

pdflatex "\let\ifmyflag\iftrue\input{myfile}"

et puis ont dans la source

\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

Trois

Ou même

pdflatex "\def\myflag{}\input{myfile}"

avec

\ifdefined\myflag
  \newcommand\comment[1]{\emph{#1}}
\else
  \newcommand\comment[1]{\textbf{#1}}
\fi

ce qui est sans doute le plus court, quoique légèrement fragile parce que vous ne savez jamais quand un paquet peut définir \myflag derrière votre dos.

5voto

Jeff Burdges Points 1973

Vous devriez utiliser de la Volonté des approches lorsque vous avez besoin d'assez flexible pour un hors options, comme par exemple la modification de la position de la ligne sur votre cv. Si otoh, que vous êtes la production de la même sélection d'options et plus, alors vous devriez envisager d'éviter les arguments de ligne de commande, ou de travailler dans un script de build ou makefile.

Je vais vous donner deux techniques pour éviter arguments de ligne de commande :

Astuce 1: Si vous êtes à la production d'un tableau fixe de documents qui doivent rester accessibles, comme vos deux styles d'exemple, alors je vous recommande tout simplement de la mise en œuvre de la Volonté du code latex à l'intérieur d'un autre fichier tex, c'est à dire de la thèse.tex contient un \providecommand\comment[1]{\emph{#1}} thèse et-vilaine.tex se compose d' \newcommand\comment[1]{\textbf{#1}} \input thesis.tex.

Vous devez bien sûr réexécuter des outils comme bibtex lors de l'utilisation de cette technique, à moins que vous symlink l'intermédiaire de fichiers, ala ln -s thesis.aux thesis-ugly.aux et ln -s thesis.bbl thesis-ugly.bbl.

Astuce 2: j'ai trouvé le truc de 1 gênant pour changer de document papersizes, donc j'ai écrit le script perl suivant, appelé simplement la taille de papier. La commande papersize A4 teaching.tex modifie l'enseignement.tex en place, et des liens symboliques de l'enseignement.pdf à l'enseignement-A4.pdf, de sorte que l'exécution pdflatex teaching crée de l'enseignement-A4.pdf, mais ne perturbe pas le pré-existante de l'enseignement des lettres.pdf et ne nécessite pas de réexécuter bibtex teaching. Il n'a évidemment besoin d'une reprise de pdflatex deux fois pour les documents avec des références internes.

#!/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 $_);
} }
}

Vous devez ajouter les commentaires spéciaux % paper size :: ... pour chaque ligne du fichier doit être modifié lorsque vous modifiez le format de papier.

\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

Vous pourriez évidemment de travail de papier dans un script de build ou makefile trop ou de modifier le script ci-dessus pour .les fichiers dvi.. ou de généraliser le script à d'autres modifications.

-1voto

dmckee Points 50318

Pour présenter ma thèse à la fois dans le format requis et déplaisant, ainsi que dans une version plus jolie et compacte, j’ai utilisé ifthen et un kludge de make et sed réécrit un peu l'en-tête.

Je pense que les approches de Will sont toutes plus agréables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X