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