\stepcounter no funciona en el encabezado de la subsección

\stepcounter no funciona en el encabezado de la subsección

He definido un nuevo contador como:

\newcounter{lecCounter}
\newcommand{\lecID}{\stepcounter{lecCounter}\thelecCounter}

Y deseo usarlo como:

\subsection{Lecture \lecID }

Pero da error:

! Missing \endcsname inserted.
<to be read again> 
                   \csname\endcsname
l.1 \subsection{Lecture \lecID }

? 

Si lo pongo Lecture \lecIDfuera de \subsection{}, entonces se compila.

¿Cual es la solución?

Respuesta1

No lo use \stepcounteren el argumento de \subsection. Incluso si lo precede \protectpara evitar el error, esto tendrá un efecto adverso cuando \tableofcontentsse use. El siguiente ejemplo lo muestra claramente (yo usé \section, pero es exactamente lo mismo con \subsection, siempre que vaya en la tabla de contenido).

\documentclass{article}

\newcounter{lecCounter}
\newcommand{\lecID}{\protect\stepcounter{lecCounter}\thelecCounter}

\begin{document}

\tableofcontents

\section{Lecture \lecID}

Text.

\end{document}

ingrese la descripción de la imagen aquí

Lo que debes hacer es definir un nuevo comando:

\newcommand{\lecture}{%
  \stepcounter{lecCounter}%
  \subsection{Lecture \thelecCounter}%
}

Es posible realizar ajustes finos, dependiendo de sus necesidades; por ejemplo, si necesita hacer referencia al número de la conferencia en lugar del número de la subsección. Otra posibilidad sería agregar un argumento opcional para el título de una conferencia específica. Es mejor codificar todo esto en un comando, en lugar de buscar en el documento si es necesario realizar un cambio.

Un documento de muestra podría ser

\documentclass{article}

\newcounter{lecCounter}
\newcommand{\lecture}{%
  \stepcounter{lecCounter}%
  \subsection{Lecture \thelecCounter}%
}

\begin{document}

\tableofcontents

\section{Group of lectures}

\lecture

Text.

\lecture

Text.

\end{document}

Respuesta2

El comando \stepcounteres frágil, lo que significa que puede generar errores cuando se coloca dentro de un argumento en movimiento. Los argumentos \sectionson argumentos en movimiento, ya que LaTeX también colocará el nombre de la sección (el argumento) en la tabla de contenido y en otros lugares. Debe "proteger" \stepcounterpara asegurarse de que no cause problemas como comando frágil. Podemos preceder \lecIDcon \protectcuándo se usa o simplemente definirlo \lecIDcomo un comando robusto mediante \DeclareRobustCommand. (Como señaló Mico, definimos \lecIdcon \refstepcounteren caso de que necesite hacer referencia a lecCounter( \lecCounter) de manera que coincida con la subsección respectiva):

\DeclareRobustCommand{\lecID}{\refstepcounter{lecCounter}\thelecCounter}

Además, puesto que \lecIDse ejecuta cada vez que aparece, lecCounterse incrementa de manera inapropiada cuando aparece en otro lugar, como con \tableofcontents. Por lo tanto, usamos el argumento opcional de \subsectionpara poner solo el contador sin \stepcountercambiar \refstepcounterel valor. Por lo tanto, LaTeX sólo aumentará lecCounterla primera vez que vea\subsection

\subsection[Lecture \thelecCounter]{Lecture \lecID }

El problema con los comandos frágiles y los argumentos móviles se explica más detalladamente aquí:¿Cuál es la diferencia entre comandos frágiles y robustos?.

\documentclass{article}
\usepackage[utf8]{inputenc}

\documentclass{article}
\usepackage[utf8]{inputenc}

\newcounter{lecCounter}
\DeclareRobustCommand{\lecID}{\refstepcounter{lecCounter}\thelecCounter}

\begin{document}

\tableofcontents

\subsection[Lecture \thelecCounter]{Lecture \lecID}

\subsection[Lecture \thelecCounter]{Lecture \lecID}

\end{document}

Mostrando resultado

información relacionada