\@seccntformat 仅适用于部分

\@seccntformat 仅适用于部分

我想在部分编号和部分名称之间添加一个点。我使用了

\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} 

附录:原帖者要求我解释一下这段代码的工作原理。从\@seccntformatLaTeX 内核提供的宏的默认定义开始会很有帮助(请参阅文件latex.ltx):

\def\@seccntformat#1{\csname the#1\endcsname\quad}

宏的参数是形式为、、、或 的#1字符串。因此,在展开时,宏将返回、等。请注意, 之前没有(“点”、“句号”)。sectionsubsectionsubsubsectionparagraphsubparagraph\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是形式为 、 等的字符串sectionsubsection)如果\@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 的解决方案的某种批评!#1section\thesection.\quad\csname the#1\endcsname\quadsectionsubsectionsubsubsectionparagraphsubparagraph

答案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}

在此处输入图片描述

相关内容