访问章节或节标题

访问章节或节标题

是否存在一个 base-LaTeX 变量或宏可以用来访问章节或节的标题?

下面的 MWE 演示了一种解决方法,但似乎可能已经存在 LaTeX 变量或“命令”?

LaTeX 将章节标题放入页眉这一事实表明它作为变量存在。

\documentclass{book}
\usepackage{verbatim}
\newcommand{\nowtitle}{}
\pagestyle{headings}
\begin{document}
\chapter{Stuff}

\verb!\theChapterTitle!  throws an error. 

\verb!\ChapterTitle!  throws an error.

\verb!\chaptertitle!  throws an error.

\verb!\today!
compiles as
\today

\verb!\thesection{}! compiles as \thesection{} 

\verb!\thechapter{}! compiles as \thechapter{}

\verb!\thepage{}! compiles as \thepage{} 

\verb!\nowtitle{}!  compiles as \nowtitle{}

\renewcommand{\nowtitle}{Lorem ipsum}\chapter{\nowtitle}

\verb!\nowtitle{}!  compiles as \nowtitle{}
\newpage One page 
\newpage
\verb!\nowtitle{}!  compiles as \nowtitle{}
\end{document}

答案1

不,没有基本 LaTeX 宏保存 的标题\chapter。让我们通过查看对 的调用来了解原因。以下是inside\chapter{<title>}的定义\chapterbook.cls(内部类似report.cls):

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                    \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@chapter\@schapter}

请注意,\chapter不带任何参数。它只是通过 来判断\secdef您是否使用\chapter星号 来调用*。如果您调用\chapter*,它将执行\@schapter,否则它将执行\@chapter。假设您没有使用\chapter*,则如下所示\@chapter

\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
                         \refstepcounter{chapter}%
                         \typeout{\@chapapp\space\thechapter.}%
                         \addcontentsline{toc}{chapter}%
                                   {\protect\numberline{\thechapter}#1}%
                    \else
                      \addcontentsline{toc}{chapter}{#1}%
                    \fi
                    \chaptermark{#1}%
                    \addtocontents{lof}{\protect\addvspace{10\p@}}%
                    \addtocontents{lot}{\protect\addvspace{10\p@}}%
                    \if@twocolumn
                      \@topnewpage[\@makechapterhead{#2}]%
                    \else
                      \@makechapterhead{#2}%
                      \@afterheading
                    \fi}

这里的论点#1可选参数,而参数#2强制参数您提供的是<title>。如果您没有提供可选参数,则此宏\secdef将重复,#2从而#1有效地调用\chapter[<title>]{<title>}。此时,您可以突然出现并抓住#1或 ,#2就像您\nowtitle使用 en一样etoolbox修补:

\usepackage{etoolbox}

\makeatletter
\patchcmd{\@chapter}% <cmd>
  {\ifnum}% <search>
  {\edef\nowtitle{#1}\ifnum}% <replace>
  {}{}% <success><failure>
\makeatother

从 的定义中可以看出\@chapter#1用在 内\chaptermark,因此会出现在标题中,而#2用在 内来\@makechapterhead设置章节标题。我选择了#1上面的,但您可以选择其中一个(或存储两者)。

\chapter*有点不同。调用 会\chapter*{<title>}导致调用\@schapter

\def\@schapter#1{\if@twocolumn
                   \@topnewpage[\@makeschapterhead{#1}]%
                 \else
                   \@makeschapterhead{#1}%
                   \@afterheading
                 \fi}

这里有没有可选参数, 只有强制的 {<title>}\@schapter只需进行如下修补即可:

\usepackage{etoolbox}

\makeatletter
\patchcmd{\@schapter}% <cmd>
  {\if@twocolumn}% <search>
  {\edef\nowtitle{#1}\if@twocolumn}% <replace>
  {}{}% <success><failure>
\makeatother

请注意,这\chapter*[<other>]{<stuff>}是不允许的。

这是一个完整的最小示例:

在此处输入图片描述

\documentclass{book}

\usepackage{etoolbox}

\makeatletter
\patchcmd{\@chapter}% <cmd>
  {\ifnum}% <search>
  {\edef\nowtitle{#1}\ifnum}% <replace>
  {}{}% <success><failure>
\patchcmd{\@schapter}% <cmd>
  {\if@twocolumn}% <search>
  {\edef\nowtitle{#1}\if@twocolumn}% <replace>
  {}{}% <success><failure>
\makeatother

\newcommand{\nowtitle}{}

\pagestyle{headings}

\begin{document}

\chapter[Other]{Stuff}
% \chapter*{Stuff}

\verb!\nowtitle{}!: \nowtitle

\end{document}

也可以实现上述补丁没有 etoolbox如果需要的话。此外,可以使用类似的方法来存储 (sub) 使用的标题\section

\usepackage{etoolbox}

\makeatletter
\patchcmd{\@sect}% <cmd>
  {\ifnum}% <search>
  {\edef\nowtitle{#7}\ifnum}% <replace>
  {}{}% <success><failure>
\patchcmd{\@ssect}% <cmd>
  {\@tempskipa}% <search>
  {\edef\nowtitle{#5}\@tempskipa}% <replace>
  {}{}% <success><failure>
\makeatother

参数#7#8分别指向 (sub) \section[<#7>]{<#8>}


使用提供类似功能的包通常更好。例如,namereftitleref

答案2

您可以接入构建页眉的机制来保存章节标题。您说得对,它已经保存了,但不是以一种易于访问的方式。

\documentclass{book}

\newcommand*\nowtitle{}

\let\oldchaptermark=\chaptermark
\renewcommand*\chaptermark[1]{%
  \renewcommand*\nowtitle{#1}%
  \oldchaptermark{#1}}

\begin{document}

\chapter{Stuff}

\nowtitle

\end{document}

在此处输入图片描述

相关内容