最初の方法: パッチ適用\@startsection

最初の方法: パッチ適用\@startsection

私は会うたびにカウンターをリセットしようとしていますsection私はこれに基づいドキュメント

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

これにより、

ここに画像の説明を入力してください

つまり、機能するということです。

ただし、セクションの前の番号を削除したいので、*after を追加しました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}

しかし、今回はカウンターはリセットされず、

ここに画像の説明を入力してください

もし私が

\newcounter{example}[section*]

エラーが発生します

カウンター「section*」が定義されていません。

会ったときにカウンターをリセットするにはどうすればいいですかsection*?

答え1

はLaTeX のカウンターではない\newcounter{example}[section*]ため、でエラーが発生しました。はカウンターですが、 ではありません。section*sectionsection*

最初の方法: パッチ適用\@startsection

が呼び出されたとき(レベル 1 のセクション コマンド)にのみ、カウンターが 0 にリセットされる\@startsectionようにパッチを適用できます。以下は、番号なしのセクション コマンドに対してのみ呼び出され、セクション コマンドのレベルが 1(または)の場合にのみカウンターがリセットされるため機能します。\section*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}

2番目の方法:xparse再定義するために使用する\section

同じ結果を得るための別の方法は、xparse再定義するためにを使用することです。\section egregが行ったように、この答え\sectionこの手法の利点は、との実装の詳細に依存しないことです。したがって、が再定義されて LaTeX2e のコマンドではなくなった\@startsection場合でも、常に機能します。などのパッケージを使用してを再定義する場合や、単に最初の手法で行われた再定義を複数回積み重ねる場合は、これに該当する可能性があります。したがって、エンジニアリングの観点からは、この 2 番目の方法の方が優れていると言えます。\section\section\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}

どちらの手法でも、次の出力が得られます。

スクリーンショット

ユーザー定義環境の実装に関する注意事項

実際の環境では、入力に不要なスペースが入らないようにするために、次のようなこと(またはバリエーション)をしたい場合があります。これは、ユーザー定義の環境に関する一般的な注意です。\subsection*通常は新しい段落が始まるため、遭遇レイアウト タイプ —\ignorespacesたとえば、ここでは はおそらく必要ありません。同様に、 はTeX をスペースが無視される垂直モードに設定するため、\ignorespacesafterendの後には は必要ありませんが、それでも害はありません。\par\medskip\par

\newenvironment{example}[1][]
  {\refstepcounter{example}\par\medskip
   \subsection*{Example~\theexample. #1}%
   \rmfamily
   \ignorespaces}
  {\unskip
   \par\medskip
   \ignorespacesafterend}

関連情報