我在多个文档中使用了我的一些 LaTeX 文件。因此,在某些文档中我的引用将被定义,而在其他文档中则不会。我希望有一种方法可以\ref
优雅地降级。
因此(许多年前)我制作了一个包sref.sty
,允许引用以下形式
as shown \sref[pre=in,fallback=above]{thm.foo}.'
pdflatex
将其格式化为“如图所示定理 3.2.1。”如果 a\label{thm.foo}
在文档中并且“如上所示。”否则。
但是,包中涵盖了合格的参考文献“定理 3.2.1”(好得多) ,我正在考虑使用cleveref
重新实现。或者使用上述功能对 进行扩展。或者我可能不知道我所需要的现有实现可以直接使用。sref.sty
cleveref.sty
cleveref.sty
对于任何反馈,我们都表示感谢。
答案1
您可以利用它扩展为一个字符串,当不存在\getrefnumber{<label>}
时可以进行自定义。<label>
默认字符串是0
,它可能足够安全,但在这里我使用了不太可能作为交叉引用出现的其他字符串。
\documentclass{article}
\usepackage{refcount}
\usepackage{cleveref}
\setrefcountdefault{DNE}
\ExplSyntaxOn
\NewDocumentCommand{\sref}{O{}m}
{
\group_begin:
\keys_set:nn { kohlhase/sref } { #1 }
\str_if_eq:eeTF { \getrefnumber{#2} } { DNE }
{% no ref
\l__kohlhase_sref_fallback_tl
}
{% call \cref
\l__kohlhase_sref_pre_tl \c_space_tl \cref{#2}
}
\group_end:
}
\keys_define:nn { kohlhase/sref }
{
pre .tl_set:N = \l__kohlhase_sref_pre_tl,
fallback .tl_set:N = \l__kohlhase_sref_fallback_tl,
}
\ExplSyntaxOff
\newtheorem{theorem}{Theorem}
\begin{document}
\begin{theorem}\label{existent}
$1+1=2$
\end{theorem}
As shown \sref[pre=in,fallback=above]{existent}
As shown \sref[pre=in,fallback=above]{nonexistent}
\end{document}
答案2
作为一种简单的方法,也许您可以使用sref
但“外包”非后备引用cleveref
。例如:
\documentclass{article}
\usepackage[colorlinks]{hyperref}
\usepackage{cleveref}
\usepackage{sref}
\makeatletter
\renewcommand\sref@hlink[5][]{%
\edef\@fallback{#3}%
\@ifundefined{r@#2}{%
\ifx\@fallback\@empty% warn about undefined links and show a substitute
\protect\G@refundefinedtrue\PackageWarning{sref}{reference #2 undefined}%
\cref{#2}%
\else%
\protect\G@refundefinedtrue\PackageWarning{sref}{using fallback for undefined reference #2}%
\@fallback%
\fi
}{%
#4 \cref{#2}%
}%
}%
\makeatother
\begin{document}
\section{A section}
\label{sec}
\begin{figure}
\centering\fbox{A figure}
\caption{with caption}
\label{fig}
\end{figure}
\begin{table}
\fbox{A table}
\centering\caption{with caption}
\label{tab}
\end{table}
As shown \sref[pre=in,fallback=nowhere]{fig}, see also\sref{tab}\sref[pre=in]{sec}.\\
As shown \sref[pre=in,fallback=nowhere]{fig2}, see also\sref{tab}\sref[pre=in]{sec}.
\end{document}