Cleverref 包返回一个额外的括号

Cleverref 包返回一个额外的括号

我正在使用\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}

结果:

在此处输入图片描述

相关内容