Gibt es eine Möglichkeit zu überprüfen, ob ein Etikett bereits in LaTeX definiert ist?

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

  •  20-08-2019
  •  | 
  •  

Frage

Ich bearbeitet die Frage nach David Hanak Antwort (danke übrigens!). Er half mit der Syntax, aber es scheint, dass ich die richtige Funktion nicht mit zu beginnen.

Im Grunde, was ich will, ist der Compiler mehrere Definitionen eines bestimmten Etiketts und nur verwenden, um die ersten ignorieren zu lassen. Um das zu tun, dachte ich, ich würde nur so etwas tun:

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

Das funktioniert nicht, obwohl, weil die erste Option immer gewählt wird (es spielt keine Rolle, ob das Etikett definiert ist oder nicht). Ich denke, die \ @ifundefined (und die vorgeschlagene \ ifundefined) nur für Befehle arbeiten und nicht für Etiketten, aber ich weiß nicht wirklich viel über LaTeX. Jede mögliche Hilfe bei dieser wäre toll! Dank!

Viel später Update: Ich markierte David Hanak Antwort als die richtige Antwort auf meine Frage, aber es ist keine vollständige Lösung, obwohl es mir wirklich geholfen. Das Problem ist, ich glaube, aber ich bin kein Spezialist, dass, obwohl Davids Code überprüft, ob ein Etikett definiert ist, es funktioniert nur, wenn das Etikett in einem vorherigen Laufe definiert wurde (das heißt in der .aux-Datei). Wenn zwei \ MyLabels mit dem gleichen Namen im gleichen Lauf definiert sind, werden nach wie vor die zweite definiert werden. Auch wenn Sie, dies zu umgehen verwalten, wird es LaTeX machen verwenden Sie das erste Label, das Sie in chronologischer Reihenfolge definiert, und nicht unbedingt die erste im Text. Wie auch immer, unten ist meine quick and dirty Lösung. Es nutzt die Tatsache, dass Zähler sofort definiert zu werden scheinen.

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

Ich bin mir nicht sicher, ob es notwendig ist, den Zähler auf 0 zu initialisieren, da es wie ein wahrscheinlich Standard scheint, aber ich konnte nicht finden, wenn das der Fall ist, so dass ich nur um sicher zu sein. Auch diese verwendet das ‚ifthen‘ -Paket, das ich bin nicht sicher, notwendig ist.

War es hilfreich?

Lösung

@ ist ein spezielles Zeichen in LaTeX. Um Ihre Erklärung syntaktisch richtig zu machen, werden Sie müssen zwei weitere Linien hinzu:

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

Die erste Zeile @ in einen normalen Brief dreht, die letzte Zeile kehrt seine Wirkung.

Update: Sie können auch einen Blick auf die "Ebene" \ifundefined LaTeX Makro .

Update 2

Okay, habe ich einige der Forschung, um die Antwort auf die , um herauszufinden, reale Problem. Die Sache ist die, dass ein Label definiert, wird keine neue Makro mit diesem Namen; es prepends ein „r @“ zu. Also versuchen Sie wie folgt vor:

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

Weitere technische Details finden 3863 von latex.ltx in LaTeX-Verteilung an die Leitung (wo es heißt \def\newlabel{\@newl@bel r}).

Andere Tipps

Ich bin auch kein LaTeX-Experte, aber nach einem Tag zu versuchen, und die Suche im Internet die für mich gearbeitet folgen. Ich habe einen Dummy-Zähler zur Lösung des Problems verwendet. Hoffentlich hilft, offenbar nicht viele Menschen für diese suchen.

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

Mit dem Victor Eijkhout "TeX nach Thema", S.143:

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

Dies kann dazu verwendet werden, um zu prüfen, ob ein Etikett definiert ist; wenn nicht, wird das Etikett gedruckt:

\newcommand{\myautoref}[1]{\ifUnDefinedCs{r@#1}{\color{magenta}\IDontKnow\{#1\}}\else\autoref{#1}\fi} 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top