\stepcounter не работает в заголовке подраздела

\stepcounter не работает в заголовке подраздела

Я определил новый счетчик как:

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

И я хочу использовать его как:

\subsection{Lecture \lecID }

Но выдает ошибку:

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

? 

Если я помещаю Lecture \lecIDего за пределы \subsection{}, то он компилируется.

Какое решение?

решение1

Не используйте \stepcounterв аргументе \subsection. Даже если перед ним стоит , \protectчтобы избежать ошибки, это будет иметь неблагоприятный эффект при \tableofcontentsиспользовании . Следующий пример наглядно это показывает (я использовал \section, но это то же самое с \subsection, при условии, что он попадет в оглавление).

\documentclass{article}

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

\begin{document}

\tableofcontents

\section{Lecture \lecID}

Text.

\end{document}

введите описание изображения здесь

Вам следует определить новую команду:

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

Возможна тонкая настройка в зависимости от ваших потребностей; например, если вам нужно сослаться на номер лекции, а не на номер подраздела. Другой возможностью было бы добавление необязательного аргумента для конкретного названия лекции. Лучше кодировать все это в команду, чем гнаться за документом, если требуется изменение.

Образец документа может быть

\documentclass{article}

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

\begin{document}

\tableofcontents

\section{Group of lectures}

\lecture

Text.

\lecture

Text.

\end{document}

решение2

Команда \stepcounterявляется хрупкой командой, то есть она может привести к ошибкам, если ее поместить внутрь движущегося аргумента. Аргументы to \sectionявляются движущимися аргументами, поскольку LaTeX также помещает имя раздела (аргумент) в таблицу содержания и в другие места. Вам нужно «защитить», \stepcounterчтобы убедиться, что она не вызывает проблем как хрупкая команда. Мы можем либо предварять ее \lecIDс помощью \protect, когда она используется, либо просто определить \lecIDкак надежную команду через \DeclareRobustCommand. (Как заметил Мико, мы определяем \lecIdс помощью \refstepcounterна случай, если вам может понадобиться сослаться на lecCounter( \lecCounter), чтобы она совпадала с соответствующим подразделом.):

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

Кроме того, поскольку \lecIDвыполняется каждый раз, когда он появляется, lecCounterненадлежащим образом увеличивается, когда он появляется в другом месте, например, с \tableofcontents. Таким образом, мы используем необязательный аргумент для того, \subsectionчтобы ввести только счетчик без \stepcounterи \refstepcounterизменить значение. Поэтому LaTeX будет увеличивать только lecCounterв первый раз, когда он видит\subsection

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

Проблема с хрупкими командами и движущимися аргументами более подробно объясняется здесь:В чем разница между командами Fragile и Robust?.

\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}

Показан результат

Связанный контент