我正在使用标题安全带有选项的软件包toctitles
,该选项修改了分段命令的可选参数,以便此可选参数仅用于标题;然后非可选参数将用于正文和目录。不使用该toctitles
选项将导致可选参数也用于目录。
我需要为三个目标分别设置不同的参数:正文、标题和目录。这可能吗?原因是我需要在正文和目录中使用不同的换行符,并且我需要能够为标题指定不同的文本。如果有上下文感知的换行命令(目录与正文),那么它们将提供替代解决方案。
答案1
我们可以插入一个额外的可选参数,允许单独指定 ToC/header/title \section
。
\ttl@straight@i
(由 - 默认 - 类下的部门单位调用)的原始定义straight
如下所示:
\def\ttl@straight@i#1[#2]#3{%
\def\@currentlabelname{#2}% for nameref
\gdef\ttl@savemark{\csname#1mark\endcsname{#3}}%
\let\ttl@savewrite\@empty
\def\ttl@savetitle{#3}%
\gdef\thetitle{\csname the#1\endcsname}%
\if@noskipsec \leavevmode \fi
\par
\ttl@labelling{#1}{#2}%
\ttl@startargs\ttl@straight@ii{#1}{#3}}
它需要 3 个参数,并根据其处理方式titlesec
,所有这些都是必需的(但可以为空)。我们可以在它们之间插入一个真正可选的参数,使用xparse
:
\makeatletter
\RenewDocumentCommand{\ttl@straight@i}{m R[]{} o m}{%
\def\@currentlabelname{#2}% for nameref
\gdef\ttl@savemark{\csname#1mark\endcsname{#4}}%
\let\ttl@savewrite\@empty
\IfNoValueTF{#3}
{\def\ttl@savetitle{#4}}% Optional #3 argument NOT supplied
{\def\ttl@savetitle{#3}}% Optional #3 argument supplied
\gdef\thetitle{\csname the#1\endcsname}%
\if@noskipsec \leavevmode \fi
\par
\ttl@labelling{#1}{#2}%
\ttl@startargs\ttl@straight@ii{#1}{#4}}
\makeatother
该参数R[]{}
是一个必需参数,由[
..分隔,默认值为]
空{}
;O{}
在这里同样适用。但是,o
现在的包含允许我们使用以下任一方法:
\section[<header>][<ToC>]{<title>}
\section[<header>]{<ToC-and-title>}
\section{<header-ToC-and-title>}
我们只需要\ttl@savetitle
根据是否[<ToC>]
供应来决定要存储什么。
这是一个完整且最小的例子:
\documentclass{article}
\usepackage[paper=a6paper]{geometry}% Just for this example
\usepackage[pagestyles,toctitles]{titlesec}
\usepackage{xparse}
\newpagestyle{main}{
\headrule% Include a rule
\sethead{\thesection.~\sectiontitle}% Left header
{} % Center header
{\normalsize \thepage} % Right header
}
\pagestyle{main}
\makeatletter
\RenewDocumentCommand{\ttl@straight@i}{m R[]{} o m}{%
\def\@currentlabelname{#2}% for nameref
\gdef\ttl@savemark{\csname#1mark\endcsname{#4}}%
\let\ttl@savewrite\@empty
\IfNoValueTF{#3}
{\def\ttl@savetitle{#4}}% Optional #3 argument NOT supplied
{\def\ttl@savetitle{#3}}% Optional #3 argument supplied
\gdef\thetitle{\csname the#1\endcsname}%
\if@noskipsec \leavevmode \fi
\par
\ttl@labelling{#1}{#2}%
\ttl@startargs\ttl@straight@ii{#1}{#4}}
\makeatother
\begin{document}
\tableofcontents
\section[fIrst sEctIOn][FiRST SeCTioN]{First section}
\clearpage
\section[sEcOnd sEctIOn]{Second section}
\clearpage
\section{Third section}
\end{document}