我試圖在每次遇到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}
這將生成
這意味著它有效。
但是,現在我想刪除部分之前的數字,所以我*
在之後添加了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
你得到一個錯誤,\newcounter{example}[section*]
因為section*
is not a counter in LaTeX.section
是,但不是section*
。
第一種方法:打補丁\@startsection
您可以修補\@startsection
,以便調用when(這是級別1的\section*
分段命令),僅在這種情況下,您的example
計數器才會重設為0。\@ssect
,並且我們僅在以下情況下重置計數器切片命令的等級為 1(\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}
第二種方法:使用xparse
重新定義\section
達到相同結果的另一種方法是使用xparse
in order to redefine \section
,就像egreg在這個答案。這種技術的優點是它不依賴和\section
的實現細節\@startsection
,因此即使\section
已經被重新定義並且不再是 LaTeX2e 的命令,它也應該始終有效 - 如果您使用諸如, 或 之類的包\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
例如,這裡可能不需要。同樣,\ignorespacesafterend
在 之後也不需要\par\medskip
,因為\par
將 TeX 置於垂直模式,其中空格被忽略 - 但它不應該造成損害。
\newenvironment{example}[1][]
{\refstepcounter{example}\par\medskip
\subsection*{Example~\theexample. #1}%
\rmfamily
\ignorespaces}
{\unskip
\par\medskip
\ignorespacesafterend}