我最近改用cleveref
latex 文档。但是,有一个案例我还是不太清楚(或者可能 cleveref 没有涵盖):
我经常使用包subfigure
的 -environment 。在主图的标题中,我使用来仅获取子图的标签,例如而不是。 的主要优点是我可以输入并获取 的结果,但这不适用于子引用,因为总是产生完整的标签()。subcaption
\subref{}
(a)
1a
cleveref
\cref{fig}
fig.~\ref{fig}
\cref
1a
有没有办法fig.~\subref{fig:a}
使用 cleveref 进行重现?也就是说,我可以使用它\cref
来创建一个引用,而不是只使用子图标签而不使用主图标签?
编辑:这里有一个 MWE 来说明这个问题:
\documentclass{article}
\usepackage{mwe}
\usepackage{subcaption}
\usepackage{cleveref}
\begin{document}
\begin{figure}
\centering
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-a}
\caption{Figure 1a}
\label{fig:a}
\end{subfigure}
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-b}
\caption{Figure 1b}
\label{fig:b}
\end{subfigure}
\caption{Main figure caption}
\label{fig}
\end{figure}
Using subcaption, I can link to \ref{fig}, \ref{fig:a} or to \subref{fig:a} alone.
Using cleverref, I can also link to \cref{fig} and to \cref{fig:a},
However, I cannot link to \subref{fig:a} alone.
\end{document}
编辑2:特别明确一点:使用的目的cleveref
是为了能够写出文本引用没有需要描述每个标签的性质。但是,如果我不能创建命令的 subref 版本cref
,我仍然只能手动输入这些引用,在我看来,这没有多大意义。我要么一直使用 cleveref,要么根本不使用。所以问题是,我可以创建一个\cref
变体吗\subref
?
答案1
一个解决方法是通过将其添加到序言中来定义您自己的“部分聪明”命令:
\newcommand{\csubref}[2]{\namecref{#1}~\subref{#1:#2}}
然而,这需要一种严格的标签方案,类型为 mainfigurelabel:subfigureindex,因此如果总浮点数被标记为fig
如示例中的子图必须被标记为fig:<your text here>
。然后您可以通过引用子浮点数\csubref{fig}{<your text here>}
。这没有考虑到其他有用的功能,\cref
例如处理多个引用。此外,我会考虑使用 subfig 包,因为 cleverref 本身支持它,但它不能解决您的“问题”。但请参阅下面的评论。
您相应修改的 MWE:
\documentclass{article}
\usepackage{mwe}
\usepackage{subcaption}
\usepackage{cleveref}
\newcommand{\csubref}[2]{\namecref{#1}~\subref{#1:#2}}
\begin{document}
\begin{figure}
\centering
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-a}
\caption{Figure 1a}
\label{fig:a}
\end{subfigure}
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-b}
\caption{Figure 1b}
\label{fig:b}
\end{subfigure}
\caption{Main figure caption}
\label{fig}
\end{figure}
Using subcaption, I can link to \ref{fig}, \ref{fig:a} or to \subref{fig:a} alone.
Using cleverref, I can also link to \cref{fig} and to \cref{fig:a},
However, I can link to \csubref{fig}{a} alone.
\end{document}
然而,在你描述的 MWE 中,我仍然不能 100% 地确信用例,因为
- 在标题中,再次使用 fig 来引用该图是多余的。
- 当图形编号是从上下文中推断出来时,图形的谈论也可能是如此,因此复制图形可能不会有实质性的增加。
事实上,cleverref 包与 subfig 包结合并不能达到您想要的效果,即在文本中的某处出现“fig.a”,这让我觉得其实没有必要这样做。
我会考虑简单地对 subref 进行样式化,让读者更自然地熟悉使用whicha
或which 的含义,或直接与子图标题相关联(这是 subfig 包的正常行为)。但是,我同意,在文本中的某个地方出现单个 a(如使用 时的情况)是不可取的,因为它总是容易与不定冠词“a”混淆。b
\newcommand{\csubref}[1]{(\subref{#1})}
(a)
(b)
\subref{fig:a}
答案2
您可以按如下方式调整行为cleveref
,然后\cref{sub@fig:a}
在文本中简单使用。
如果您只是使用subcaption
并查看文件,.aux
您将看到文件中\label{fig:a}
的asubfigure
产生了两个条目.aux
,一个用于fig:a
,其打印值像1a
,一个用于 ,其sub@fig:a
有两个值{a}{1}
。
当您加载时cleveref
,会存储另外两个标签fig:a@cref
和sub@fig:a@cref
。但是默认情况下,它们包含相同的数据和打印。您可以通过调整代码1a
来修改第二个标签,使其仅包含 的数据。然后您可以通过而不是 来引用它。a
subcaption
\cref{sub@fig:a}
\cref{fig:a}
\documentclass{article}
\usepackage{mwe}
\usepackage{subcaption}
\usepackage{cleveref}
\makeatletter
\@ifpackageloaded{subcaption}{%
\renewcommand*\subcaption@@label[2]{%
\@bsphack\begingroup
\subcaption@ORI@label#1{#2}%
\let\SK@\@gobbletwo
\protected@edef\@currentlabel{\csname thesub\@captype\endcsname}%
\protected@edef\cref@currentlabel{%
[subs\@captype][\arabic{sub\@captype}][\cref@result]%
\csname thesub\@captype\endcsname}%
\subcaption@ORI@label#1{sub@#2}%
\endgroup\@esphack}%
}
\makeatother
\crefname{subsfigure}{fig.}{figs.}
\begin{document}
\begin{figure}
\centering
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-a}
\caption{Figure 1a}
\label{fig:a}
\end{subfigure}
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-b}
\caption{Figure 1b}
\label{fig:b}
\end{subfigure}
\caption{Main figure caption}
\label{fig}
\end{figure}
Using subcaption, I can refer to \ref{fig}, \ref{fig:a} or to
\subref{fig:a} alone.
Using cleverref, I can also refer to \cref{fig} and to \cref{fig:a},
and similaryl \cref{fig:b}.
Now I can refer to \cref{sub@fig:a} alone, and similarly
\cref{sub@fig:b} too.
\end{document}
要修改的适当宏是\subcaption@@label
负责生成两个条目的宏。在第二个条目之前,它重新定义了\@currentlabel
。我上面所做的也是为添加了重新定义\cref@currentlabel
。我这样做是为了关联一种新类型的subsfigure
,然后\crefname
可用于定义关联文本,以便在引用时将其放在标签前面。代码也应该可以工作subtables
。
答案3
\refstepcounter@noarg
我认为改变 subcaption 来适应 cleveref 是错误的策略,如果 cleveref 依赖于当前对 etc的重新定义会更好\@currentlabel
:
\documentclass{article}
\usepackage{mwe}
\usepackage{subcaption}
\usepackage{cleveref}
\makeatletter
\def\refstepcounter@noarg#1{%
\cref@old@refstepcounter{#1}%
\cref@constructprefix{#1}{\cref@result}%
\@ifundefined{cref@#1@alias}%
{\def\@tempa{#1}}%
{\def\@tempa{\csname cref@#1@alias\endcsname}}%
\protected@edef\cref@currentlabel{%
[\@tempa][\arabic{#1}][\cref@result]%
\noexpand\@currentlabel}} %changed
\def\refstepcounter@optarg[#1]#2{%
\cref@old@refstepcounter{#2}%
\cref@constructprefix{#2}{\cref@result}%
\@ifundefined{cref@#1@alias}%
{\def\@tempa{#1}}%
{\def\@tempa{\csname cref@#1@alias\endcsname}}%
\protected@edef\cref@currentlabel{%
[\@tempa][\arabic{#2}][\cref@result]%
\noexpand\@currentlabel}}% changed
\makeatother
\begin{document}
\begin{figure}
\centering
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-a}
\caption{Figure 1a}
\label{fig:a}
\end{subfigure}
\begin{subfigure}{.3\linewidth}
\includegraphics[width=\linewidth]{image-b}
\caption{Figure 1b}
\label{fig:b}
\end{subfigure}
\caption{Main figure caption}
\label{fig}
\end{figure}
Using subcaption, I can link to \ref{fig}, \ref{fig:a} or to \subref{fig:a} alone.
Using cleverref, I can also link to \cref{fig} and to \cref{fig:a} and to \cref{sub@fig:a} alone.
\end{document}