有没有办法配置 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}