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's gravatar image

Pathe ♦♦
7.4k28196245
Taux d'acceptation : 55%

Un bon éditeur dédié doit permettre de faire cela, non ?

(29 Sep '17, 00:41) Bernard Bernard's gravatar image

Que voulez vous faire ?

Normalement la compilation vous montre des messages de type LaTeX Warning: Label 'foo' multiply defined. Consulter votre fichier .log.

(29 Sep '17, 01:32) touhami touhami's gravatar image
1

Le package listlbls, qui permet de lister (tous, pas seulement les homonymes) les labels, peut aider.

(29 Sep '17, 09:49) denis ♦♦ denis's gravatar image

@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.

(29 Sep '17, 18:25) Pathe ♦♦ Pathe's gravatar image

Voici une réponse n'utilisant pas LaTeX (en supposant que le fichier .tex en jeu se nomme test.tex) :

Ouvrir dans l'éditeur Overleaf
more test.aux | grep newlabel | awk -F '}' '{print $1}' | uniq -cd | awk '{gsub(/\\newlabel\{/,"fois le label ")}1'
Lien permanent

Publiée 29 Sep '17, 20:08

denis's gravatar image

denis ♦♦
7.0k1510
Taux d'acceptation : 52%

awk ? Ben v'là aut' chose ! Les compétences de @denis sont sans limites !

(29 Sep '17, 21:35) Pathe ♦♦ Pathe's gravatar image
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 ♦♦ Pathe's gravatar image

Voici une solution. La liste des labels réutilisés se trouve dans un fichier .labels de la forme

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 \label a été redéfinie pour détecter les labels homonymes et la commande \InputIfFileExists pour récupérer le nom de fichier courant.

Utilisation Créer un fichier multilabels.tex

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 \include ou \input on peut simplifier le code, et le fichier multilabels.tex devient

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 \input{multilabels.tex} après \begin{document}.

Remarque pour la compilation finale supprimer ou décommenter la ligne \input{multilabels.tex}.

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 input et include

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}
Lien permanent

Publiée 29 Sep '17, 13:53

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Modifiée 07 Oct '17, 21:51

Je ne comprends pas le début de votre ECM, entre \begin{filecontents} et \end{filecontents}.

Je n'ai qu'un document ; j'y ai ajouté la partie de votre préambule située entre \newcommand*{\mtlistlabels}{} et \begin{document}. La compilation s'arrête avec :

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 entrée, elle se poursuit ; un fichier .labels est en effet créé, mais il est vide.

(29 Sep '17, 18:18) Pathe ♦♦ Pathe's gravatar image

C'est juste pour un exemple complet, en cas d'utilisation des commandes \include ou \input.

Pouvez vous poster un exemple minimale qui produit un fichier .labels vide?

(29 Sep '17, 19:42) touhami touhami's gravatar image

En cas d'un seule fichier le code peut être simplifier. Voir modifications.

(29 Sep '17, 19:48) touhami touhami's gravatar image

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 ♦♦ Pathe's gravatar image

@Pathe Le fichier .labels est vide à cause d'un redéfinition de \label, je suppose par l'extension \hyperref. Il faut que mes changements passent en dernier, par exemple après \begin{document}. Voir modifications.

(07 Oct '17, 11:59) touhami touhami's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.