Ich versuche, den Zähler jedes Mal zurückzusetzen, wenn ich section
auf dieser GrundlageDokument.
\documentclass{article}
\newcounter{example}[section] % This line reset the counter every time meet a section
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1} \rmfamily}
{\medskip}
\begin{document}
\section{Section}
\begin{example}
A
\end{example}
\begin{example}
B
\end{example}
\section{Another section}
\begin{example}
C
\end{example}
\end{document}
Dies erzeugt
was bedeutet, dass es funktioniert.
Jetzt möchte ich jedoch die Nummer vor dem Abschnitt entfernen und habe daher *
danach hinzugefügt section
.
\documentclass{article}
\newcounter{example}[section] % Tried to change `section*`, but throws error
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1} \rmfamily}
{\medskip}
\begin{document}
\section*{Section}
\begin{example}
A
\end{example}
\begin{example}
B
\end{example}
\section*{Another section}
\begin{example}
C
\end{example}
\end{document}
Dieses Mal wird der Zähler jedoch nicht zurückgesetzt wie
Wenn ich ändere zu
\newcounter{example}[section*]
Es wird ein Fehler ausgegeben
Kein Zähler 'section*' definiert.
Wie wird der Zähler bei einem Treffen zurückgesetzt section*
?
Antwort1
Sie haben einen Fehler erhalten, \newcounter{example}[section*]
weil section*
es sich nicht um einen Zähler in LaTeX handelt. section
ist, aber nicht section*
.
Erste Methode: Patchen\@startsection
Sie können einen Patch \@startsection
so installieren, dass Ihr Zähler auf 0 zurückgesetzt wird, wenn \section*
aufgerufen wird (was ein Abschnittsbefehl der Ebene 1 ist), und nur in diesem Fall. Das Folgende funktioniert, weil nur für nicht nummerierte Abschnittsbefehle aufgerufen wird, und wir den Zähler nur zurücksetzen, wenn die Ebene des Abschnittsbefehls 1 ( oder ) ist.example
\@ssect
\section
\section*
\documentclass{article}
\usepackage{etoolbox}
\newcounter{example}[section]
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1}%
\rmfamily}
{\medskip}
\makeatletter
\patchcmd{\@startsection}
{\@ssect}{\ifnum#2=1 \setcounter{example}{0}\fi\@ssect}
{}{\FAILED}
\makeatother
\begin{document}
\section*{Section}
\begin{example}
A
\end{example}
\begin{example}
B
\end{example}
\section*{Another section}
\begin{example}
C
\end{example}
\begin{example}
D
\end{example}
\section{Numbered section}
\begin{example}
E
\end{example}
\begin{example}
F
\end{example}
\end{document}
Zweite Methode: xparse
Neudefinieren\section
Eine andere Möglichkeit, das gleiche Ergebnis zu erzielen, besteht darin, zu verwenden, xparse
um neu zu definieren \section
, wie es egreg indiese Antwort. Der Vorteil dieser Technik besteht darin, dass sie nicht von Implementierungsdetails von \section
und abhängt \@startsection
. Daher sollte sie immer funktionieren, auch wenn \section
neu definiert wurde und nicht mehr der Befehl von LaTeX2e ist. Dies kann der Fall sein, wenn Sie mithilfe eines Pakets wie \section
neu definieren oder einfach mehrere mit der ersten Technik durchgeführte Neudefinitionen stapeln möchten. Daher würde ich sagen, dass diese zweite Methode aus technischer Sicht besser ist.\section
titlesec
\documentclass{article}
\usepackage{xparse}
\newcounter{example}[section]
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1}%
\rmfamily}
{\medskip}
% Save the original \section command
\let\latexsection\section
% Simple redefinition of \section (including \section*)
\RenewDocumentCommand{\section}{sO{#3}m}{%
\IfBooleanTF{#1}
{\setcounter{example}{0}%
\latexsection*{#3}}
{\latexsection[#2]{#3}}%
}
\begin{document}
\section*{Section}
\begin{example}
A
\end{example}
\begin{example}
B
\end{example}
\section*{Another section}
\begin{example}
C
\end{example}
\begin{example}
D
\end{example}
\section{Numbered section}
\begin{example}
E
\end{example}
\begin{example}
F
\end{example}
\end{document}
Beide Techniken führen zu folgender Ausgabe:
Hinweise zur Implementierung benutzerdefinierter Umgebungen
In Ihrer realen Umgebung möchten Sie vielleicht so etwas (oder eine Variante) tun, um sicherzugehen, dass Ihre Eingabe keine unerwünschten Leerzeichen enthält. Dies ist eine allgemeine Bemerkung zu benutzerdefinierten Umgebungen; da \subsection*
beginnt normalerweise ein neuer Absatz – es sei denn, Sie verwenden dieeinlaufenLayouttyp – das \ignorespaces
wird hier beispielsweise wahrscheinlich nicht benötigt. Ebenso \ignorespacesafterend
sollte nach nicht erforderlich sein \par\medskip
, da \par
TeX in den vertikalen Modus versetzt wird, in dem Leerzeichen ignoriert werden – aber es sollte trotzdem nicht schaden.
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1}%
\rmfamily
\ignorespaces}
{\unskip
\par\medskip
\ignorespacesafterend}