经过大量的编辑之后,我想修复这部巨作中的参考文献,因为大量的编辑基本上破坏了所有的标签参考对应关系。
为了系统地检查,我想使用类似
\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焦油#1
o可选参数#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}
输出符合预期:
这个问题实际上是在问测试但是如果你以这种方式添加标签,则无需测试它们,因为它们会自动正确。不过,你也可以通过将它们添加到新的\chapter
etc 命令来添加自动测试:
\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}%
}