在 cref 引用中使用计数器编号作为章节编号

在 cref 引用中使用计数器编号作为章节编号

经过大量的编辑之后,我想修复这部巨作中的参考文献,因为大量的编辑基本上破坏了所有的标签参考对应关系。

为了系统地检查,我想使用类似

\documentclass[11pt]{book}
\usepackage{cleveref}% should be the last package
\Crefname{subsection}{Subsection}{Subsections}
\begin{document}
\chapter{ONE}\label{1-0-0}
\section{one}\label{1-1-0}
\subsection{aaaa}\label{1-1-1}

\cref{1-0-0}

\cref{1-1-0}

\cref{1-1-1}

\chapter{TWO}\label{2-0-0}
\section{one}\label{2-1-0}
\subsection{aaaa}\label{2-1-1}

\cref{2-0-0}

\cref{2-1-0}

\cref{2-1-1}

\end{document}

但即使这样,手工工作量也很大,我想知道我是否可以使用类似

\cref{\chapternumber-0-0}

\cref{\chapternumber-1-0}

\cref{\chapternumber-1-1}

然后我可以将其粘贴到每个章节文件中。我可以用它做什么 \chapternumber

答案1

由于目的是节省输入,而且标签非常规则,我建议将标签设为自动化。最简单的方法是使用以下命令“保存”实际命令

\let\realchapter\chapter

然后我们可以重新定义\chapter以便添加标签:

\renewcommand\chapter[1]{\realchapter{#1}\label{\arabic{chapter}-0-0}}

因此,新\chapter命令通过 将“实际工作”委托给实际章节命令,\realchapter然后添加所需的标签。事实上,这可能还不够好,因为该\chapter命令接受一个可选参数,并且它还有一个-variant *。我猜你不需要 -variant *,你可能也不需要可选的短标题,但我们可以使用\RenewDocumentCommand解析包。命令的重新定义\chapter现在变得稍微复杂一些:

\RenewDocumentCommand\chapter{ som }{%
  \IfBooleanTF{#1}
    {\IfNoValueTF{#2}{\realchapter*{#3}}{\realchapter*[#2]{#3}}}
    {\IfNoValueTF{#2}{\realchapter{#3}}{\realchapter[#2]{#3}}}
  \label{\arabic{chapter}-0-0}
}

在第一行,som表示该命令接受s焦油#1o可选参数#2和 是可选参数#3\IfBooleanTF\IfNoValue命令是针对*和 可选参数的测试,但除此之外,此宏与之前的宏大致相同。

综上所述,OP 中的 MWE 可以不用任何\label命令重写为:

\documentclass[11pt]{book}
\usepackage{cleveref}% should be the last package
\Crefname{subsection}{Subsection}{Subsections}

\usepackage{xparse}

\let\realchapter\chapter%  save "copies" of the default \chapter,
\let\realsection\section%  \section and \subsection commands
\let\realsubsection\subsection
% redefine the \chapter, \section and \subsection commands to add labels
\RenewDocumentCommand\chapter{ som }{%
  \IfBooleanTF{#1}
    {\IfNoValueTF{#2}{\realchapter*{#3}}{\realchapter*[#2]{#3}}}
    {\IfNoValueTF{#2}{\realchapter{#3}}{\realchapter[#2]{#3}}}%
  \label{\arabic{chapter}-0-0}%
}
\RenewDocumentCommand\section{ som }{%
  \IfBooleanTF{#1}
    {\IfNoValueTF{#2}{\realsection*{#3}}{\realsection*[#2]{#3}}}
    {\IfNoValueTF{#2}{\realsection{#3}}{\realsection[#2]{#3}}}%
  \label{\arabic{chapter}-\arabic{section}-0}%
}
\RenewDocumentCommand\subsection{ som }{%
  \IfBooleanTF{#1}
    {\IfNoValueTF{#2}{\realsubsection*{#3}}{\realsubsection*[#2]{#3}}}
    {\IfNoValueTF{#2}{\realsubsection{#3}}{\realsubsection[#2]{#3}}}%
  \label{\arabic{chapter}-\arabic{subsection}-\arabic{subsection}}%
}

\begin{document}
\chapter{ONE}
\section{one}
\subsection{aaaa}

\cref{1-0-0}

\cref{1-1-0}

\cref{1-1-1}

\chapter{TWO}
\section{one}
\subsection{aaaa}

\cref{2-0-0}

\cref{2-1-0}

\cref{2-1-1}

\end{document}

输出符合预期:

在此处输入图片描述

这个问题实际上是在问测试但是如果你以这种方式添加标签,则无需测试它们,因为它们会自动正确。不过,你也可以通过将它们添加到新的\chapteretc 命令来添加自动测试:

\RenewDocumentCommand\chapter{ som }{%
  \IfBooleanTF{#1}
    {\IfNoValueTF{#2}{\realchapter*{#3}}{\realchapter*[#2]{#3}}}
    {\IfNoValueTF{#2}{\realchapter{#3}}{\realchapter[#2]{#3}}}%
  \label{\arabic{chapter}-0-0}%
  Testing: \cref{\arabic{chapter}-0-0}%
}

最后,如果您确实想支持*这些命令的变体,那么上面的标签实际上就没有什么意义了。因此,使用类似以下内容可能是个好主意:

\RenewDocumentCommand\chapter{ som }{%
  \IfBooleanTF{#1}
    {\IfNoValueTF{#2}{\realchapter*{#3}}{\realchapter*[#2]{#3}}
     \label{\arabic{chapter}*-0-0}% *-label
    }
    {\IfNoValueTF{#2}{\realchapter{#3}}{\realchapter[#2]{#3}}
     \label{\arabic{chapter}-0-0}}%
  Testing: \cref{\arabic{chapter}-0-0}%
}

相关内容