使用 pdfLaTeX 和 时,如何修复文档分区标题中的突出部分titlesec
?
在这个答案我提供一个临时补丁,使字符突出能够在部分划分的标题中正常工作(\section
、、等)\section*
。\paragraph
\subparagraph*
例如:
\documentclass[a4paper]{book}
\usepackage[utf8]{inputenc}
\usepackage[showframe,pass]{geometry}
\usepackage{cfr-lm}
\usepackage[protrusion=true,factor=3000]{microtype}
\makeatletter
\def\@ssect#1#2#3#4#5{% modified from latex.ltx - for starred sections below chapter level
\@tempskipa #3\relax
\ifdim \@tempskipa>\z@
\begingroup
#4{%
\interlinepenalty \@M \noindent #5\@@par}%
\endgroup
\else
\def\@svsechd{#4{%
\cfr@microfix@sec{#1}#5}}%
\fi
\@xsect{#3}}
\def\@sect#1#2#3#4#5#6[#7]#8{% modified from latex.ltx - for unstarred sections below chapter level
\ifnum #2>\c@secnumdepth
\let\@svsec\@empty
\else
\refstepcounter{#1}%
\protected@edef\@svsec{\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup
#6{%
\@hangfrom{\cfr@microfix@sec{#3}\@svsec}%
\interlinepenalty \@M #8\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}%
\else
\def\@svsechd{%
#6{\cfr@microfix@sec{#3}%
\@svsec #8}%
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}}%
\fi
\@xsect{#5}}
\newcommand*\cfr@microfix@sec[1]{%
\ifdim#1=0pt
\noindent
\else
\hskip #1\relax
\fi}
\makeatother
\begin{document}
\let\cleardoublepage\relax
\chapter{`Charlie}
\chapter*{`Charlie}
\section{Charlie nss}
\noindent {\Large\bfseries 1.1}
\section*{`Charlie ss}
\subsection{Charlie nsss}
\subsection*{`Charlie sss}
\subsubsection{`Charlie nsss}
\subsubsection*{`Charlie ssss}
\paragraph{`Charlie np} paragraph
\paragraph*{`Charlie sp} paragraph
\subparagraph{`Charlie nsp} subparagraph
\subparagraph*{`Charlie ssp} subparagraph
\noindent{\Large\bfseries`Charlie\par}
\noindent `Charlie
\end{document}
此补丁似乎适用于标准类(最低限度测试)和 KOMA 类(极低限度测试)。对于 Memoir 来说,无需补丁,因为其中的突起可以开箱即用,或者对于 以上的文档划分\section
,例如\chapter
和\chapter*
。
此外,补丁应该- 理论上 - 使用定制版本\@section
等。
但是,如果加载它则不起作用,titlesec
因为该包显然使用了完全不同的机制来格式化标题。
也就是说,添加
\usepackage{titlesec}
补丁序言中断了该补丁:
我甚至搞不清楚代码的哪一部分才是导致问题的原因。\ttlh@<shape>#1#2#3#4#5#6#7#8
例如,如果我修改了 的定义,然后用 重新定义一个节标题\titleformat{\paragraph}[runin]...
,那么即使在定义的最开始处插入一个左引号,我也无法恢复突出部分:
\def\ttlh@runin#1#2#3#4#5#6#7#8{%
`x\vskip 0pt
\global\@noskipsectrue
\gdef\ttl@makeline##1{##1}%
\ttl@changecentercr
#1{\ifhmode\ttl@hmode@error\fi
\global\sbox\ttl@box{%
\ttl@calc\hspace{#6}%
\ifttl@label{\strut#2}\ttl@calc\hspace{#3}\fi
#4{#8}#5\unskip}}%
\gdef\@svsechd{\unhbox\ttl@box}}
我也搞不清楚其中是否有一个\ttl@spacing...
是罪魁祸首。我找不到解释实现的文档,而且包文件本身的注释对代码也没有多大帮助,至少对我来说是这样。不过,我甚至不确定这是否titlesec.sty
是要查找的正确文件。
我理解这种混乱是该软件包试图利用现有的分段命令的结果,以便至少在理论上能够与非标准类配合使用。但了解其难以理解的原因并不会让它变得更容易理解 :(。