titlesec 的更新 2.10.2 → 2.11 导致 scrbook+classicthesis 中的子段落无法正常工作

titlesec 的更新 2.10.2 → 2.11 导致 scrbook+classicthesis 中的子段落无法正常工作

我读到这classicthesis有点与 KOMA 脚本不兼容,尽管如此,我正在处理一个使用scrbookclassicthesis(调用 titlesec)的大型文档,这对在过去两年中已经产生了相当令人满意的结果,满足了我的需求。直到今天,MiKTeX 更新了它的一些软件包,导致它无法\subparagraph在我的文档中使用 s(而其他分段命令似乎仍然有效)。

我设法将错误追溯到特定的更新:
titlesec2011 年的版本2.10.2→ 当前版本:2.11

该问题的 MWE 为:

\documentclass{scrbook}

\usepackage{classicthesis}

\begin{document}
    %\paragraph{Test} Test. % Works (together with \subsubsection, \subsection, …).
    \subparagraph{Test} Test. % Does not work.
\end{document}

LaTeX 中出现的错误如下:

错误

实际上,我的文档中只有一个\subparagraph打算更改为\paragraph,这有点解决方法。尽管如此,我很好奇这是否只是 KOMA-script 和 之间提到的不兼容性的必然结果titlesec。我想新版本的包中可能存在更严重的问题,因为之前的包没有导致这种错误。我尝试手动比较titlesec.sty两个版本的代码,但我仍然无法找到直接原因或可能的解决方案来解决这个问题,所以也许这里有人可以帮忙。

答案1

您可以\RedeclareSectionCommands{subparagraph}在之后使用\usepackage{classicthesis}

\documentclass{scrbook}
\usepackage{classicthesis}
\RedeclareSectionCommands{subparagraph}

\usepackage{blindtext}
\begin{document}
\Blinddocument
\subparagraph{Test} Test.
\end{document}

在此处输入图片描述

或者你可以使用\titleformattitlespacing提供的titlesec

\documentclass{scrbook}
\usepackage{classicthesis}
\titleformat{\subparagraph}[runin]
    {\usekomafont{disposition}}{\thesubparagraph}{1ex}{}
\makeatletter
\titlespacing{\subparagraph}{\scr@parindent}{3.25ex plus 1ex minus .2ex}{1em}
\makeatother

\usepackage{blindtext}
\begin{document}
\Blinddocument
\subparagraph{Test} Test.
\end{document}

从 KOMA-Script 3.27.3175(3.27 版的预发布版本)开始,您可以scrhack使用新选项加载包standardsections。预发布版本可从KOMA-Script 网站

\documentclass{scrbook}[2019/07/23]
\usepackage[standardsections]{scrhack}% needs at least version 3.27.3175
\usepackage{classicthesis}
\usepackage{blindtext}
\begin{document}
\Blinddocument
\subparagraph{Test} Test. \KOMAScriptVersion
\end{document}

在此处输入图片描述


关于下一个 KOMA-Script 版本(3.27)的补充说明:

请注意,该titlesec解决方法将从下一版本(版本 3.27)中的 KOMA-Script 类的代码中删除,请参阅https://sourceforge.net/p/koma-script/code/3173/启用 KOMA 脚本版本(德语)。

上述建议仍然适用于预发行版 3.27.3175,但与 KOMA-Script 类一起使用titlesec也会导致类似于问题中的消息的错误消息。

从预发布版本 3.27.3175 开始,软件包scrhack提供了选项standardsections。使用\usepackage[standardsections]{scrhack}分段命令将使用与标准类中相同的定义重新定义。请注意,这还会禁用某些 KOMA-Script 命令和功能,例如\RedeclareSectionCommand\sectionformat和选项headings

在此处输入图片描述

答案2

哈维尔·贝佐斯的评论我设法进行了一次肮脏的攻击,但作为快速修复,它消除了错误:

\documentclass{scrbook}

% From ‘scrkernel-miscellaneous.dtx’:
\makeatletter
\AfterPackage{titlesec}{%
% Hack getestet mit \textsf{titlesec} 2011/12/15 v2.10.0 bis 2017/07/16% Hack getestet mit \textsf{titlesec} 2011/12/15 v2.10.0 bis 2016/03/21
% v2.11. Daher bis zu diesem Datum freigeschaltet.% v2.10.2. Daher bis zu diesem Datum freigeschaltet.
%   \changes{v3.20}{2016/03/22}{\textsf{titlesec}-Hack auch für Version
%     2016/03/15}^^A
%   \changes{v3.20}{2016/03/24}{\textsf{titlesec}-Hack auch für Version
%     2016/03/21}^^A
%   \changes{v3.20}{2019/07/23}{\textsf{titlesec}-Hack auch für Version%%
%     2019/03/16}^^A%%
%    \begin{macrocode}
  \@ifpackagelater{titlesec}{2019/07/17}{%\@ifpackagelater{titlesec}{2016/03/22}{%
    \ClassInfo{\KOMAClassName}{%
      Manual hack for https://tex.stackexchange.com/q/500970 problem has failed:\MessageBreak%%
      Deactivating the `titlesec' workaround,\MessageBreak
      because package is newer than expected%
    }%
  }{%
    \ClassWarning{\KOMAClassName}{%
      Manual hack for https://tex.stackexchange.com/q/500970 problem:\MessageBreak%%
      Activating an ugly workaround for a missing\MessageBreak
      feature of package `titlesec`%
    }%
    \def\scr@ttl@@extract#1\scr@startsection#2#3#4#5#6#7#8{%
      \@tempskipa=#5
      \@tempskipb=#6
      \ifdim\@tempskipa<\z@
        \toks@{\titlespacing*#8{#4}}%
        \@tempskipa-\@tempskipa
      \else
        \toks@{\titlespacing#8{#4}}%
      \fi
      \@ifundefined{ttl@space}{}{%
        \ttl@assign\@tempskipa*\ttl@space\relax\beforetitleunit}%
      \ifdim\@tempskipb<\z@
        \if@tempswa
          \titleformat#8[runin]%
             {\ttl@fonts\ttl@sizes{#3}}{\@seccntformat{#2}}%
             {\z@}\ttl@passexplicit
        \else
          \titleformat#8[runin]%
             {#7}{\@seccntformat{#2}}%
             {\z@}\ttl@passexplicit
        \fi
        \@tempskipb-\@tempskipb
      \else
        \if@tempswa
          \titleformat#8%
            {\ttl@fil\ttl@fonts\ttl@sizes{#3}}{\@seccntformat{#2}}%
            {\z@}\ttl@passexplicit 
        \else
          \titleformat#8%
            {#7}{\@seccntformat{#2}}%
            {\z@}\ttl@passexplicit
        \fi
        \@ifundefined{ttl@space}{}{%
          \ttl@assign\@tempskipb*\ttl@space\relax\aftertitleunit}%
      \fi
      \edef\ttl@a{\the\toks@{\the\@tempskipa}{\the\@tempskipb}}
      \ttl@a}%
    \expandafter\scr@ttl@@extract\scr@ttl@saved@section\section
    \expandafter\scr@ttl@@extract\scr@ttl@saved@subsection\subsection
    \expandafter\scr@ttl@@extract\scr@ttl@saved@subsubsection\subsubsection
    \expandafter\scr@ttl@@extract\scr@ttl@saved@paragraph\paragraph
    \expandafter\scr@ttl@@extract\scr@ttl@saved@subparagraph\subparagraph
    \let\scr@ttl@saved@section\relax
    \let\scr@ttl@saved@subsection\relax
    \let\scr@ttl@saved@subsubsection\relax
    \let\scr@ttl@saved@paragraph\relax
    \let\scr@ttl@saved@subparagraph\relax
    \let\scr@ttl@@extract\relax
  }%
}
\makeatother

\usepackage{classicthesis}

\begin{document}
    \paragraph{Test} Test. % Works (together with \subsubsection, \subsection, …).
    \subparagraph{Test} Test. % Now also works.
\end{document}

相关内容