存储未包含部分的章节名称(可能在部分的辅助文件中)

存储未包含部分的章节名称(可能在部分的辅助文件中)

我习惯\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值为,这不是你想要的。\@Chaptername2 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}

相关内容