Minha pergunta é uma formulação mais geral (e espero que mais clara) deEste.
Com package cleveref
, ao referenciar simultaneamente vários objetos rotulados, pode-se usar o comando multiformat \cref
, produzindo, por exemploreferências 1, 2 e 3, ou o comando range format \crefrange
, produzindoreferências 1–3.
Se os objetos rotulados forem 1a, 1b, 1c, o formato do intervalo poderá ser ajustado \crefstripprefix
para remover o prefixo comum;
\crefrangelabelformat{<type>}{#3#1#4--#5\crefstripprefix{#1}{#2}#6}
produzindoreferências 1a – cem vez dereferências 1a – 1c.
Gostaria de conseguir algo semelhante com o multiformato, ou sejareferências 1a, b e c. Infelizmente, em contraste com o acima, onde #1
representa o primeiro rótulo do intervalo e #2
representa o último rótulo, o \creflabelformat
comando configura os rótulos individualmente (apenas o espaço reservado #1
disponível, o #2
e #3
ajusta o hiperlink, como #3
acima #6
).
A saída de \cref
com uma série de rótulos é ajustada pelo \crefmultiformat
comando, onde um espaço reservado #1
que aparece em seus argumentos representa cada rótulo da série, um de cada vez. Existe uma maneira de fazer com que cada etiqueta passe primeiro por uma transformação, sintonizada por um comando “ \crefmultilabelformat
” comdoismarcadores de posição, onde #1
representariam, digamos, o primeiro rótulo renderizado da série, e #2
representariam cada um dos outros?
\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}
Responder1
Isso não precisa de um novo comando, pode ser feito com o existente \crefmultiformat
usando uma macro para passar as informações do prefixo do primeiro componente para os demais, assim:
\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}