2012-09-09 96 views
8

Tôi đang sử dụng Makefile để tạo tệp PDF từ .tex tệp.Tham chiếu LaTeX và Makefile

Khi tài liệu tham khảo được sử dụng trong các tệp LaTeX của tôi. đôi khi tôi nhận được một cái gì đó giống như

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

Tôi biết rằng chạy lại LaTeX biên dịch lệnh có thể khắc phục vấn đề thông tin này, nhưng trong Makefile tôi, %.pdf chỉ phụ thuộc vào %.tex, do đó chỉ cần chạy make một lần nữa vẫn không sửa được vấn đề (không có gì thay đổi trong tập tin .tex). Tôi cần phải thực hiện một số make clean để tạo lại PDF.

Dưới đây là tôi Makefile

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

Làm thế nào để giải quyết vấn đề này? Cảm ơn bạn.

UPDATE:

Dưới đây là một vài suy nghĩ tôi thấy từ Google

  1. Thay đổi default mục tiêu trở thành một .PHONY. Đó không phải là giải pháp tốt (vì có thể có tệp latex ở đó và tôi chỉ cần biên dịch lại một tệp)
  2. Thay đổi phụ thuộc %.pdf để bao gồm %.aux. Nhưng tôi không biết liệu GNU có thể làm được không? (phụ thuộc vào tập tin %.aux nếu nó tồn tại, nếu không thì hãy bỏ qua sự phụ thuộc vào %.aux)
  3. Thực hiện grep đến .log tệp và tìm cảnh báo cụ thể. Nếu nó tồn tại, hãy chạy lại lệnh biên dịch.
+2

Bạn có thể hưởng lợi từ việc xem [latexmk] (http://ctan.tug.org/pkg/latexmk), đây là một phần của hầu hết các bản phân phối TeX tốt. –

Trả lời

1

Làm cho "mặc định" là mục tiêu giả mạo (Thêm "mặc định" vào dòng bắt đầu bằng .PHONY) hoặc tạo cấu trúc phụ thuộc phức tạp hơn, sẽ tự động chạy lại (không thể nói cách thực hiện, xin lỗi).

+0

Cảm ơn bạn đã trả lời. Tôi không nghĩ rằng việc tạo 'default' là' .PHONY' là một ý tưởng hay vì có nhiều tệp tex ở đó và tôi chỉ cần biên dịch lại một tệp '.tex' duy nhất. – yegle

10

tôi sử dụng trong tất cả các LaTeX tôi Makefiles các quy tắc đơn giản

.DELETE_ON_ERROR: 

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

này lặp đi lặp lại pdflatex càng thường xuyên càng cần thiết. Tôi thấy rằng tất cả các thông báo LaTeX khác nhau gọi cho chạy lại chứa chuỗi chung "Chạy lại để lấy" trong tệp nhật ký, vì vậy bạn chỉ có thể kiểm tra sự hiện diện của nó bằng grep trong một vòng lặp while.

Cài đặt ".DELETE_ON_ERROR:" rất quan trọng: nó đảm bảo tự động xóa mọi tệp pdf/aux/idx chưa hoàn chỉnh còn lại bất cứ khi nào TeX hủy bỏ lỗi, do đó chúng không thể gây nhầm lẫn khi bạn gọi nó lần sau.

Khi tôi sử dụng DVI chứ không phải PDF là định dạng đầu ra, tôi sử dụng tương đương

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

Dòng cuối cùng gây ra bất kỳ xdvi chạy để tải lại tập tin đầu vào của nó, để kiểm tra thị giác ngay lập tức.

+0

Giải pháp tuyệt vời! – Max

Các vấn đề liên quan