Un comando `\crefmultilabelformat` que permite construcciones `\crefstripprefix` para `\cref`

Un comando `\crefmultilabelformat` que permite construcciones `\crefstripprefix` para `\cref`

Mi pregunta es una formulación más general (y espero que más clara) deÉste.

Con el paquete cleveref, al hacer referencia simultáneamente a varios objetos etiquetados, se puede usar el comando multiformato \cref, lo que produce, por ejemploreferencias 1, 2 y 3, o el comando de formato de rango \crefrange, dando como resultadoárbitros 1-3.

Si los objetos etiquetados son 1a, 1b, 1c, el formato de rango se puede ajustar \crefstripprefixpara eliminar el prefijo común;

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

flexibleárbitros 1a – cen lugar dereferencias 1a-1c.

Me gustaría lograr algo parecido con el multiformato, o seareferencias 1a, byc. Desafortunadamente, a diferencia de lo anterior, donde #1representa la primera etiqueta del rango y #2representa la última etiqueta, el \creflabelformatcomando configura las etiquetas individualmente (solo #1está disponible el marcador de posición, #2y #3ajusta el hipervínculo, como #3se muestra #6arriba).

La salida de \crefcon una serie de etiquetas se ajusta mediante el \crefmultiformatcomando, donde un marcador de posición #1que aparece en sus argumentos representa cada etiqueta de la serie, una a la vez. ¿Hay alguna manera de hacer que cada etiqueta experimente primero una transformación, sintonizada mediante un comando " \crefmultilabelformat" condosmarcadores de posición, ¿dónde #1representaría, digamos, la primera etiqueta renderizada de la serie, y #2representaría cada una de las demás?

\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}

Respuesta1

Esto no necesita un comando nuevo, se puede hacer con el existente \crefmultiformatusando una macro para pasar la información del prefijo del primer componente a los demás, así:

\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}

información relacionada