使用 KOMA 格式化单个章节标题时间距错误

使用 KOMA 格式化单个章节标题时间距错误

我想格式化只有第一个使用 KOMA 脚本以不同的方式显示文档中的章节标题。我想更改字体和章节前缀的存在。由于 KOMA 显然不提供任何恢复字体或选项的选项,答案建议将相应的\chapter命令封装到一个组中。如果我想更改第二章节标题。

\documentclass{scrreprt}
\usepackage{blindtext}
\KOMAoption{parskip}{false}
\begin{document}

\chapter{This}
\blindtext

\section{Foo}
\blindtext

\section{Bar}
\blindtext

\begingroup
\KOMAoption{chapterprefix}{true}
\setkomafont{chapter}{\centering\large\rmfamily}
\chapter{That}
\endgroup
\blindtext

\section{Foo}
\blindtext

\section{Bar}
\blindtext

\end{document}

但是,如果我实际改变了第一的章节标题,然后事情就出错了。

\documentclass{scrreprt}
\usepackage{blindtext}
\KOMAoption{parskip}{false}
\begin{document}

\begingroup
\KOMAoption{chapterprefix}{true}
\setkomafont{chapter}{\centering\large\rmfamily}
\chapter{This}
\endgroup
\blindtext

\section{Foo}
\blindtext

\section{Bar}
\blindtext

\chapter{That}
\blindtext

\section{Foo}
\blindtext

\section{Bar}
\blindtext

\end{document}

当我编译后一个文档时,第一段的间距被破坏了两个方面。首先,第一行是缩进的,而这不应该发生。其次,第一节的垂直间距比它应该的要小得多。

看起来是\chapter在第一次出现在文档中时设置了一些东西,但这些东西在 中丢失了\endgroup。不幸的是,我一点头绪都没有什么可能会成功。我很乐意听取关于如何进行的建议。

答案1

您可以修补\chapterformat\chapterlineswithprefixformat

\documentclass{scrreprt}
%\providecommand*\Ifstr{\ifstr}% needed up to and including KOMA-Script version 3.27, see https://komascript.de/faq_deprecatedif
\usepackage{blindtext}
%\KOMAoption{parskip}{false}% default

\newif\ifspecialchapter
\newcommand\specialchapter{%
  \specialchaptertrue%
  \KOMAoption{chapterprefix}{true}%
}
\newcommand\defaultchapter{%
  \specialchapterfalse%
  \KOMAoption{chapterprefix}{false}%
}
\usepackage{xpatch}
\xpretocmd\chapterlineswithprefixformat
  {\Ifstr{#1}{chapter}{\ifspecialchapter\large\rmfamily\fi}{}}%
  {}{\PatchFailedI}
\xpretocmd\chapterformat
  {\ifspecialchapter\centering\large\rmfamily\fi}
  {}{\PatchFailedII}

\begin{document}
\specialchapter
\chapter{That}
\defaultchapter
\blindtext

\section{Foo}
\blindtext
\section{Bar}
\blindtext

\chapter{This}
\blindtext
\section{Foo}
\blindtext
\section{Bar}
\blindtext
\end{document}

结果:

在此处输入图片描述

或者你可能想要

在此处输入图片描述

然后使用

\documentclass{scrreprt}
%\providecommand*\Ifstr{\ifstr}% needed up to and including KOMA-Script version 3.27, see https://komascript.de/faq_deprecatedif
\usepackage{blindtext}
%\KOMAoption{parskip}{false}% default

\newif\ifspecialchapter
\newcommand\specialchapter{%
  \specialchaptertrue%
  \KOMAoption{chapterprefix}{true}%
}
\newcommand\defaultchapter{%
  \specialchapterfalse%
  \KOMAoption{chapterprefix}{false}%
}
\usepackage{xpatch}
\xpretocmd\chapterlineswithprefixformat
  {\Ifstr{#1}{chapter}{\ifspecialchapter\centering\large\rmfamily\fi}{}}%
  {}{\PatchFailedI}
\xpretocmd\chapterformat
  {\ifspecialchapter\large\rmfamily\fi}
  {}{\PatchFailedII}

\begin{document}
\specialchapter
\chapter{That}
\defaultchapter
\blindtext

\section{Foo}
\blindtext
\section{Bar}
\blindtext

\chapter{This}
\blindtext
\section{Foo}
\blindtext
\section{Bar}
\blindtext
\end{document}

补充说明:不要\centering在 的参数中使用\setkomafont


您也可以使用内部命令\if@chapterprefix。但请注意,内部命令将来可能会发生变化。

\documentclass{scrreprt}
%\providecommand*\Ifstr{\ifstr}% needed up to and including KOMA-Script version 3.27, see https://komascript.de/faq_deprecatedif
\usepackage{blindtext}
%\KOMAoption{parskip}{false}% default

\newif\ifspecialchapter
\newif\ifdefaultchapterprefix
\makeatletter
\newcommand\specialchapter{%
  \specialchaptertrue%
  \if@chapterprefix\defaultchapterprefixtrue\else\defaultchapterprefixfalse\fi%
  \KOMAoption{chapterprefix}{true}%
}
\newcommand\defaultchapter{%
  \ifspecialchapter%
    \ifdefaultchapterprefix\@chapterprefixtrue\else\@chapterprefixfalse\fi%
  \fi%
  \specialchapterfalse%
}
\makeatother
\usepackage{xpatch}
\xpretocmd\chapterlineswithprefixformat
  {\Ifstr{#1}{chapter}{\ifspecialchapter\centering\large\rmfamily\fi}{}}%
  {}{\PatchFailedI}
\xpretocmd\chapterformat
  {\ifspecialchapter\large\rmfamily\fi}
  {}{\PatchFailedII}

\begin{document}
\specialchapter
\chapter{That}
\defaultchapter
\blindtext

\section{Foo}
\blindtext
\section{Bar}
\blindtext

\chapter{This}
\blindtext
\section{Foo}
\blindtext
\section{Bar}
\blindtext
\end{document}

结果与第二个示例相同。

相关内容