我正在使用\cleveref
包来引用子图。我正在使用\crefmultiformat
来自定义引用样式。我试图实现图 1.1 (a) 和 (b),但使用附加的代码我得到了 1.1(a) 和 b)。我不确定如何在代码中定义间距和括号。抱歉,我是业余 LaTeX 用户。
PFA 我的 MWE:
\documentclass[twoside,openright,12pt]{book}
\usepackage{graphicx}
\usepackage[colorlinks]{hyperref}
\usepackage{caption}
\usepackage[subrefformat=parens,labelformat=parens]{subcaption}
\captionsetup[subfigure]{subrefformat=simple,labelformat=simple}
\renewcommand\thesubfigure{(\alph{subfigure})}
\usepackage[noabbrev]{cleveref}
\crefrangelabelformat{figure}{(#3#1#4~to~#5\crefstripprefix{#1}{#2}#6)}
\crefmultiformat{figure}{figures~#2#1\xdef\mycreffirstarg{#1}#3}
{and~#2{\crefstripprefix{\mycreffirstarg}{#1}}#3}{,~#2#1#3}{~and~#2#1#3}
\begin{document}
\begin{figure}[!htbp]
\centering
\begin{subfigure}[b]{0.4\textwidth}
\centering
\includegraphics[width=\textwidth]{apple.pdf}
\caption{}
\label{subfig:apple}
\end{subfigure}
\begin{subfigure}[b]{0.4\textwidth}
\centering
\includegraphics[width=\textwidth]{ball.pdf}
\caption{}
\label{subfig:ball}
\end{subfigure}
\caption{Pictures of (a) Apple and (b) Ball}
\label{fig:alphabets}
\end{figure}
I would like to reference as Figures~1~(a)~and~(b). However, if I use \Cref{subfig:apple,subfig:ball} returns Figures~1(a)and~b).
\end{document}
答案1
以下不是很干净的代码,但它为 MWE 返回了正确的结果。
问题在于 1(a) 和 1(b) 的前缀剥离会剥离 1( 部分,因为这是公共前缀。为了解释已剥离的 (,您只需(
在格式规范中添加一个文字字符,即and~#2{(\crefstripprefix
等。
但是,这还会为没有子图的正常图形范围添加一个括号,例如,图 1 和 (2。因此,只有当参数是子图时才必须添加额外的括号。一种方法是检查计数器是否以右括号结尾。这可以通过xstring
提供宏的包来完成\IfEndWith{string}{suffix}{do if true}{do if false}
,因此在这种情况下,如果参数中的字符串#1
以 结尾,)
则打印 a (
,否则不打印任何内容。
请注意,我没有添加额外的空格3(a)
(即3 (a)
),因为我不确定这是否真的是我想要的 - 如果是这样,那么进行一些xstring
处理可能会有所帮助。我确实在之前添加了一个额外的空格和。
还要注意,该caption
包不是必需的,并且\crefrangelabelformat
可以将其省略,以供 MWE 使用。
代码:
\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage[colorlinks]{hyperref}
\usepackage[subrefformat=parens,labelformat=parens]{subcaption}
\usepackage{xstring}
\captionsetup[subfigure]{subrefformat=simple,labelformat=simple}
\renewcommand\thesubfigure{(\alph{subfigure})}
\usepackage[noabbrev]{cleveref}
\crefmultiformat{figure}{figures~#2#1\xdef\mycreffirstarg{#1}#3}
{~and~#2{\IfEndWith{#1}{)}{(}{}\crefstripprefix{\mycreffirstarg}{#1}}#3}{,~#2#1#3}{~and~#2#1#3}
\begin{document}
\begin{figure}[t!]
\centering\fbox{fig1}
\caption{Box with text}
\label{fig:box1}
\end{figure}
\begin{figure}[t!]
\centering\fbox{fig2}
\caption{Box with text}
\label{fig:box2}
\end{figure}
\begin{figure}[h!]
\centering
\begin{subfigure}[b]{0.4\textwidth}
\centering
\includegraphics[width=\textwidth]{apple.pdf}
\caption{Apple}
\label{subfig:apple}
\end{subfigure}
\begin{subfigure}[b]{0.4\textwidth}
\centering
\includegraphics[width=\textwidth]{ball.pdf}
\caption{Ball}
\label{subfig:ball}
\end{subfigure}
\caption{Pictures of Apple and Ball}
\label{fig:alphabets}
\end{figure}
I would like to reference as Figures~3~(a)~and~(b). However, if I use \Cref{subfig:apple,subfig:ball} returns Figures~3(a)and~b). Regular figures should not get the extra parenthesis: \Cref{fig:box1,fig:box2}.
\end{document}
结果:
3
编辑:对于多格式的第一部分和之间的额外空格(a)
应该进行修改,而不是#1
(这是第一个引用),您可以使用包\StrSubstitute
中的xstring
将第一个括号更改为空格和括号。语法是\StrSubstitute{string}{search}{replace}
(请参阅手动的了解xstring
更多详情)。代码:
\crefmultiformat{figure}{figures~#2\StrSubstitute{#1}{(}{~(}\xdef\mycreffirstarg{#1}#3}
{~and~#2{\IfEndWith{#1}{)}{(}{}\crefstripprefix{\mycreffirstarg}{#1}}#3}{,~#2#1#3}{~and~#2#1#3}
结果: