Мой вопрос представляет собой более общую (и, надеюсь, более ясную) формулировкуВот этот.
С помощью 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}