![\@seccntformat 仅适用于部分](https://linux22.com/image/333657/%5C%40seccntformat%20%E4%BB%85%E9%80%82%E7%94%A8%E4%BA%8E%E9%83%A8%E5%88%86.png)
我想在部分编号和部分名称之间添加一个点。我使用了
\makeatletter
\renewcommand*{\@seccntformat}[1]{%
\csname the#1\endcsname .}
\makeatother
问题是,显然,它在小节编号和小节名称之间也加了一个点我不想要. 是否可以仅在节号和节之间添加点使用低级指令,即无需任何附加包?
答案1
使用\ifx\....
比较
\documentclass{article}
\makeatletter
\DeclareRobustCommand{\@seccntformat}[1]{%
\def\temp@@a{#1}%
\def\temp@@b{section}%
\ifx\temp@@a\temp@@b
\csname the#1\endcsname .\quad%
\else
\csname the#1\endcsname\quad%
\fi
}
\makeatother
\begin{document}
\section{Foo}
\subsection{Foo}
\end{document}
答案2
怎么样
\makeatletter
\def\@seccntformat#1{\@ifundefined{#1@cntformat}%
{\csname the#1\endcsname\quad}% default
{\csname #1@cntformat\endcsname}}% enable indiv. control
\newcommand\section@cntformat{\thesection.\quad}
\makeatother
请随意使用与 不同的间距量\quad
。
完整的 MWE:
\documentclass{article}
\makeatletter
\def\@seccntformat#1{\@ifundefined{#1@cntformat}%
{\csname the#1\endcsname\quad}% default
{\csname #1@cntformat\endcsname}}% enable indiv. control
\newcommand\section@cntformat{\thesection.\quad}
\makeatother
\begin{document}
\section{Hello World}
\subsection{Good Morning}
\subsubsection{Yawn}
\section{Goodbye World}
\end{document}
附录:原帖者要求我解释一下这段代码的工作原理。从\@seccntformat
LaTeX 内核提供的宏的默认定义开始会很有帮助(请参阅文件latex.ltx
):
\def\@seccntformat#1{\csname the#1\endcsname\quad}
宏的参数是形式为、、、或 的#1
字符串。因此,在展开时,宏将返回、等。请注意, 之前没有(“点”、“句号”)。section
subsection
subsubsection
paragraph
subparagraph
\thesection\quad
\thesubsection\quad
.
\quad
建议的宏的修改形式为:
\def\@seccntformat#1{\@ifundefined{#1@cntformat}%
{\csname the#1\endcsname\quad}% default
{\csname #1@cntformat\endcsname}}% enable indiv. control
重新定义的宏首先要检查宏是否\#1@cntformat
“未定义”。(如上所述,#1
是形式为 、 等的字符串section
。subsection
)如果\@ifundefined{#1@cntformat}
为真,则遵循“真”分支。例如,假设#1
设置为subsubsection
。假设\subsubsection@cntformat
之前未定义\@seccntformat
,则选择“真”分支,从而\@seccntformat
扩展为\thesubsubsection\quad
。
相反,如果#1
设置为section
,实际上在执行\section@cntformat
时就已经定义了。具体来说,上面给出的解决方案提供了:\@seccntformat
\newcommand\section@cntformat{\thesection.\quad}
\@ifundefined{#1@cntformat}
因此,接下来的“假”分支\@seccntformat#1
求值为\section@cntformat
,进而求值为\thesection.\quad
。
将这种方法与 Christian Hupfer 的答案中的方法进行比较很有用。Christian 的版本\@seccntformat
首先设置两个“临时”宏;第一个设置为section
,另一个设置为 (的内容)#1
。然后应用条件来比较两个宏。如果条件为“真”(只有当等于字符串\ifx
时才会如此),则执行;否则,执行 。如果您只打算重新定义格式化计数器的外观,这两种方法都同样好。如果由于某种尚未透露的原因,您还需要更改格式化的、、和计数器的外观,则上述方法可能更容易实现。让我声明一下,这句话不应该被理解为对 Christian 的解决方案的某种批评!#1
section
\thesection.\quad
\csname the#1\endcsname\quad
section
subsection
subsubsection
paragraph
subparagraph
答案3
在常规文档下,使用\pdfstrcmp
(e-TeX)应该可以工作:
\documentclass{article}
\makeatletter
\renewcommand{\@seccntformat}[1]{%
\csname the#1\endcsname% Print sectional counter
\ifnum\pdfstrcmp{#1}{section}=0 .\fi% If \section, print .
\quad% Space between number and title
}
\makeatother
\begin{document}
\section{A section}
\subsection{A subsection}
\subsubsection{A subsubsection}
\end{document}
由于\@seccntformat
接收分段单位计数器的单个参数,我们对该参数进行字符串比较section
。如果匹配\pdfstrcmp{<strA>}{<strB>}
则返回 0 。<strA>
<strB>
答案4
沒有\if
必須。
\documentclass{article}
\makeatletter
\def\sectionsuffix {.}
\def\subsectionsuffix {}
\def\subsubsectionsuffix{}
\def\paragraphsuffix {}
\renewcommand\@seccntformat[1]{\csname the#1\endcsname%
\csname#1suffix\endcsname\quad}
\makeatother
\begin{document}
\section{My section\label{s:B}}
\subsection{My subsection\label{s:BB}}
\subsubsection{My subsubsection}
In sections \ref{s:B} and \ref{s:BB}, a refed section does NOT end in a dot, which is essential.
\end{document}