2012-09-09 11 views
8

Używam Makefile do generowania plików PDF z plików .tex.Dokumentacja LaTeX i plik Makefile

Kiedy w moich plikach LaTeX użyto odniesień. czasami mam coś

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

wiem, że ponownie uruchomić LaTeX skompilować polecenie może rozwiązać ten problem odniesienia, ale w moim Makefile, %.pdf zależy tylko od %.tex, więc wystarczy uruchomić make znowu nie naprawić problem (nic się nie zmieniło w pliku .tex). Muszę wykonać make clean, aby ponownie wygenerować plik PDF.

Oto mój Makefile

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

Jak rozwiązać ten problem? Dziękuję Ci.

UPDATE:

Oto namyśle znalazłem Google

  1. Zmienić default cel być .PHONY. Które nie jest bardzo dobrym rozwiązaniem (ponieważ jest tam plik latex i muszę tylko ponownie skompilować pojedynczy plik)
  2. Zmień zależność %.pdf na %.aux. Ale nie wiem, czy jest to możliwe w wersji GNU? (zależy od pliku %.aux, jeśli istnieje, w przeciwnym razie należy zignorować zależność od %.aux)
  3. Zrób plik grep do pliku .log i odszukaj konkretne ostrzeżenie. Jeśli istnieje, uruchom ponownie polecenie kompilacji.
+2

Możesz odnieść korzyść patrząc na [latexmk] (http://ctan.tug.org/pkg/latexmk), który jest częścią najdoskonalszych dystrybucji TeX-a. –

Odpowiedz

1

Zrób "domyślny" fałszywy cel (dodaj "domyślny" do linii zaczynającej się od .PHONY) lub zbuduj bardziej złożoną strukturę zależności, która automatycznie się powtórzy (nie umiem powiedzieć, jak to zrobić, przepraszam).

+0

Dziękuję za odpowiedź. Nie sądzę, żeby "default" było '.PHONY' jest dobrym pomysłem, ponieważ istnieje tam wiele plików tex i po prostu potrzebuję ponownie skompilować pojedynczy plik' .tex'. – yegle

10

używam w całym moim LaTeX makefile prostą zasadą

.DELETE_ON_ERROR: 

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

ten powtarza pdflatex tak często, jak to konieczne. Zauważyłem, że wszystkie różne komunikaty LaTeX, które wzywają do ponownego uruchomienia, zawierają wspólny plik "Rerun to get" w pliku dziennika, więc możesz po prostu sprawdzić jego obecność za pomocą grep w pętli while.

Ustawienie ".DELETE_ON_ERROR:" jest ważne: gwarantuje, że automatycznie usuwa wszelkie niekompletne pliki pdf/aux/idx, gdy TeX przerywa z błędem, tak że nie mogą mylić make przy następnym wywołaniu.

Gdy używam DVI zamiast PDF jako format wyjściowy, używam równoważnie

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

Ostatnia linia powoduje żadnego z systemem xdvi przeładować swój plik wejściowy, do natychmiastowej kontroli wzrokowej.

+0

Świetne rozwiązanie!Lubię dodawać '-interaction nonstopmode' do pierwszego' pdflatex' tak, że po prostu wychodzi z błędami, i dodaje '-interaction batchmode' do polecenia w pętli while, tak, że nie dostaniesz ton wyjściowych, gdy jest właśnie ponowne uruchamianie . – Max