允許為「\cref」建構「\crefstripprefix」的「\crefmultilabelformat」指令

允許為「\cref」建構「\crefstripprefix」的「\crefmultilabelformat」指令

我的問題是一個更一般(並且希望更清晰)的表述這個

使用 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。不幸的是,與上面的 where#1代表範圍的第一個標籤並#2代表最後一個標籤相反,該\creflabelformat命令單獨配置標籤(僅佔位符#1可用,#2#3調整超鏈接,就像上面一樣#3#6

with a series of label的輸出\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}

相關內容