\stepcounter não está funcionando no cabeçalho da subseção

\stepcounter não está funcionando no cabeçalho da subseção

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 \lecIDfora do \subsection{}, ele compila.

Qual é a solução?

Responder1

Não use \stepcounterno argumento de \subsection. Mesmo que o preceda \protectpara evitar o erro, isso terá um efeito adverso quando \tableofcontentsfor 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}

insira a descrição da imagem aqui

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 \sectionsã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" \stepcounterpara garantir que não cause problemas como um comando frágil. Podemos preceder \lecIDquando \protectele é usado ou apenas definir \lecIDcomo um comando robusto por meio de \DeclareRobustCommand. (Como observou Mico, definimos \lecIdcom \refstepcountercaso 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 \subsectionpara colocar apenas o contador sem \stepcountere \refstepcounterpara alterar o valor. O LaTeX, portanto, só aumentará lecCounterna 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}

Mostrando resultado

informação relacionada