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 \crefstripprefix
para 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 #1
representa la primera etiqueta del rango y #2
representa la última etiqueta, el \creflabelformat
comando configura las etiquetas individualmente (solo #1
está disponible el marcador de posición, #2
y #3
ajusta el hipervínculo, como #3
se muestra #6
arriba).
La salida de \cref
con una serie de etiquetas se ajusta mediante el \crefmultiformat
comando, donde un marcador de posición #1
que 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 #1
representaría, digamos, la primera etiqueta renderizada de la serie, y #2
representarí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 \crefmultiformat
usando 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}