2012-09-09 18 views
8

Estoy usando Makefile para generar PDF a partir de archivos .tex.Referencia de LaTeX y Makefile

Cuando se usaron referencias en mis archivos LaTeX. a veces me da algo así como

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

sé que volver a ejecutar LaTeX compilar comando puede solucionar este problema de referencia, pero en mi Makefile, %.pdf sólo depende de %.tex, por lo tanto basta con ejecutar de nuevo make no soluciona el problema (nada ha cambiado en el archivo .tex). Necesito hacer un make clean para volver a generar PDF.

Aquí es mi Makefile

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

¿Cómo resolver este problema? Gracias.

ACTUALIZACIÓN:

He aquí algunos pensaban que encontré de Google

  1. Cambio default objetivo de ser un .PHONY. Que no es una solución muy buena (porque hay archivos de látex allí, y solo necesito volver a compilar un solo archivo)
  2. Dependencia de %.pdf para incluir %.aux. Pero no sé si es posible en GNU make? (depende del archivo %.aux si existe; de ​​lo contrario, omita la dependencia en %.aux)
  3. Realice un archivo grep al .log y busque la advertencia específica. Si existe, vuelva a ejecutar el comando de compilación.
+2

Puede que le interese mirar [latexmk] (http://ctan.tug.org/pkg/latexmk), que forma parte de la mayoría de las mejores distribuciones de TeX. –

Respuesta

1

O bien, establezca "predeterminado" un objetivo falso (agregue "predeterminado" a la línea que comienza con .PHONY), o cree una estructura de dependencia más compleja, que se repite automáticamente (no puedo decir cómo hacerlo, lo siento)

+0

Gracias por su respuesta. No creo que hacer 'default' a' .PHONY' es una buena idea, ya que hay muchos archivos tex ahí y solo necesito volver a compilar un solo archivo '.tex'. – yegle

10

que utilizo en todos mis archivos make LaTeX la regla simple

.DELETE_ON_ERROR: 

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

Esto se repite pdflatex tan a menudo como sea necesario. Descubrí que todos los mensajes LaTeX diferentes que requieren una repetición contienen la cadena común "Reanudar para obtener" en el archivo de registro, por lo que puede probar su presencia con grep en un ciclo while.

La configuración ".DELETE_ON_ERROR:" es importante: garantiza que make borre automáticamente cualquier archivo pdf/aux/idx restante incompleto siempre que TeX aborte con un error, de modo que no puedan confundir cuando lo llame la próxima vez.

Cuando uso DVI en lugar de PDF como el formato de salida, que utilizan de forma equivalente

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

La última línea hace que cualquier xdvi corriendo para recargar su archivo de entrada, para su inspección visual instantánea.

+0

¡Gran solución!Me gusta agregar '-interaction nonstopmode' al primer' pdflatex' de modo que simplemente se detenga en los errores, y agregue '-interaction batchmode' al comando en el ciclo while para que no obtenga toneladas de salida cuando solo está volviendo a ejecutar . – Max