章节和节的自动标签

章节和节的自动标签

我正在写一本书,希望为表格中的每个章节和部分创建自动标签\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}

然而,仍然存在两个问题:

  1. 此代码要求为每个章节和部分分配一个名称 ([])。例如,在我的 WME 中,它适用于章节 ABC、第一部分,但不适用于章节 DEF、第二部分。几乎(但不是全部)我的章节和部分都没有分配任何名称,因此我正在寻找一种可以适用于这两种情况(分配或不分配)的解决方案。

  2. 它会导致带星号的章节和部分出现错误,例如我示例中的 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}

在此处输入图片描述

相关内容