¿Hay alguna manera de verificar si una etiqueta ya está definida en LaTeX?

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

  •  20-08-2019
  •  | 
  •  

Pregunta

Edité la pregunta después de la respuesta de David Hanak (¡por cierto, gracias!). Ayudó con la sintaxis, pero parece que, para empezar, no estaba usando la función correcta.

Básicamente, lo que quiero es dejar que el compilador ignore las definiciones múltiples de una determinada etiqueta y simplemente use la primera. Para hacer eso, pensé que simplemente haría algo como esto:

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

Sin embargo, esto no funciona porque la primera opción siempre se elige (no importa si la etiqueta está definida o no). Creo que el \ @ifundefined (y el sugerido \ ifundefined) solo funcionan para comandos y no para etiquetas, pero realmente no sé mucho sobre LaTeX. ¡Cualquier ayuda con esto sería genial! Gracias!

Actualización mucho más tarde: Marqué la respuesta de David Hanak como la respuesta correcta a mi pregunta, pero no es una solución completa, aunque realmente me ayudó. El problema es, creo, pero no soy especialista, que aunque el código de David verifica si una etiqueta está definida, solo funciona cuando la etiqueta se definió en una ejecución anterior (es decir, está en el archivo .aux). Si dos \ mylabels con el mismo nombre se definen en la misma ejecución, el segundo aún se definirá. Además, incluso si logra solucionar esto, hará que LaTeX use la primera etiqueta que definió cronológicamente, y no necesariamente la primera en el texto. De todos modos, a continuación está mi solución rápida y sucia. Utiliza el hecho de que los contadores parecen estar definidos de inmediato.

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

No estoy seguro de si es necesario inicializar el contador a 0, ya que parece ser un valor predeterminado, pero no pude encontrar si ese fuera el caso, así que solo estoy a salvo. Además, esto usa el paquete 'ifthen', que no estoy seguro de que sea necesario.

¿Fue útil?

Solución

@ es un carácter especial en LaTeX. Para hacer que su declaración sea sintácticamente correcta, deberá agregar dos líneas más:

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

La primera línea convierte \ifundefined en una letra normal, la última línea invierte su efecto.

Actualización: es posible que también desee echar un vistazo a " plain " \def\newlabel{\@newl@bel r} Macro LaTeX .

Actualización 2

Bien, investigué un poco para encontrar la respuesta al problema real . La cuestión es que definir una etiqueta no crea una macro con ese nombre; antepone un " r @ " lo. Intenta lo siguiente:

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

Para obtener más detalles técnicos, consulte la línea 3863 de latex.ltx en su distribución de LaTeX (donde dice <=>).

Otros consejos

Tampoco soy un experto en LaTeX, sin embargo, después de un día de intentar y buscar en Internet, lo siguiente funcionó para mí. He usado un contador ficticio para resolver el problema. Esperemos que esto ayude, aparentemente no mucha gente está buscando esto.

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

Por Victor Eijkhout, " TeX by Topic " ;, p.143:

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

Esto se puede usar para verificar si una etiqueta está definida; si no, la etiqueta se imprime:

\newcommand{\myautoref}[1]{\ifUnDefinedCs{r@#1}{\color{magenta}\IDontKnow\{#1\}}\else\autoref{#1}\fi} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top