
Я определил новый счетчик как:
\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}