我正在写一本书,希望为表格中的每个章节和部分创建自动标签\label{AutoChap:"ChapTitle")
。\label{AutoSec:SecTitle)
学习“自动”部分标签?,我的 WME 上显示我取得了一点进展。
\documentclass{memoir}
\usepackage{letltxmacro}
\LetLtxMacro{\oldsection}{\section}
\renewcommand{\section}[2][]{\oldsection[#1]{#2}\index{#1}\label{sec:#1}}
\LetLtxMacro{\oldchapter}{\chapter}
\renewcommand{\chapter}[2][]{\oldchapter[#1]{#2}\index{#1}\label{chap:#1}}
\begin{document}
\chapter[ABC]{ABC}
\section[One]{One}
\section{Two}
\section*[Three]{Three}
Test reference \ref{chap:ABC}
Test reference \ref{chap:XYZ}
Test reference \ref{sec:One}
Test reference \ref{sec:Two}
\chapter{DEF}
\chapter*[XYZ]{XYZ}
\end{document}
然而,仍然存在两个问题:
此代码要求为每个章节和部分分配一个名称 ([])。例如,在我的 WME 中,它适用于章节 ABC、第一部分,但不适用于章节 DEF、第二部分。几乎(但不是全部)我的章节和部分都没有分配任何名称,因此我正在寻找一种可以适用于这两种情况(分配或不分配)的解决方案。
它会导致带星号的章节和部分出现错误,例如我示例中的 XYZ 章或第三部分。(结果,它给我的目录或参考书目带来了麻烦……)。
请告知我任何可能的解决方案,以便获得自动标签而不会出现此类问题。非常感谢。
编辑。我也尝试了同一主题中的另一个建议(如下所示),“自动”部分标签?,即:
\let\orisectionmark\sectionmark
\renewcommand\sectionmark[1]{\label{autosection::\thesection}\orisectionmark{#1}}
它可能更适合于 Section 标签,但仍然不能将相同的想法应用于 Chapters 标签。请帮助我。
答案1
我不建议使用由章节或部分名称生成的标签名称,因为这些
- 在文档编写过程中,名称可能会发生变化 → 参考名称也必须更改
- 名称可以出现多次→多次定义的标签
但是,OP 中的代码不起作用的主要原因是和宏memoir
的“奇怪”的第二个可选参数。\chapter
\section
可以使用和轻松捕获此问题xparse
。\RenewDocumentCommand
我已经提供了一种\@currentlabel
方法,该方法默认为带星号的宏的章节或部分标题。
hyperref
这种方法也有效。
\documentclass{memoir}
\usepackage{letltxmacro}
\usepackage{xparse}
\LetLtxMacro{\oldsection}{\section}
\LetLtxMacro{\oldchapter}{\chapter}
\makeatletter
\RenewDocumentCommand{\section}{sO{#4}O{#4}m}{%
\index{#2}%
\IfBooleanTF{#1}{%
\addcontentsline{toc}{section}{#2}%
\oldsection*{#4}\protected@edef\@currentlabel{#3}%
}{%
\oldsection[#2][#3]{#4}%
}%
\label{sec:#2}%
}
\RenewDocumentCommand{\chapter}{sO{#4}O{#4}m}{%
\index{#2}%
\IfBooleanTF{#1}{%
\oldchapter*[#2]{#4}\protected@edef\@currentlabel{#2}%
}{%
\oldchapter[#2][#3]{#4}%
}%
\label{chap:#2}%
}
\usepackage{hyperref}
\makeatother
\begin{document}
\tableofcontents
\chapter[ABC]{ABC}
\section[One]{One}
\section{Two}
\section*[Three]{Three}
Test reference \ref{chap:ABC}
Test reference \ref{chap:XYZ}
Test reference \ref{sec:One}
Test reference \ref{sec:Two}
\chapter{DEF}
\chapter*[XYZ]{XYZ}
\printindex
\end{document}