描述
这个问题几乎基于以下问题,
如何防止两个节标题之间出现分页符. 给出的答案那里解释说问题在于\color
,它whatsit
在垂直模式下添加了一段时间(垂直可破坏)。
解决方案是使用\textcolor
,它接受两个参数(颜色和文本),并且不插入whatsit
。描述如下:
其之所以有效,是因为 \@startsection 的第六个参数中的最后一条指令将章节标题(带有编号)读取为一个括号组,然后 \textcolor 可以将其解释为其第二个参数。
答案使用标准部分定义。我想要一个使用titlesec
定义的解决方案(explicit
启用参数)。
细节并非问题的真正组成部分但可能很重要
我使用逻辑来为标题中的某些标签着色如何编写条件着色命令来区分分段命令中的变量和正文中的变量?:
\titleformat{\section}[hang]{\colorspecialstagstrue\color{black}\Huge\bfseries}{}{0pt}{\thesection\quad#1}
\newif\ifcolorspecials
\DeclareRobustCommand{\specialtag}[1]{%
\textbf{\textit{{\ifcolorspecials\color{orange}\fi #1}}}%
}%
例子
请注意,标题编号(标签)\thesection
通常应位于参数 4 中,因为参数 5 允许您轻松输入标签和标题文本之间的水平分隔。我在实际文档中(使用 TikZ)有高级代码,因此有必要将其包含在参数 6 中。
\documentclass{article}
\usepackage{fontspec}
\usepackage[explicit]{titlesec}
\usepackage{xcolor}
\usepackage{lipsum}
% Title/Heading Formatting
% SECTION
\titleformat{\section}[hang]{\color{black}\Huge\bfseries}{}{0pt}{\thesection\quad#1} % \thesection "incorrectly" in 6th param due to tikz formatting in actual document.
\titlespacing{\section}{0pt}{40pt}{5ex plus .2ex}
% SUBSECTION
\titleformat{\subsection}[hang]{\color{red}\Large\bfseries}{\thesubsection\quad}{0pt}{#1} % Color in 3rd param adds whatsit messing up nobreak mechanism between titles/headings
\titlespacing*{\subsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
% SUBSUBSECTION
\titleformat{\subsubsection}[hang]{\color{red}\normalsize\bfseries}{\thesubsubsection\quad}{0pt}{#1}
\titlespacing*{\subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\begin{document}
\section{Family}
\lipsum[1-4]
More junk to take up space and hopefully force a page break between Genus and Species such that this example illustrates the problem.
\subsection{Genus}
\subsubsection{Species}
\end{document}
输出
答案1
就像您对 的指定一样\section
,您可以将所有打印命令移到最后一个参数中。这样您就可以用 为它们着色\textcolor
。在您的示例中,您将获得
在第二页,而是在部分命令之间有一个分页符。
\documentclass{article}
\usepackage{fontspec}
\usepackage[explicit]{titlesec}
\usepackage{xcolor}
\usepackage{lipsum}
% Title/Heading Formatting
% SECTION
\titleformat{\section}[hang]{\Huge\bfseries}{}{0pt}{\textcolor{black}{\thesection\quad#1}}
\titlespacing{\section}{0pt}{40pt}{5ex plus .2ex}
% SUBSECTION
\titleformat{\subsection}[hang]{\Large\bfseries}{}{0pt}{\textcolor{red}{\thesubsection\quad#1}}
\titlespacing*{\subsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
% SUBSUBSECTION
\titleformat{\subsubsection}[hang]{\normalsize\bfseries}{}{0pt}{\textcolor{red}{\thesubsubsection\quad #1}}
\titlespacing*{\subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\begin{document}
\section{Family}
\lipsum[1-4]
More junk to take up space and hopefully force a page break between Genus and Species such that this example illustrates the problem.
\subsection{Genus}
\subsubsection{Species}
\end{document}
可能您需要在标记命令中执行类似的事情:
\DeclareRobustCommand{\specialtag}[1]{%
\textbf{\textit{{\ifcolorspecials\textcolor{orange}{#1}\else #1\fi}}}%
}%
答案2
处理章节标题格式的最佳方法是使用最后一个参数为一个参数的宏\titleformat
。颜色规范应仅放在此辅助宏中。
这是一个例子。
\documentclass{article}
\usepackage{fontspec}
\usepackage{titlesec}
\usepackage{xcolor}
\usepackage{lipsum}
% Title/Heading Formatting
% SECTION
\titleformat{\section}[hang]
{\Huge\bfseries\global\let\thisnumber\relax}
{\gdef\thisnumber{\thesection\quad}}
{0pt}
{\dosection}
\titlespacing{\section}{0pt}{40pt}{5ex plus .2ex}
% SUBSECTION
\titleformat{\subsection}[hang]
{\Large\bfseries\global\let\thisnumber\relax}
{\gdef\thisnumber{\thesubsection\quad}}
{0pt}
{\dosubsection}
\titlespacing*{\subsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
% SUBSUBSECTION
\titleformat{\subsubsection}[hang]
{\normalsize\bfseries\global\let\thisnumber\relax}
{\gdef\thisnumber{\thesubsubsection\quad}}
{0pt}
{\dosubsubsection}
\titlespacing*{\subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\newcommand{\dosection}[1]{%
\textcolor{black}{\thisnumber#1}%
}
\newcommand{\dosubsection}[1]{%
\textcolor{red}{\thisnumber#1}%
}
\newcommand{\dosubsubsection}[1]{%
\textcolor{red}{\thisnumber#1}%
}
\begin{document}
\section{Family}
\lipsum[1-4]
More junk to take up space and hopefully force a page break between Genus and Species such
that this example illustrates the problem.
\subsection{Genus}
\subsubsection{Species}
\section*{Test}
\subsection*{Test}
\subsubsection*{Test}
\end{document}
\dosection
我还展示了未编号部分如何按预期工作。在和类似宏的定义中,您可以测试是否\thisnumber
是\relax
,而不仅仅是\thisnumber
使用
\ifx\thisnumber\relax
<code for a starred section>
\else
<code for a numbered section using \thisnumber>
\fi