2010-07-12 4 views
3

J'essaie de déterminer quand une nouvelle exécution de Xe (La) TeX est nécessaire en raison de références non définies. J'ai posté une question connexe sur le SCons mailing list, et le problème est comme suit:XeTeX - Détecter lorsque la réexécution est nécessaire

Les comptes de pages et d'autres références qui exigent plusieurs exécutions de XeLaTeX ne sont pas actuellement détectés par SCons et d'autres systèmes de construction. Voici un exemple de fichier (que nous appellerons job.tex):

\documentclass[ones​ide,12pt]{memoir} 
\usepackage{xltxtra} 
\usepackage[T1]{fontenc} 
\makepagestyle{plain} 
\makeoddfoot{plain}{}{}{Page \thepage\ of \arabic{lastpage}} 
\makeevenfoot{plain}{}{}{Page \thepage\ of \arabic{lastpage}} 
\begin{document} 
\pagestyle{plain} 
Page 1 
\newpage 
Page 2 
\newpage 
Page 3 
\newpage 
\end{document} 

Si vous exécutez xelatex job, le .pdf qui est produit a des numéros de page "Page 1 sur 0", "Page 2 de 0", et « la page 3 sur 0 "pour les trois pages. Si vous exécutez xelatex job une deuxième fois, vous obtenez "Page 1 sur 3", etc. (c'est-à-dire le nombre de pages correct). Pour corriger cela, j'ai suggéré sur la liste de diffusion SCons que la vérification de l'exécution de xelatex pour résoudre les références non définies consiste à changer l'expression régulière suivante (en SCons.Tools.tex à la ligne 71 de la version 2.0.1.beta. 20100627.r5064):

- warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)' 
+ warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)'\ 
+      '|(^No file \w+\.\w{3}\.$)' 

En pratique, il s'agit d'une vérification de "No file job.aux". Il s'avère que cela fonctionne dans tous les cas car Xe (La) TeX imprimera toujours "No file job.aux" lors de la première exécution, et donc Xe (La) TeX s'exécutera toujours deux fois. En fait, c'est la même chose que d'avoir job.aux devenir une cible de construction intermédiaire entre job.tex et job.pdf.

est là le problème: Même s'il n'y a pas de référence non définie (par exemple supprimer le \arabic{lastpage} de job.tex ci-dessus) Xe (La) TeX est appelé deux fois, une fois pour produire le .aux, une fois pour produire le .pdf. Évidemment, s'il n'y a pas de références indéfinies, ce second appel est superflu. Donc ma question: comment peut-on détecter - vraisemblablement au moyen d'un test d'expression régulière par rapport au job.log - lorsqu'il existe ou non des références indéfinies (par exemple \ arabic {lastpage}) qui nécessitent une recompilation.

Merci d'avoir lu.

Meilleures salutations,

Brian

Répondre

2

Pouvez-vous pas simplement copier le fichier .aux à une sauvegarde et comparer si la sauvegarde est le même que le fichier .aux nouvellement généré à la fin de la course de XeTEX ?

1

La solution que vous voulez probablement est de faire référence à la dernière page de telle sorte qu'un avertissement est donné lorsque le compteur "lastpage" n'est pas défini. Cela serait alors repris par l'expression régulière originale de réexécution. Une autre approche que j'utilise est de continuer à faire tourner LaTeX jusqu'à ce que le fichier aux ne change plus (conceptuellement, le fichier aux est à la fois une entrée et une sortie de la course LaTeX, et vous continuez à utiliser LaTeX jusqu'à atteindre un point fixe pour le fichier aux). Cela devrait donner la garantie que la relecture de LaTeX ne changera plus le document résultant.

Je ne sais pas si vous pouvez intégrer ce comportement dans Scones. A partir d'un Makefile, c'est assez facile avec une certaine logique de shell.

0

Rubber fait exactement cela. Il n'est pas à l'épreuve des balles, mais il fonctionne la plupart du temps, et la sortie est propre, ce qui facilite la détection des erreurs.Par exemple, je courrais comme il:

$ rubber --pdf [my-file] 

(Autrement dit, si au bout de 4 ans cela est encore utile :-)

Questions connexes