Erste Methode: Patchen\@startsection

Erste Methode: Patchen\@startsection

Ich versuche, den Zähler jedes Mal zurückzusetzen, wenn ich sectionauf 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

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

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. sectionist, aber nicht section*.

Erste Methode: Patchen\@startsection

Sie können einen Patch \@startsectionso 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: xparseNeudefinieren\section

Eine andere Möglichkeit, das gleiche Ergebnis zu erzielen, besteht darin, zu verwenden, xparseum neu zu definieren \section, wie es egreg indiese Antwort. Der Vorteil dieser Technik besteht darin, dass sie nicht von Implementierungsdetails von \sectionund abhängt \@startsection. Daher sollte sie immer funktionieren, auch wenn \sectionneu definiert wurde und nicht mehr der Befehl von LaTeX2e ist. Dies kann der Fall sein, wenn Sie mithilfe eines Pakets wie \sectionneu 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.\sectiontitlesec

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

Bildschirmfoto

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 \ignorespaceswird hier beispielsweise wahrscheinlich nicht benötigt. Ebenso \ignorespacesafterendsollte nach nicht erforderlich sein \par\medskip, da \parTeX 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}

verwandte Informationen