第一種方法:打補丁\@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}

這將生成

在此輸入影像描述

這意味著它有效。

但是,現在我想刪除部分之前的數字,所以我*在之後添加了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

達到相同結果的另一種方法是使用xparsein order to redefine \section,就像egreg在這個答案。這種技術的優點是它不依賴和\section的實現細節\@startsection,因此即使\section已經被重新定義並且不再是 LaTeX2e 的命令,它也應該始終有效 - 如果您使用諸如, 或 之類的包\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例如,這裡可能不需要。同樣,\ignorespacesafterend在 之後也不需要\par\medskip,因為\par將 TeX 置於垂直模式,其中空格被忽略 - 但它不應該造成損害。

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

相關內容