假设我有这个:
\documentclass{article}
\usepackage{cleveref}
\begin{document}
\section{Section One}
\label{a:sec1}
\cref{a:sec1}
\section{Section Two}
\label{b:sec2}
\cref{b:sec2}
\end{document}
Cleveref 现在将引用“第 1 节”和“第 2 节”,因为标签位于节之后。但我需要的是它根据a:
和引用标签b:
,其中我定义了显示的名称。例如:所有带有 的标签a:
都应引用为“Car X”,所有带有 的标签b:
都应引用为“Truck X”,即使它们都是一个节。
注意:我不是想要改变计数器,只需要根据标签的“命名空间”引用时显示的单词!
我cleveref
能独自完成这项工作吗?还是必须构建一些自定义解决方案(可能使用prettyref
)?
答案1
我不会根据标签的“前缀”(a:
,,b:
...)赋予项目特殊含义,而是使用包中已经提供的功能cleveref
:使用可选参数该\label
命令可以覆盖项目的默认交叉引用名称。
在下面的例子中,我首先告知cleveref
“car”和“truck”项目的单数和复数形式,然后使用命令的可选参数\label
告知cleveref
相应部分的“名称”是“car”和“truck”而不是“section”。 (hyperref
加载包并指定选项nameinlink
只是为了使输出cleveref
立即可见。)
\documentclass{article}
\usepackage[colorlinks=true]{hyperref}
\usepackage[nameinlink]{cleveref}
% provide singular and plural names of the categories "car" and "truck"
\crefname{truck}{truck}{trucks}
\crefname{car}{car}{cars}
\begin{document}
\section{Section One}\label[car]{sec:1}
\section{Section Two}\label[truck]{sec:2}
\section{Section Three}
Cross-references to \cref{sec:1,sec:2}.
\end{document}
答案2
根据我的回答将自定义字符串包含到 \cref 中的新命令,可以更改的标签cleveref
(也可以使用hyperref
)。在这个答案中,我将其扩展为查看标签的第一个字符,以帮助确定引用应该是什么样子。在这里,我创建了一个新宏\crefX
来完成这项工作,但如果真的想要的话,可以用它来替换默认的\cref
(但我不建议这样做):
\documentclass{article}
\usepackage{hyperref}
\usepackage{cleveref}
\newcommand{\crefX}[1]{\crefformat{section}{%
\crefXhelper#1\relax~##2##1##3}%
\cref{#1}\crefformat{section}{section~##2##1##3}}
\def\crefXhelper#1#2\relax{\if#1aCar\else\if#1bTruck\else Section\fi\fi}
\begin{document}
\section{Section One (a label)}
\label{a:sec1}
This section \crefX{a:sec1}
\section{Section Two (b label)}
\label{b:sec2}
This section \crefX{b:sec2} and prior section, \crefX{a:sec1}.
\section{Section Three (c label)}
\label{c:sec3}
This section \crefX{c:sec3} and prior section, \crefX{b:sec2}
and first section, \crefX{a:sec1}.
\end{document}
如果你真的想让它说“汽车 X”,而不说实际的数字,那么
\newcommand{\crefX}[1]{\crefformat{section}{%
\crefXhelper#1\relax~##2X##3}%
\cref{#1}\crefformat{section}{section~##2##1##3}}
可以工作。