Команда `\crefmultilabelformat`, разрешающая конструкции `\crefstripprefix` для `\cref`

Команда `\crefmultilabelformat`, разрешающая конструкции `\crefstripprefix` для `\cref`

Мой вопрос представляет собой более общую (и, надеюсь, более ясную) формулировкуВот этот.

С помощью package cleverefпри одновременной ссылке на несколько помеченных объектов можно использовать команду multiformat \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}

Связанный контент