使用 pdfLaTeX 和 titlesec 时,如何修复文档分区标题中的突出部分?

使用 pdfLaTeX 和 titlesec 时,如何修复文档分区标题中的突出部分?

使用 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是要查找的正确文件。

我理解这种混乱是该软件包试图利用现有的分段命令的结果,以便至少在理论上能够与非标准类配合使用。但了解其难以理解的原因并不会让它变得更容易理解 :(。

答案1

我使用的 microtype 包如下:

\usepackage[protrusion=true, factor=500]{microtype}

虽然不完美,但效果还是不错的。我用 XeLaTeX 试了一下你的代码,效果更好。希望对你有帮助。

在此处输入图片描述

相关内容