cleveref——同时使用缩写和完整形式的引用?

cleveref——同时使用缩写和完整形式的引用?

话语章、部、附录、表格、图表、等在文中均小写并拼写出来(但有时在括号引用中缩写)。

(《芝加哥格式手册》第 16 版第 8.178 节)

梅威瑟:

\documentclass{scrartcl}
\usepackage[demo]{graphicx}
\usepackage{cleveref}
\begin{document}

\section{Geometric abstraction}
\Cref{myfig} shows a black square. For a black square, please refer to \cref{myfig}. Squares can be black (cf.\ \cref{myfig}).

\begin{figure}
    \centering 
    \includegraphics[width=6cm,height=6cm]{fig1.pdf}
    \caption[asd]{Kazimir Malevich. \textit{Black Square.} 1915. Oil on canvas. State Russian Museum, St Petersburg.}
    \label{myfig}
\end{figure}

\end{document}

MWE 生产: 在此处输入图片描述

我正在寻找: 在此处输入图片描述

有没有一种聪明的方法(抱歉)来实现这一点cleveref?我知道这\Cref{}将始终产生完整形式的大写引用,所以这是一个好的开始。但我该如何处理句子中间的非括号引用?

答案1

这是另一种不需要深入研究 内部结构的方法cleveref。其思路是使用 本地更改名称\crefname

示例输出

\documentclass{scrartcl}

\usepackage[demo]{graphicx}
\usepackage[noabbrev]{cleveref}

\DeclareRobustCommand{\abbrevcrefs}{%
\crefname{figure}{fig.}{figs.}%
\crefname{equation}{eqn.}{eqns.}%
}

\DeclareRobustCommand{\cshref}[1]{{\abbrevcrefs\cref{#1}}}

\begin{document}

\section{Geometric abstraction}

\begin{equation}
  \label{eq:x}
  x = 1.
\end{equation}
\Cref{myfig} shows a black square. For a black square, please refer to
\cref{myfig,eq:x}. Squares can be black (cf.\ \cshref{myfig,eq:x}).
Back to \cref{myfig,eq:x}.

\begin{figure}
    \centering
    \includegraphics[width=6cm,height=6cm]{fig1.pdf}
    \caption[asd]{Kazimir Malevich. \textit{Black Square.} 1915. Oil on canvas. State Russian Museum, St Petersburg.}
    \label{myfig}
\end{figure}

\end{document}

我们加载了cleveref包含noabbrev获取所有全名版本的选项的包。我们提供了封装在命令中的缩写形式列表\abbrevcrefs,然后\cshref为缩写引用定义了一个新命令,该命令\cref调用了由组进行\abbrevcrefs并包含在组中以使效果局部化。

可以使用相同的通用方法来制作cleveref包中其他命令的修改版本。

我原本希望能够只\@cref@abbrevtrue在本地使用内部开关来启用缩写,但事实证明,cleveref只有在最初定义标签名称时才使用此开关,而不是在排版时使用。标签定义过程与代码挂钩\AtBeginDocument,无法轻松重新评估以提取缩写版本,因此需要自己设置缩写。

答案2

好的,我想我找到了一个解决方案——但它既不优雅也不聪明;-)

我定义了一个新命令lcCref,它将始终给出小写的完整形式引用,并且还能正确处理复数引用:

\usepackage{xstring}
\def\lcCref#1{%
    \StrCount{#1}{,}[\n]%
    \ifnum\n>0\relax%
        \StrBefore[1]{#1}{,}[\myFirst]%
        \lcnamecrefs{\myFirst}~\labelcref{#1}%
    \else%
        \lcnamecref{#1}~\labelcref{#1}%
    \fi%
}

首先,计算参数的数量。如果引用单个标签,则将lcnamecref和的输出labelcref合并(参见cleveref文档)。如果有多个引用,lcnamecrefs则使用而不是lcnamecrefStrBefore构造是必需的,因为lcnamecrefs只接受单个标签作为参数。

\lcCref{myfig}将导致figure 1,而\lcCref{myfig,anotherfig}将导致figures 1 and 2

我感觉这可能过于复杂。但它似乎有效...

相关内容