첫 번째 방법: 패치\@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*?

답변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}

두 번째 방법: xparse재정의에 사용\section

동일한 결과를 얻는 또 다른 방법은 egreg가 했던 것처럼 xparse재정의하기 위해 사용하는 것입니다.\section이 답변. 이 기술의 장점은 \section및 의 구현 세부 사항에 의존하지 않으므로 재정의되어 더 이상 LaTeX2e의 명령이 아니더라도 \@startsection항상 작동해야 한다는 것 입니다 . 단순히 첫 번째 기술로 수행한 여러 재정의를 쌓으려고 하면 됩니다. 따라서 엔지니어링 관점에서는 이 두 번째 방법이 더 낫다고 말하고 싶습니다.\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}

관련 정보