为正文、标题和目录设置单独的章节标题,以便分行

为正文、标题和目录设置单独的章节标题,以便分行

我正在使用标题安全带有选项的软件包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}

相关内容