\stepcounter funktioniert nicht in der Unterabschnittsüberschrift

\stepcounter funktioniert nicht in der Unterabschnittsüberschrift

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 \lecIDes außerhalb von einfüge \subsection{}, wird es kompiliert.

Was ist die Lösung?

Antwort1

Verwenden Sie es nicht \stepcounterim Argument von . Auch wenn Sie zur Vermeidung des Fehlers \subsectionein 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}

Bildbeschreibung hier eingeben

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 \stepcounterist ein instabiler Befehl, d. h. er kann zu Fehlern führen, wenn er in ein bewegliches Argument eingefügt wird. Argumente für \sectionsind bewegliche Argumente, da LaTeX den Abschnittsnamen (das Argument) auch in das Inhaltsverzeichnis und an anderer Stelle einfügt. Sie müssen „schützen“, \stepcounterum sicherzustellen, dass er als instabiler Befehl keine Probleme verursacht. Wir können entweder \lecIDein voranstellen \protect, wenn er verwendet wird, oder ihn einfach \lecIDdurch als robusten Befehl definieren \DeclareRobustCommand. (Wie Mico bemerkte, definieren wir \lecIdmit für den Fall, dass Sie auf ( ) \refstepcounterverweisen müssen, sodass es mit dem jeweiligen Unterabschnitt übereinstimmt.):lecCounter\lecCounter

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

Darüber hinaus wird, da \lecIDjedes Mal ausgeführt wird, wenn es auftaucht, lecCounterunangemessen hochgezählt, wenn es anderswo auftaucht, wie z. B. mit \tableofcontents. Daher verwenden wir das optionale Argument von , um \subsectionnur den Zähler einzugeben, ohne \stepcounterund , \refstepcounterum den Wert zu ändern. LaTeX wird daher nur hochgezählt, wenn lecCounteres 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}

Ergebnisse werden angezeigt

verwandte Informationen