我读到这classicthesis
有点与 KOMA 脚本不兼容,尽管如此,我正在处理一个使用scrbook
和classicthesis
(调用 titlesec
)的大型文档,这对在过去两年中已经产生了相当令人满意的结果,满足了我的需求。直到今天,MiKTeX 更新了它的一些软件包,导致它无法\subparagraph
在我的文档中使用 s(而其他分段命令似乎仍然有效)。
我设法将错误追溯到特定的更新:
titlesec
2011 年的版本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}
或者你可以使用\titleformat
包titlespacing
提供的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}