如何配置 cleveref 来引用附录中的图形“附录图号”而不是“图号”?

如何配置 cleveref 来引用附录中的图形“附录图号”而不是“图号”?

有没有办法配置 cleveref 包,使其引用附录中的图形名称与正文中的图形名称不同?

我希望正文中的图形带有标题并在文中称为“图 1”,附录中的图形称为“附录图 A.1”等。我在附录环境开始时尝试使用以下内容。

\begin{appendices} 
\renewcommand{\figurename}{Appendix figure}

但是,这只会改变附录图的标题,而不会改变 cleveref 对它们进行引用的方式(图的标题是“附录图 A.1”,但在正文或附录中使用 \cref{appendixfig} 仍然会产生“图 A.1”)。

答案1

配图:

正如您在问题中提到的,您需要\figurename在附录中重新定义以便在附录中正确获得图形标题。


cleveref:

您可以通过 引入另一个 cleveref-referencing-type “appendixfigure” \crefname

在附录中,您可以通过用“appendixfigure”类型覆盖标准“figure”类型\crefalias

这样,在\cref引用附录中的图表时,您将得到短语“附录图”/“附录图”,如果在指定“附录图”类型时提供了这些短语。

为了使一些聪明的事情正确完成,可以做这些事情。


hyperref 的\autoref

但是当你希望正确获取 hyperref 的内容时事情会变得更加棘手\autoref

加上\autoref前面的短语,引用的值来自计数​​器的名称,该计数器的值是通过调用宏或之一引用的。 而引用值的计数器的名称又从引用应形成超链接的目标名称中提取。\⁠⟨name of counter⟩⁠refname\⁠⟨name of counter⟩⁠autorefname

因此,您需要修补创建目标名称的宏,以便将它们作为 -entry 的一部分写入 .aux 文件\newlabel,即宏 \hyper@makecurrent,以在创建目标时检查是否在附录环境中,如果是,则用其他内容替换表示图形计数器名称的短语。(在下面的示例中,该短语被短语“appendixfigure”替换。)当然必须定义一个宏或。\⁠⟨something else⟩⁠refname\⁠⟨something else⟩⁠autorefname

\documentclass{book}
\usepackage{appendix}
\usepackage{hyperref}
\usepackage{cleveref}
\crefname{figure}{Figure}{Figures}
\crefname{appendixfigure}{Appendix figure}{Appendix figures}
% The following stuff is to get hyperref's autoref-feature right:
\usepackage{etoolbox}
\newif\ifappendices\appendicesfalse
\makeatletter
\patchcmd{\hyper@makecurrent}{%
    \ifx\Hy@param\Hy@chapterstring
        \let\Hy@param\Hy@chapapp
    \fi
}{%
    \ifx\Hy@param\Hy@chapterstring
        \let\Hy@param\Hy@chapapp
    \fi
    \ifappendices
      \expandafter\Hy@paramappendixreplace\expandafter{\Hy@param}%
    \fi
}{}{\errmessage{failed to patch}}
%
\newcommand\Hy@paramappendixreplace[1]{%
   \Hy@paramappendixreplacefork
   #1\relax{\def\Hy@param{appendixfigure}}%
   figure\relax{}%
   \relax\relax\relax\relax
}%
\@ifdefinable\Hy@paramappendixreplacefork{%
  \long\def\Hy@paramappendixreplacefork#1figure\relax#2#3\relax\relax\relax\relax{#2}%
}%
\makeatother
\newcommand*\appendixfigureautorefname{Appendix figure}%
\newcommand*\appendixfigurerefname{Appendix figure}%
% End of patching hyperref's autoref-feature

\begin{document}

\hrule

\noindent \textbf{Referencing:} \verb|\cref{regular figure}|: \cref{regular figure}

\noindent \textbf{Referencing:} \verb|\cref{appendix figure}|: \cref{appendix figure}

\noindent \textbf{Referencing:} \verb|\nameref{regular figure}|: \nameref{regular figure}

\noindent \textbf{Referencing:} \verb|\nameref{appendix figure}|: \nameref{appendix figure}

\noindent \textbf{Referencing:} \verb|\autoref{regular figure}|: \autoref{regular figure}

\noindent \textbf{Referencing:} \verb|\autoref{appendix figure}|: \autoref{appendix figure}

\hrule

\tableofcontents
\listoffigures

\chapter{Regular Chapter}
\begin{figure}[t]%
\begin{center}
\fbox{Some figure in the mainmatter.}
\caption{Figure in the mainmatter}
\label{regular figure}
\end{center}
\end{figure}

\begin{appendices}
\appendicestrue
\crefalias{figure}{appendixfigure}%
\renewcommand\figurename{Appendix figure}%
\chapter{Some Appendix}
%%%
\addtocontents{lof}{\string\noindent\string\textbf{Figures in appendices}\string\vskip10pt\relax}%
%%%
\begin{figure}[t]%
\begin{center}
\fbox{Some figure in the appendix.}
\caption{Figure in the appendix}
\label{appendix figure}
\end{center}
\end{figure}
\end{appendices}

\vfill

\hrule

\noindent \textbf{Referencing:} \verb|\cref{regular figure}|: \cref{regular figure}

\noindent \textbf{Referencing:} \verb|\cref{appendix figure}|: \cref{appendix figure}

\noindent \textbf{Referencing:} \verb|\nameref{regular figure}|: \nameref{regular figure}

\noindent \textbf{Referencing:} \verb|\nameref{appendix figure}|: \nameref{appendix figure}

\noindent \textbf{Referencing:} \verb|\autoref{regular figure}|: \autoref{regular figure}

\noindent \textbf{Referencing:} \verb|\autoref{appendix figure}|: \autoref{appendix figure}

\hrule

\vfill

\end{document}

在此处输入图片描述

相关内容