Um comando `\crefmultilabelformat` permitindo construções `\crefstripprefix` para `\cref`

Um comando `\crefmultilabelformat` permitindo construções `\crefstripprefix` para `\cref`

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 \crefstripprefixpara 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 #1representa o primeiro rótulo do intervalo e #2representa o último rótulo, o \creflabelformatcomando configura os rótulos individualmente (apenas o espaço reservado #1disponível, o #2e #3ajusta o hiperlink, como #3acima #6).

A saída de \crefcom uma série de rótulos é ajustada pelo \crefmultiformatcomando, onde um espaço reservado #1que 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 #1representariam, digamos, o primeiro rótulo renderizado da série, e #2representariam 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 \crefmultiformatusando 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}

informação relacionada