
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 \lecID
fuera de \subsection{}
, entonces se compila.
¿Cual es la solución?
Respuesta1
No lo use \stepcounter
en el argumento de \subsection
. Incluso si lo precede \protect
para evitar el error, esto tendrá un efecto adverso cuando \tableofcontents
se 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}
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 \stepcounter
es frágil, lo que significa que puede generar errores cuando se coloca dentro de un argumento en movimiento. Los argumentos \section
son 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" \stepcounter
para asegurarse de que no cause problemas como comando frágil. Podemos preceder \lecID
con \protect
cuándo se usa o simplemente definirlo \lecID
como un comando robusto mediante \DeclareRobustCommand
. (Como señaló Mico, definimos \lecId
con \refstepcounter
en 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 \lecID
se ejecuta cada vez que aparece, lecCounter
se incrementa de manera inapropiada cuando aparece en otro lugar, como con \tableofcontents
. Por lo tanto, usamos el argumento opcional de \subsection
para poner solo el contador sin \stepcounter
cambiar \refstepcounter
el valor. Por lo tanto, LaTeX sólo aumentará lecCounter
la 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}