Dans un document figurent de très nombreux labels. Le document compile jusqu'au bout, mais j'obtiens l'erreur suivante : LaTeX Warning: There were multiply-defined labels. Je ne réussis pas à débusquer les labels homonymes. Y a-t-il une commande permettant de lister ces labels, ou de démêler le fichier .aux ? Cela me faciliterait grandement le travail. Posée 29 Sep '17, 00:35 Pathe ♦♦ |
Voici une réponse n'utilisant pas LaTeX (en supposant que le fichier Ouvrir dans l'éditeur Overleaf
more test.aux | grep newlabel | awk -F '}' '{print $1}' | uniq -cd | awk '{gsub(/\\newlabel\{/,"fois le label ")}1' Publiée 29 Sep '17, 20:08 denis ♦♦ awk ? Ben v'là aut' chose ! Les compétences de @denis sont sans limites !
(29 Sep '17, 21:35)
Pathe ♦♦
Ouvrir dans l'éditeur Overleaf
$ more test.aux | grep newlabel | awk -F '}' '{print $1}' | uniq -cd | awk '{gsub(/\\newlabel\{/,"fois le label ")}1' 2 fois le label plan 2 fois le label elec Youpi !
(29 Sep '17, 22:59)
Pathe ♦♦
|
Voici une solution. La liste des labels réutilisés se trouve dans un fichier Ouvrir dans l'éditeur Overleaf
********* multiple utilisation de label : `foo` ligne 72 de fichier texniqueAQ.tex ligne 11 de fichier fichier2 ligne 13 de fichier fichier2 ligne 17 de fichier fichier2 ligne 20 de fichier fichier2 ligne 7 de fichier fichier1.tex ligne 9 de fichier fichier1.tex ligne 13 de fichier fichier1.tex ligne 15 de fichier fichier1.tex ligne 77 de fichier texniqueAQ.tex ligne 79 de fichier texniqueAQ.tex ********* multiple utilisation de label : `foo1` ligne 81 de fichier texniqueAQ.tex La commande Utilisation Créer un fichier Ouvrir dans l'éditeur Overleaf
\newcommand*{\mtlistlabels}{} \newwrite\mtlabels \immediate\openout\mtlabels=\jobname.labels \newcounter{mt} \expandafter\xdef\csname mtmput0\endcsname{\jobname} \makeatletter \long\def \InputIfFileExists#1#2{% \IfFileExists{#1}% {\stepcounter{mt}% \expandafter\xdef\csname mtmput\themt\endcsname{#1}% #2\@addtofilelist{#1}\@@input \@filef@und \addtocounter{mt}{-1}}} \def\label#1{% \@ifundefined{mtlabel#1}{% \expandafter\gdef\csname mtlabel#1\endcsname{*********^^J% multiple utilisation de label : `#1` ^^J}}{% \@ifundefined{mtmtlabel#1}{% \expandafter\gdef\csname mtmtlabel#1\endcsname{}% \g@addto@macro\mtlistlabels{\csname mtlabel#1\endcsname^^J}}{}% \expandafter\xdef\csname mtlabel#1\endcsname{\csname mtlabel#1\endcsname ligne \the\inputlineno\space de fichier \csname mtmput\themt\endcsname^^J}}} \makeatother \AtEndDocument{% \immediate\write\mtlabels{\mtlistlabels} \errmessage{Commande `\string\label' a été redéfinie, cette compilation n'est pas finale}} Remarque En cas d'un seule fichier, i.e. si on n'utilise pas des commande Ouvrir dans l'éditeur Overleaf
\newcommand*{\mtlistlabels}{} \newwrite\mtlabels \immediate\openout\mtlabels=\jobname.labels \makeatletter \def\label#1{% \@ifundefined{mtlabel#1}{% \expandafter\gdef\csname mtlabel#1\endcsname{*********^^J% multiple utilisation de label : `#1` ^^J}}{% \@ifundefined{mtmtlabel#1}{% \expandafter\gdef\csname mtmtlabel#1\endcsname{}% \g@addto@macro\mtlistlabels{\csname mtlabel#1\endcsname^^J}}{}% \expandafter\xdef\csname mtlabel#1\endcsname{\csname mtlabel#1\endcsname ligne \the\inputlineno^^J}}} \makeatother \AtEndDocument{% \immediate\write\mtlabels{\mtlistlabels} \errmessage{Commande `\string\label' a été redéfinie, cette compilation n'est pas finale}} Maintenant il suffit d'ajouter la ligne Remarque pour la compilation finale supprimer ou décommenter la ligne ECM Ouvrir dans l'éditeur Overleaf
\documentclass{article} \begin{document} \input{multilabels.tex} \section{foo} \label{foo} \section{foo} \label{foo} \section{foo1} \label{foo1} \section{foo2} \label{foo} \section{foo2} \label{foo} \section{foo1} \label{foo1} \end{document} EMC avec Ouvrir dans l'éditeur Overleaf
\documentclass{article} \begin{filecontents}{fichier1.tex} \input{fichier2} \section{foo2} \label{foo} \section{foo2} \label{foo} \section{foo1} \section{foo2} \label{foo} \section{foo2} \label{foo} \section{foo1} \end{filecontents} \begin{filecontents}{fichier2.tex} bla bla bla bla bla bla \section{foo2} \label{foo} \section{foo2} \label{foo} \section{foo1} bla bla \section{foo2} \label{foo} bla bla \section{foo2} \label{foo} \section{foo1} \end{filecontents} \begin{document} \input{multilabels.tex} \section{foo} \label{foo} \section{foo} \label{foo} \section{foo1} \label{foo1} \include{fichier1} \section{foo2} \label{foo} \section{foo2} \label{foo} \section{foo1} \label{foo1} \end{document} Publiée 29 Sep '17, 13:53 touhami Je ne comprends pas le début de votre ECM, entre Je n'ai qu'un document ; j'y ai ajouté la partie de votre préambule située entre Ouvrir dans l'éditeur Overleaf
! Commande `\label' a �t� red�finie, cette compilation n'est pas finale. \@enddocumenthook ...compilation n'est pas finale} \AtVeryEnd@RedefCheckEnd Si j'appuie sur
(29 Sep '17, 18:18)
Pathe ♦♦
C'est juste pour un exemple complet, en cas d'utilisation des commandes Pouvez vous poster un exemple minimale qui produit un fichier
(29 Sep '17, 19:42)
touhami
En cas d'un seule fichier le code peut être simplifier. Voir modifications.
(29 Sep '17, 19:48)
touhami
J'ai tenté une nouvelle compilation avec le code simplifié, et avec mon document le fichier labels reste toujours vide. Je veux bien vous envoyer mon document.
(30 Sep '17, 00:08)
Pathe ♦♦
|
Un bon éditeur dédié doit permettre de faire cela, non ?
Que voulez vous faire ?
Normalement la compilation vous montre des messages de type LaTeX Warning: Label 'foo' multiply defined. Consulter votre fichier
.log
.Le package
listlbls
, qui permet de lister (tous, pas seulement les homonymes) les labels, peut aider.@denis j'ai essayé le package listlbls en ajoutant dans le préambule
\usepackage[draft]{listlbls}
. À la toute fin de mon document, j'ai ajouté la commande\listoflabels
, et j'ai en effet obtenu une liste.Elle recense mes labels, mais comporte aussi des informations du type Label: 12@xvr que je ne sais pas décoder (aucun de mes labels n'est nommé xvr ou 12@xvr). Et la documentation ne m'a pas aidé à le faire.