部分编号的字符串永远不会为空

部分编号的字符串永远不会为空

我想在 Koma 脚本文档的节号和节标题之间添加更多空格。编辑节行以始终添加空格会导致明显的问题,即未编号的节会缩进一点。为此,我想使用类似\ifstremptyform 的函数etoolbox来查看节是否已编号。但似乎这个字符串永远不会为空。

梅威瑟:下列

\documentclass{scrreprt}

\usepackage{etoolbox}
\usepackage{showframe}

\setkomafont{section}{\normalfont\Large\bfseries}
\renewcommand\sectionlinesformat[4]{%
    {\ifstrempty{#3}{}{#3\ }}{#4}%
}

\begin{document}
\section*{Introduction}
\section{First section}
\end{document}

生产 结果

其他方法也\@ifnotempty产生相同的输出。

是否有适当的方法来检查 Koma 文中某个部分是否未编号?

答案1

首先:对于您的情况,您应该使用@Ivan 的建议,即重新定义\sectionformat。然后仅为编号部分插入空格。如果这些标题应该在编号和标题之间获得额外的空格,您也可以重新定义\subsectionformat和。\subsubsectionformat

section如果您确实需要检查,如果或subsection标题没有数字subsubsection,您可以使用\Ifstr{#3}{}{}{\ }\Ifstr由 KOMA-Script 类提供。

\documentclass{scrreprt}
\usepackage{showframe}

\setkomafont{section}{\normalfont\Large\bfseries}
\makeatletter
\renewcommand\sectionlinesformat[4]{%
    \@hangfrom{\hskip #2#3\Ifstr{#3}{}{}{\ }}{#4}%
}
\makeatother

\begin{document}
\chapter{Foo}
\addsec*{Introduction}
\section{First section}
\subsection{First subsection}
\section{Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Etiam lobortis facilisis sem.}

\addsec{Unnumbered Section}
\subsection*{Unnumbered subsection}
\end{document}

\sectionlinesformat在或的定义中,\sectioncatchphraseformat您也可以使用\IfUseNumber{\ }{}。此命令由 KOMA-Script 类提供。

\documentclass{scrreprt}
\usepackage{showframe}

\setkomafont{section}{\normalfont\Large\bfseries}
\makeatletter
\renewcommand\sectionlinesformat[4]{%
    \@hangfrom{\hskip #2#3\IfUseNumber{\ }{}}{#4}%
}
\makeatother

\begin{document}
\chapter{Foo}
\addsec*{Introduction}
\section{First section}
\subsection{First subsection}
\section{Lorem ipsum dolor sit amet, consectetuer adipiscing
elit. Etiam lobortis facilisis sem.}

\addsec{Unnumbered Section}
\subsection*{Unnumbered subsection}
\end{document}

请注意,这两条建议都会为编号章节、小节和小小节增加空间。

答案2

您应该重新定义\sectionformat命令:

\documentclass{scrreprt}

\usepackage{showframe}

\setkomafont{section}{\normalfont\Large\bfseries}
\renewcommand*{\sectionformat}{\thesection\autodot\hspace{1.5em}}

\begin{document}
 \section*{Introduction}
 \section{First section}
\end{document}

在此处输入图片描述

如果您希望通过以下方式解决问题etoolbox

\usepackage{etoolbox}
\patchcmd{\sectionformat}{\enskip}{\hspace{1.5em}}{}{}

答案3

如果我添加\showtokens{#3}重新定义\sectionformat,我得到\section*{Introduction}

> \@empty .
\sectionlinesformat #1#2#3#4->\showtokens {#3}
                                              {\ifstrempty {#3}{}{#3\ }}{#4}
l.13 \section*{Introduction}

并且,在的情况下\section{First section}

> \@svsec .
\sectionlinesformat #1#2#3#4->\showtokens {#3}
                                              {\ifstrempty {#3}{}{#3\ }}{#4}
l.14 \section{First section}

\@empty因此,我们看到,当使用 *-variant 时,该类通过了,而不是什么都没有通过。然后您可以将\ifdefvoid其用作测试。

\documentclass{scrreprt}

\usepackage{etoolbox}
\usepackage{showframe}

\setkomafont{section}{\normalfont\Large\bfseries}
\renewcommand\sectionlinesformat[4]{%
    {\ifdefvoid{#3}{}{#3\ }}{#4}%
}

\begin{document}
\section*{Introduction}
\section{First section}
\end{document}

在此处输入图片描述

相关内容