是否存在一个 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>}
的定义\chapter
book.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>}
。