
Ich habe einen neuen Zähler wie folgt definiert:
\newcounter{lecCounter}
\newcommand{\lecID}{\stepcounter{lecCounter}\thelecCounter}
Und ich möchte es wie folgt verwenden:
\subsection{Lecture \lecID }
Aber es gibt einen Fehler:
! Missing \endcsname inserted.
<to be read again>
\csname\endcsname
l.1 \subsection{Lecture \lecID }
?
Wenn ich Lecture \lecID
es außerhalb von einfüge \subsection{}
, wird es kompiliert.
Was ist die Lösung?
Antwort1
Verwenden Sie es nicht \stepcounter
im Argument von . Auch wenn Sie zur Vermeidung des Fehlers \subsection
ein voranstellen , hat dies nachteilige Auswirkungen, wenn verwendet wird. Das folgende Beispiel zeigt es deutlich (ich habe verwendet , aber es ist genau dasselbe mit , vorausgesetzt es kommt ins Inhaltsverzeichnis).\protect
\tableofcontents
\section
\subsection
\documentclass{article}
\newcounter{lecCounter}
\newcommand{\lecID}{\protect\stepcounter{lecCounter}\thelecCounter}
\begin{document}
\tableofcontents
\section{Lecture \lecID}
Text.
\end{document}
Sie sollten einen neuen Befehl definieren:
\newcommand{\lecture}{%
\stepcounter{lecCounter}%
\subsection{Lecture \thelecCounter}%
}
Je nach Bedarf ist eine Feinabstimmung möglich, beispielsweise wenn Sie auf die Vorlesungsnummer statt auf die Unterabschnittsnummer verweisen müssen. Eine weitere Möglichkeit wäre das Hinzufügen eines optionalen Arguments für einen bestimmten Vorlesungstitel. Es ist besser, all dies in einem Befehl zu kodieren, als im Dokument nachzuschauen, wenn eine Änderung erforderlich ist.
Ein Beispieldokument könnte sein
\documentclass{article}
\newcounter{lecCounter}
\newcommand{\lecture}{%
\stepcounter{lecCounter}%
\subsection{Lecture \thelecCounter}%
}
\begin{document}
\tableofcontents
\section{Group of lectures}
\lecture
Text.
\lecture
Text.
\end{document}
Antwort2
Der Befehl \stepcounter
ist ein instabiler Befehl, d. h. er kann zu Fehlern führen, wenn er in ein bewegliches Argument eingefügt wird. Argumente für \section
sind bewegliche Argumente, da LaTeX den Abschnittsnamen (das Argument) auch in das Inhaltsverzeichnis und an anderer Stelle einfügt. Sie müssen „schützen“, \stepcounter
um sicherzustellen, dass er als instabiler Befehl keine Probleme verursacht. Wir können entweder \lecID
ein voranstellen \protect
, wenn er verwendet wird, oder ihn einfach \lecID
durch als robusten Befehl definieren \DeclareRobustCommand
. (Wie Mico bemerkte, definieren wir \lecId
mit für den Fall, dass Sie auf ( ) \refstepcounter
verweisen müssen, sodass es mit dem jeweiligen Unterabschnitt übereinstimmt.):lecCounter
\lecCounter
\DeclareRobustCommand{\lecID}{\refstepcounter{lecCounter}\thelecCounter}
Darüber hinaus wird, da \lecID
jedes Mal ausgeführt wird, wenn es auftaucht, lecCounter
unangemessen hochgezählt, wenn es anderswo auftaucht, wie z. B. mit \tableofcontents
. Daher verwenden wir das optionale Argument von , um \subsection
nur den Zähler einzugeben, ohne \stepcounter
und , \refstepcounter
um den Wert zu ändern. LaTeX wird daher nur hochgezählt, wenn lecCounter
es zum ersten Mal sieht\subsection
\subsection[Lecture \thelecCounter]{Lecture \lecID }
Das Problem mit fragilen Befehlen und verschobenen Argumenten wird hier ausführlicher erklärt:Was ist der Unterschied zwischen fragilen und robusten Befehlen?.
\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}