为 \ref 和 \cref 中未定义的引用指定“后备”(普通 LaTeX 和 cleverref)

为 \ref 和 \cref 中未定义的引用指定“后备”(普通 LaTeX 和 cleverref)

我在多个文档中使用了我的一些 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.stycleveref.stycleveref.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}

在此处输入图片描述

相关内容