为子图引用对定制 cleveref:[1a 和 b] 而不是

为子图引用对定制 cleveref:[1a 和 b] 而不是

我正在使用该cleveref软件包,并且对它非常满意。但是,我遇到了一个无法解决的问题。我可能只是没有正确组合语法。这与已经提出的问题密切相关,如下所示:参考范围中的交叉引用 [(1a-1e) 至 (1a-e)]如果这个问题已经得到解答,我很抱歉。

上面的帖子解释了如何引用子方程(或浮点数)的范围,如 1a 到 e,而不是默认的 1a 到 1e。我希望对由“and”组合的一对引用使用相同的功能,即:1a 和 b,而不是默认的 1a 和 1b。

以下是 MWE:

\documentclass{book}

\usepackage{cleveref}
\usepackage{subfig}
\crefrangelabelformat{figure}{#3#1#4--#5\crefstripprefix{#1}{#2}#6}
\crefmultiformat{figure}{figs.~#2#1#3}{ and~#2#1#3}{, #2#1#3}{ and~#2#1#3}

\begin{document}
\begin{figure}
  \centering
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1a}}
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1b}}\\
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1c}}
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1d}}\\
  \caption{\label{fig:1}my figures}
\end{figure}

Referencing a range works as wanted and gives figs. 1a-b: \cref{subfig:1a,subfig:1b,subfig:1c,subfig:1d}.\\
But, referencing a pair gives \cref{subfig:1a,subfig:1b}, rather than the desired figs. 1a and b.\\ 

\end{document}

我认为将\crefstripprefixwith 组合在一起\crefmultiformat{figure}(我在 MWE 中使用它来删除“()”)可以得到我想要的结果。但是我无法获得正确的语法来实现这一点,因为我对深层的 latex 语法非常不熟悉。

答案1

在您的定义中,\crefmultiformat您希望\crefrefstripprefix在第二个参数中使用第一个参数的值。这可以按如下方式实现:

\crefmultiformat{figure}{figs.~#2#1\xdef\mycreffirstarg{#1}#3}%
 { and~#2{\crefstripprefix{\mycreffirstarg}{#1}}#3}{, #2#1#3}{ and~#2#1#3}

您还需要\crefrangelabelformat以类似的方式进行定义(更新以下评论)。

示例输出

\documentclass{book}

\usepackage{cleveref}
\usepackage{subfig}

\crefrangelabelformat{figure}{#3#1\xdef\mycreffirstarg{#1}#4--%
#5\crefstripprefix{#1}{#2}#6}
\crefmultiformat{figure}{figs.~#2#1\xdef\mycreffirstarg{#1}#3}%
{ and~#2{\crefstripprefix{\mycreffirstarg}{#1}}#3}%
{, #2{\crefstripprefix{\mycreffirstarg}{#1}}#3}%
{ and~#2{\crefstripprefix{\mycreffirstarg}{#1}}#3}
\crefrangemultiformat{figure}{figs.~#3#1#4--#5\crefstripprefix{#1}{#2}#6}%
{ and~#3#1#4--#5\crefstripprefix{#1}{#2}#6}%
{, #3#1#4--#5\crefstripprefix{#1}{#2}#6}%
{ and~#3#1#4--#5\crefstripprefix{#1}{#2}#6}

\begin{document}
\begin{figure}
  \centering
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1a}}
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1b}}\\
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1c}}
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1d}}\\
  \subfloat[][]{\rule{2.cm}{2.cm}\label{subfig:1e}}
  \caption{\label{fig:1}my figures}
\end{figure}

\tracingmacros=1
Referencing a range works as wanted and gives figs.~1a--d:
\cref{subfig:1a,subfig:1b,subfig:1c,subfig:1d}.

Gives figs.~1a--c and e: \cref{subfig:1a,subfig:1b,subfig:1c,subfig:1e}.

Gives figs.~1a, b, d and e: \cref{subfig:1a,subfig:1b,subfig:1d,subfig:1e}.

Also referencing a pair gives \cref{subfig:1a,subfig:1b}, which is
then the desired figs.~1a and~b.    

\end{document}

答案2

使用subcaption包而不是subfig将使您获得大部分方法。subcaption提供一个\subref命令,它只提供子图索引而不提供图形编号。

\documentclass{article}
\usepackage{graphicx}
\usepackage{cleveref}
\usepackage{subcaption}
\begin{document}
\begin{figure}
  \centering
  \begin{subfigure}{0.2\textwidth}
  \includegraphics[width=\linewidth]{example-image-a}
  \caption{Image a}
  \label{subfig:foo}
  \end{subfigure}
  \begin{subfigure}{0.2\textwidth}
  \includegraphics[width=\linewidth]{example-image-b}
  \caption{Image b}
  \label{subfig:bar}
  \end{subfigure}\\
  \begin{subfigure}{0.2\textwidth}
  \includegraphics[width=\linewidth]{example-image-c}
  \caption{Image c}
  \label{subfig:baz}
  \end{subfigure}
  \begin{subfigure}{0.2\textwidth}
  \includegraphics[width=\linewidth]{example-image}
  \caption{Image d}
  \label{subfig:qux}
  \end{subfigure}
  \caption{\label{fig:1}my figures}
\end{figure}
Referencing a range works as wanted and gives figs.~\ref{subfig:foo}--\subref{subfig:bar}. There is also \cref{subfig:foo,subfig:bar,subfig:baz,subfig:qux}.
A pair can be referenced like figs.~\ref{subfig:foo} to \subref{subfig:baz}.
\end{document}

在此处输入图片描述

相关内容