2012-09-09 10 views
8

私はMakefileを使って.texファイルからPDFを生成しています。LaTeXリファレンスとメイクファイル

LaTeXファイルで参照が使用されたとき。時々私は、この参照の問題を修正することができ、再実行LaTeXのコマンドをコンパイルすることを知っているが、私のMakefileで、%.pdfのみこれだけで解決しない再makeを実行して、%.texに依存

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

のような何かを得ます問題(.texファイルでは何も変更されていません)。もう一度PDFを再生成するにはmake cleanを実行する必要があります。

は、ここに私のMakefile

TEX := $(wildcard *.tex) 
default: $(TEX:.tex=.pdf) 
%.pdf: %.tex 
    xelatex $< 
.PHONY: clean 
clean: 
    rm -v *.aux *.toc *.log *.out 

どのようにこの問題を解決するためには?ありがとうございました。

UPDATE:

ここで私は.PHONYなるには、Google

  1. 変更defaultターゲットから見つかったいくつかの考えです。これは非常に良い解決策ではありません(そこにラテックスファイルがあり、単一のファイルを再コンパイルする必要があるからです)
  2. %.pdfの依存関係に%.auxを含めるように変更してください。しかし、GNU makeで可能かどうかはわかりません。 (ファイルが存在する場合は%.auxに依存し、そうでない場合は%.auxの依存関係を無視してください)
  3. .logファイルにgrepを実行し、特定の警告を探します。存在する場合は、コンパイルコマンドを再実行してください。
+2

ほとんどの細かいTeXディストリビューションの一部である[latexmk](http://ctan.tug.org/pkg/latexmk)を見れば恩恵を受ける可能性があります。 –

答えて

1

"デフォルト"に偽のターゲットを追加する(.PHONYで始まる行に "default"を追加する)か、より複雑な依存関係構造を構築します。これは自動的に再実行されます)。私はすべての私のLaTeXで使用

+0

ありがとうございます。私は 'default'を' .PHONY'にするのは良い考えではないと思います。そこにはたくさんのtexファイルがあり、ただ一つの '.tex'ファイルを再コンパイルする必要があるからです。 – yegle

10

これは、必要に応じて何度でもにpdflatexを繰り返し、単純なルール

.DELETE_ON_ERROR: 

%.pdf %.aux %.idx: %.tex 
     pdflatex $< 
     while grep 'Rerun to get ' $*.log ; do pdflatex $< ; done 

をメイクファイル。再実行を呼び出すLaTeXのメッセージには、ログファイルに「Rerun to get」という一般的な文字列が含まれていることがわかりました。したがって、whileループでgrepを使用してその存在をテストできます。

".DELET_ON_ERROR:"設定は重要です。TeXがエラーで中断したときに、makeが次回呼び出し時にmakeを混乱させないように、pdf/aux/idxの残りのファイルを自動的に削除します。

私は、出力形式としてDVIではなくPDFを使用すると、私は

%.dvi %.aux %.idx: %.tex 
     latex $< 
     while grep 'Rerun to get ' $*.log ; do latex $< ; done 
     -killall -USR1 -r xdvi || true 

同等に使用し、最後の行は、インスタント目視検査のために、その入力ファイルをリロードするすべての実行中のxdviでの原因となります。

+0

すばらしい解決策!私は '-interaction nonstopmode'を最初の' 'pdflatex'に追加してエラーだけを終了させ、' -interaction batchmode'をwhileループのコマンドに追加して、再実行時にたくさんの出力が得られないようにします。 – Max