Est-il possible de vérifier si une étiquette est déjà définie dans LaTeX?

StackOverflow https://stackoverflow.com/questions/495841

  •  20-08-2019
  •  | 
  •  

Question

J'ai modifié la question après la réponse de David Hanak (merci au fait!). Il a aidé avec la syntaxe, mais il semble que je n’utilisais pas la bonne fonction pour commencer.

En gros, ce que je veux, c’est laisser le compilateur ignorer plusieurs définitions d’une certaine étiquette et utiliser la première. Pour ce faire, je pensais faire quelque chose comme ceci:

    \makeatletter
    \newcommand{\mylabel}[1]{
        \@ifundefined{#1}{\label{#1}}{X}
    }
    \makeatother

Cela ne fonctionne pas, car la première option est toujours choisie (que l’étiquette soit définie ou non, peu importe). Je pense que \ @ifundefined (et le suggéré \ ifundefined) ne fonctionnent que pour les commandes et non pour les étiquettes, mais je ne connais pas grand chose à LaTeX. Toute aide avec ce serait génial! Merci!

Mise à jour beaucoup plus tard: J'ai marqué la réponse de David Hanak comme étant la réponse correcte à ma question, mais ce n'est pas une solution complète, même si cela m'a vraiment aidé. Le problème est, je pense mais je ne suis pas un spécialiste, que même si le code de David vérifie si une étiquette est définie, cela ne fonctionne que lorsque l'étiquette a été définie dans une exécution précédente (c'est-à-dire dans le fichier .aux). Si deux \ mylabels portant le même nom sont définis dans la même exécution, la seconde sera toujours définie. De plus, même si vous parvenez à contourner ce problème, LaTeX utilisera la première étiquette que vous avez définie chronologiquement, et pas nécessairement la première dans le texte. Quoi qu'il en soit, voici ma solution rapide et sale. Il utilise le fait que les compteurs semblent être définis immédiatement.

\newcommand{\mylabel}[1]{%
    \@ifundefined{c@#1}{%
        \newcounter{#1}%
        \setcounter{#1}{0}%
    }{}%
    \ifthenelse{\value{#1} > 0}{}{%
        \label{#1}%
        \addtocounter{#1}{1}%
    }%
}

Je ne suis pas sûr qu'il soit nécessaire d'initialiser le compteur à 0, car cela semble être un défaut probable, mais je ne pouvais pas trouver si c'était le cas, alors je ne fais que rester en sécurité. De plus, cela utilise le paquetage "ifthen", dont je ne suis pas sûr qu'il soit nécessaire.

Était-ce utile?

La solution

@ est un caractère spécial dans LaTeX. Pour que votre déclaration soit syntaxiquement correcte, vous devrez ajouter deux lignes supplémentaires:

\makeatletter
\newcommand{\mylabel}[1]{
    \@ifundefined{#1}{\label{#1}}{X}
}
\makeatother

La première ligne devient \ifundefined une lettre normale, la dernière ligne inverse son effet.

Mise à jour: vous pouvez également consulter le " plain " \def\newlabel{\@newl@bel r} Macro LaTeX .

Mise à jour 2

D'accord, j'ai effectué des recherches pour trouver la réponse au problème réel . Le fait est que définir une étiquette ne crée pas une macro portant ce nom; il ajoute un " r @ " à cela. Alors essayez ce qui suit:

\makeatletter
\newcommand{\mylabel}[1]{
    \@ifundefined{r@#1}{\label{#1}}{X}
}
\makeatother

Pour plus de détails techniques, reportez-vous à la ligne 3863 de latex.ltx dans votre distribution LaTeX (où il est indiqué <=>).

Autres conseils

Je ne suis pas non plus un expert de LaTeX. Toutefois, après une journée de recherches et de recherches sur Internet, les éléments suivants ont fonctionné pour moi. J'ai utilisé un compteur factice pour résoudre le problème. Espérons que cela aide, apparemment, peu de gens le recherchent.

\newcommand{\mylabel}[1]{
    \ifcsname c@#1\endcsname%
    \else%
        \newcounter{#1}\label{#1}%
    \fi%
}

Par Victor Eijkhout, & "TeX par sujet &"; p.143:

\def\ifUnDefinedCs#1{\expandafter\ifx\csname#1\endcsname\relax} 

Ceci peut être utilisé pour vérifier si une étiquette est définie; sinon l'étiquette est imprimée:

\newcommand{\myautoref}[1]{\ifUnDefinedCs{r@#1}{\color{magenta}\IDontKnow\{#1\}}\else\autoref{#1}\fi} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top