`\crefmultilabelformat` 命令允许为 `\crefstripprefix` 构造 `\cref`

`\crefmultilabelformat` 命令允许为 `\crefstripprefix` 构造 `\cref`

我的问题是一个更普遍(并且希望更清晰)的表述这个

使用包时cleveref,当同时引用多个标记对象时,可以使用多格式命令\cref,例如参考文献 1、2 和 3或范围格式命令\crefrange,产生参考文献 1–3

如果标记对象是 1a、1b、1c,则可以调整范围格式以\crefstripprefix删除公共前缀;

\crefrangelabelformat{<type>}{#3#1#4--#5\crefstripprefix{#1}{#2}#6}

屈服参考文献 1a–c代替参考文献 1a–1c

我想用多格式实现类似的功能,即参考文献 1a、b 和 c#1。不幸的是,与上面的代表范围的第一个标签和#2代表最后一个标签的命令不同,该\creflabelformat命令单独配置标签(仅占位符#1可用,#2#3调整超链接,就像上面一样#3#6

带有一系列标签的输出\cref由命令调整\crefmultiformat,其中出现在其参数中的占位符#1代表该系列的每个标签,一次一个。有没有办法让每个标签首先经历一个转换,由命令“\crefmultilabelformat ”调整占位符,#1比如说,代表系列中第一个呈现的标签的位置,以及#2代表其他每个标签的位置?

\documentclass{article}
\usepackage{floatrow}
\usepackage{subcaption}

\usepackage{cleveref}
\crefrangelabelformat{figure}{#3#1#4--#5\crefstripprefix{#1}{#2}#6}

\begin{document}
\begin{figure}
\ffigbox[\textwidth]{
\begin{subfloatrow}[3]
\ffigbox[\FBwidth]{\quad a \quad}{\caption{a}\label{sfig:a}}
\ffigbox[\FBwidth]{\quad b \quad}{\caption{b}\label{sfig:b}}
\ffigbox[\FBwidth]{\quad c \quad}{\caption{c}\label{sfig:c}}
\ffigbox[\FBwidth]{\quad d \quad}{\caption{d}\label{sfig:d}}
\end{subfloatrow}
}{\caption{cap}\label{fig:1}}
\end{figure} 
%

\crefrange{sfig:a}{sfig:c} % renders 1a-c, juste like I want

\cref{sfig:a,sfig:b,sfig:d} % renders 1a, 1b and 1d, and I would like 1a, b, and d.
\end{document}

答案1

这不需要新命令,可以使用现有的\crefmultiformat宏将前缀信息从第一个组件传递给其他组件来完成,如下所示:

\documentclass{article}
\usepackage{floatrow}
\usepackage{subcaption}

\usepackage{cleveref}
\crefrangelabelformat{figure}{#3#1#4--#5\crefstripprefix{#1}{#2}#6}

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

\begin{document}
\begin{figure}
\ffigbox[\textwidth]{
\begin{subfloatrow}[3]
\ffigbox[\FBwidth]{\quad a \quad}{\caption{a}\label{sfig:a}}
\ffigbox[\FBwidth]{\quad b \quad}{\caption{b}\label{sfig:b}}
\ffigbox[\FBwidth]{\quad c \quad}{\caption{c}\label{sfig:c}}
\ffigbox[\FBwidth]{\quad d \quad}{\caption{d}\label{sfig:d}}
\end{subfloatrow}
}{\caption{cap}\label{fig:1}}
\end{figure}

\crefrange{sfig:a}{sfig:c} % renders "1a-c", just like I want.

\cref{sfig:a,sfig:b,sfig:d} % renders "1a, b, and d", just like you want.
\end{document}

相关内容