
Eu defini um novo contador como:
\newcounter{lecCounter}
\newcommand{\lecID}{\stepcounter{lecCounter}\thelecCounter}
E desejo usá-lo como:
\subsection{Lecture \lecID }
Mas dá erro:
! Missing \endcsname inserted.
<to be read again>
\csname\endcsname
l.1 \subsection{Lecture \lecID }
?
Se eu colocar Lecture \lecID
fora do \subsection{}
, ele compila.
Qual é a solução?
Responder1
Não use \stepcounter
no argumento de \subsection
. Mesmo que o preceda \protect
para evitar o erro, isso terá um efeito adverso quando \tableofcontents
for usado. O exemplo a seguir mostra isso claramente (eu usei \section
, mas é exatamente o mesmo com \subsection
, desde que esteja no índice).
\documentclass{article}
\newcounter{lecCounter}
\newcommand{\lecID}{\protect\stepcounter{lecCounter}\thelecCounter}
\begin{document}
\tableofcontents
\section{Lecture \lecID}
Text.
\end{document}
O que você deve fazer é definir um novo comando:
\newcommand{\lecture}{%
\stepcounter{lecCounter}%
\subsection{Lecture \thelecCounter}%
}
O ajuste fino é possível, dependendo das suas necessidades; por exemplo, se você precisar consultar o número da aula em vez do número da subseção. Outra possibilidade seria adicionar um argumento opcional para o título de uma palestra específica. É melhor codificar tudo isso em um comando, em vez de procurar no documento se for necessária uma alteração.
Um documento de amostra pode 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}
Responder2
O comando \stepcounter
é frágil, o que significa que pode levar a erros quando colocado dentro de um argumento móvel. Os argumentos to \section
são argumentos móveis, já que o LaTeX também coloca o nome da seção (o argumento) no índice e em outros lugares. Você precisa "proteger" \stepcounter
para garantir que não cause problemas como um comando frágil. Podemos preceder \lecID
quando \protect
ele é usado ou apenas definir \lecID
como um comando robusto por meio de \DeclareRobustCommand
. (Como observou Mico, definimos \lecId
com \refstepcounter
caso você precise consultar o lecCounter
( \lecCounter
) para que corresponda à respectiva subseção.):
\DeclareRobustCommand{\lecID}{\refstepcounter{lecCounter}\thelecCounter}
Além disso, desde que \lecID
é executado toda vez que aparece, lecCounter
é incrementado inadequadamente quando aparece em outro lugar, como em \tableofcontents
. Assim, utilizamos o argumento opcional de \subsection
para colocar apenas o contador sem \stepcounter
e \refstepcounter
para alterar o valor. O LaTeX, portanto, só aumentará lecCounter
na primeira vez que vir\subsection
\subsection[Lecture \thelecCounter]{Lecture \lecID }
O problema com comandos frágeis e argumentos móveis é explicado mais detalhadamente aqui:Qual é a diferença entre comandos Frágeis e 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}