结合 cleveref 和 subref

结合 cleveref 和 subref

我最近改用clevereflatex 文档。但是,有一个案例我还是不太清楚(或者可能 cleveref 没有涵盖):

我经常使用包subfigure的 -environment 。在主图的标题中,我使用来仅获取子图的标签,例如而不是。 的主要优点是我可以输入并获取 的结果,但这不适用于子引用,因为总是产生完整的标签()。subcaption\subref{}(a)1acleveref\cref{fig}fig.~\ref{fig}\cref1a

有没有办法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@crefsub@fig:a@cref。但是默认情况下,它们包含相同的数据和打印。您可以通过调整代码1a来修改第二个标签,使其仅包含 的数据。然后您可以通过而不是 来引用它。asubcaption\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}

在此处输入图片描述

相关内容