web-dev-qa-db-ja.com

LaTeXドキュメントにコマンドライン引数を渡す

時々、私は次のような新しいコマンドを定義します。

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

上記のコマンドを使用すると、コードの一部のスタイルを一度に変更できます。可能な両方のスタイルを生成したい場合は、ソースコードを変更するたびにLaTeXドキュメントを2回コンパイルして、目的のスタイルを有効にする必要があります。

そのような場合にソースコードの変更を回避する方法はありますか?つまり、latexにコマンドライン引数を渡して、その引数に基づいて使用するスタイルを選択できるようにできますか?

43
reprogrammer

つまり、latexにコマンドライン引数を渡して、その引数に基づいて使用するスタイルを選択できるようにできますか?

はい。 3つのオプション:

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 あなたの後ろに。

62
Will Robertson

履歴書でポジションラインを変更するなど、かなり柔軟な1回限りのオプションが必要な場合は、ウィルのアプローチを使用する必要があります。同じオプションの選択肢を繰り返し作成している場合は、コマンドライン引数を回避するか、それらをビルドスクリプトまたはメイクファイルに組み込むことを検討する必要があります。

コマンドライン引数を回避するための2つのテクニックを紹介します。

トリック1: 2つのスタイルの例のように、アクセス可能な状態を維持する必要があるドキュメントの固定配列を作成する場合は、Willのラテックスコードを別のtexファイル、つまりthesis.tex内に実装することをお勧めします。 \providecommand\comment[1]{\emph{#1}}が含まれており、thesis-ugly.texは\newcommand\comment[1]{\textbf{#1}} \input thesis.texで構成されています。

もちろん、中間ファイルala ln -s thesis.aux thesis-ugly.auxおよびln -s thesis.bbl thesis-ugly.bblをシンボリックリンクしない限り、この手法を使用するときは、bibtexなどのツールを再実行する必要があります。

トリック2:ドキュメントの用紙サイズを変更するのに厄介なトリック1を見つけたので、単にpapersizeと呼ばれる次のPerlスクリプトを書きました。コマンドpapersize A4 teaching.texは、teaching.texを適切に変更し、teaching.pdfをteaching-A4.pdfにシンボリックリンクします。これにより、pdflatex teachingを実行すると、teaching-A4.pdfが作成されますが、既存のティーチングは妨げられません。 -letter.pdf。bibtex teachingを再実行する必要はありません。内部参照のあるドキュメントに対してpdflatexを2回再実行する必要があることは明らかです。

#!/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

明らかに、サイズをビルドスクリプトやメイクファイルに組み込んだり、上記の.dviファイル用のスクリプトを変更したり、スクリプトを他の変更に一般化したりすることもできます。

5
Jeff Burdges

必要な、醜い、ツリーを無駄にするフォーマットとコンパクトできれいなバージョンの両方で論文を提供するために、私はifthenmakesedを使用して少し書き直しましたヘッダーの。

ウィルのアプローチallの方がいいと思います。