53

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

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

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

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

4

4 に答える 4

74

つまり、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これはおそらく最短ですが、パッケージが背後でいつ定義されるかわからないため、少し壊れやすいです。

于 2009-09-23T15:07:14.007 に答える
5

履歴書の位置線を変更するなど、かなり柔軟な1回限りのオプションが必要な場合は、ウィルのアプローチを使用する必要があります。同じオプションの選択肢を何度も作成している場合は、コマンドライン引数を避けるか、ビルドスクリプトまたはmakefileに組み込むことを検討する必要があります。

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

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

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

トリック2: ドキュメントの用紙サイズを変更するのが難しいトリック1を見つけたので、単に用紙サイズと呼ばれる次のperlスクリプトを作成しました。このコマンドpapersize A4 teaching.texは、teaching.texをインプレースで変更し、teaching.pdfをteaching-A4.pdfにシンボリックリンクして、実行するとpdflatex teachingteaching-A4.pdfが作成されますが、既存のteaching-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

明らかに、用紙サイズをビルドスクリプトまたはmakefileに組み込むか、上記のスクリプトを.dviファイル用に変更するか、スクリプトを他の変更に一般化することができます。

于 2011-08-13T12:40:14.227 に答える
1

これは問題の状況(これも非常に古い投稿)に最適な解決策ではないかもしれませんが、私にとって有用な代替解決策を提示すると思いました。2つの異なるファイルで2つのコマンドを定義し、3番目のファイルを目的のファイルにリンクして、その3番目のファイルを\inputするだけです。たとえば、次のように定義します。

% in main.tex
\input{options}
% ...

% in option1.tex
\newcommand{\comment}[1]{\textbf{#1}}

% in option2.tex
\newcommand{\comment}[1]{\emph{#1}} 

次に、option1でコンパイルするには、次のコマンドを実行します。

> ln -s option1.tex options.tex && pdflatex main.tex

私はこれを好みます。なぜなら、私はあいまいなラテックスよりもbashに慣れていて、ファイルの急増に問題がなく(これらはサブディレクトリに簡単に整理できます)、スクリプトでドキュメントをコンパイルできるので、この追加の手順はほとんどコストがかかりません。

于 2021-10-05T20:10:48.190 に答える
-1

必要な、醜い、ツリーを無駄にする形式とコンパクトできれいなバージョンの両方で論文を提供するために、私はifthenのクラッジmakeを使用しsed、ヘッダーの一部を書き直しました。

ウィルのアプローチすべて良いと思います。

于 2009-09-23T18:26:51.657 に答える