私は会うたびにカウンターをリセットしようとしています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*
section
section*
最初の方法: パッチ適用\@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
\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}
どちらの手法でも、次の出力が得られます。
ユーザー定義環境の実装に関する注意事項
実際の環境では、入力に不要なスペースが入らないようにするために、次のようなこと(またはバリエーション)をしたい場合があります。これは、ユーザー定義の環境に関する一般的な注意です。\subsection*
通常は新しい段落が始まるため、遭遇レイアウト タイプ —\ignorespaces
たとえば、ここでは はおそらく必要ありません。同様に、 はTeX をスペースが無視される垂直モードに設定するため、\ignorespacesafterend
の後には は必要ありませんが、それでも害はありません。\par\medskip
\par
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1}%
\rmfamily
\ignorespaces}
{\unskip
\par\medskip
\ignorespacesafterend}