我习惯\include
将部分插入大型文档中。有些部分包含chapter
声明,其他部分仅包含章节。我希望使当前章节名称在子章节中可用,即使这些chapter
部分未包含在内。
我的尝试是修改\chaptermark
命令(从答案到如何获取当前章节名称、节名称、小节名称等?) 来存储章节名称,\@Chaptername
并将其保存到部分的aux
文件中。
但是,文件中的行aux
写在了外面,\@setckpt
这样所有的定义都\@Chaptername
在文档的开头读入,然后变量保存最后一章的名称(直到包含的chapter
部分覆盖它)。
以下是一个 MNWE:
\documentclass{scrbook}
\begin{filecontents}{Ch1.tex}
\chapter{Chapter 1}
\end{filecontents}
\begin{filecontents}{Ch2.tex}
\chapter{Chapter 2}
\end{filecontents}
\includeonly{Ch2} % <- Hide this to see the effect.
\makeatletter
\let\Chaptermark\chaptermark
\def\chaptermark#1{\gdef\@Chaptername{\thechapter\enskip#1}\Chaptermark{#1}%
\write\@partaux{\string\gdef\string\@Chaptername{\thechapter\enskip#1}}}
\def\Chaptername{\ifdefined\@Chaptername\@Chaptername\fi}
\makeatother
\begin{document}
\include{Ch1}
The parent chapter is called: \Chaptername
\include{Ch2}
\end{document}
我怀疑一个可能的解决方案是写入\@setckpt
零件文件中的检查点部分aux
。这可能吗?
或者可能有更优雅/更好的解决方案?
答案1
问题在于你\@Chaptername
对每一章都使用了相同的宏。因此,\@Chaptername
使用的“最后一个值”是。当包含每一章时,这是可以的,因为重新定义了它,但如果没有包含某一章,这就成了问题。对于你的 MWE,的\chaptermark
值为,这不是你想要的。\@Chaptername
2 Chapter 2
为了解决这个问题,你应该定义\@Chaptername1
, \@Chaptername2
, .... 不幸的是,(La)TeX 不喜欢在宏名称中使用数字。你可以使用 来解决这个问题,但\csname ...\endcsname
我更喜欢使用\csefd{...}
电子工具箱或者,在这种情况csgdef{...}
下。通过这个小小的修改,你的代码就可以正常工作了。
修改后的代码如下:
\documentclass{scrbook}
\usepackage{etoolbox}
\begin{filecontents}{Ch1.tex}
\chapter{Chapter 1}
\end{filecontents}
\begin{filecontents}{Ch2.tex}
\chapter{Chapter 2}
\end{filecontents}
\includeonly{Ch2} % <- Hide this to see the effect.
\makeatletter
\let\Chaptermark\chaptermark
\def\chaptermark#1{%
\csgdef{@Chaptername\arabic{chapter}}{\thechapter\enskip#1}\Chaptermark{#1}%
\write\@partaux{\string\csgdef{@Chaptername\arabic{chapter}}{\thechapter\enskip#1}}%
}
\def\Chaptername{\ifcsdef{@Chaptername\arabic{chapter}}{\csuse{@Chaptername\arabic{chapter}}}{Chapter \arabic{chapter} unknown}}
\makeatother
\begin{document}
\include{Ch1}
The parent chapter is called: \Chaptername
\include{Ch2}
\end{document}