将未定义的引用??替换为自定义文本?

将未定义的引用??替换为自定义文本?

我在编写大型文档时使用了 luatex 和 cleverref 包。我通常只想编译其中的一部分,但我希望在只编译单个章节时输出效果会更好一些。

我不希望用?? 替换未定义的引用,而是想插入自己的自定义文本。

目前我的解决方案是定义新的命令 \ucref 和 \ucite,并在任何跨章节引用中使用它们代替 \cite 和 \cref。当我只编译特定章节时,我将这些命令定义为:

\newif\ifpublishversion{}
\publishversionfalse{}
%\publishversiontrue{}

\ifpublishversion{}        
    \newcommand{\ucref}[1]{\color{red} ref{(#1)} \color{black}}
    \newcommand{\UCref}[1]{\color{red} ref{(#1)} \color{black}}
    \newcommand{\ucite}[1]{[\color{green}#1\color{black}]}
\else
    \newcommand{\ucref}[1]{\cref{#1}}
    \newcommand{\UCref}[1]{\Cref{#1}}
    \newcommand{\ucite}[1]{\cite{#1}}
\fi

然后,当我编译整个文档时,我将它们改为指向 \cref 和 \cite 以获得默认行为。

如果我可以在任何地方使用 \cref 和 \cite 那就太好了,但是当引用未定义时,乳胶会发出警告,然后插入这个自定义的“漂亮”文本而不是?? 双问号。

有没有办法写类似的东西......

% PSEUDOCODE
% Do ways to do something like this exist?
\setundefinedreftext[1]{\ucref{#1}}
\setundefinedcitetext[1]{\ucite{#1}}

答案1

正如我在评论中提到的,我们无法建议如何修补您的\cite命令,因为我们不知道您是如何“做”参考书目工作的。但这些cref工作可能相当简单(取决于您使用的软件包的哪些部分)。例如:

\documentclass{article}
\parindent 0pt
\usepackage[T1]{fontenc}
\usepackage{etoolbox, xcolor, cleveref}

\newcommand*{\undeffmt}[1]{\textcolor{red}{ref (#1)}}%
\newcommand*{\patchsuccess}[1]{\typeout{Etoolbox patch: Success for \string#1}}
\newcommand*{\patchfailure}[1]{\typeout{Etoolbox patch: Failure for \string#1}}

\makeatletter

\patchcmd{\@setcref}%
  {\nfss@text{\reset@font\bfseries ??}}
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setcref}}
  {\patchfailure{\@setcref}}

\patchcmd{\@setcrefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setcrefrange}}
  {\patchfailure{\@setcrefrange}}
\patchcmd{\@setcrefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#2}}}
  {\patchsuccess{\@setcrefrange}}
  {\patchfailure{\@setcrefrange}}
\patchcmd{\@setcrefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setcrefrange}}
  {\patchfailure{\@setcrefrange}}
\patchcmd{\@setcrefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#2}}}
  {\patchsuccess{\@setcrefrange}}
  {\patchfailure{\@setcrefrange}}

\patchcmd{\@setnamecref}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setnamecref}}
  {\patchfailure{\@setnamecref}}

\patchcmd{\@setcpageref}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setcpageref}}
  {\patchfailure{\@setcpageref}}

\patchcmd{\@setcpagerefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setcpagerefrange}}
  {\patchfailure{\@setcpagerefrange}}
\patchcmd{\@setcpagerefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#2}}}
  {\patchsuccess{\@setcpagerefrange}}
  {\patchfailure{\@setcpagerefrange}}
\patchcmd{\@setcpagerefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#1}}}
  {\patchsuccess{\@setcpagerefrange}}
  {\patchfailure{\@setcpagerefrange}}
\patchcmd{\@setcpagerefrange}%
  {\nfss@text{\reset@font\bfseries ??}}%
  {\nfss@text{\reset@font\undeffmt{#2}}}
  {\patchsuccess{\@setcpagerefrange}}
  {\patchfailure{\@setcpagerefrange}}

\makeatother

\begin{document}

\section{One}

defined cref:   \cref{aaa}   \par
undefined cref: \cref{undef} \par
\bigskip

defined crefrange:        \crefrange{aaa}{ccc} \par
1st undefined crefrange:  \crefrange{und}{ccc} \par
2nd undefined crefrange:  \crefrange{aaa}{und} \par
both undefined crefrange: \crefrange{un1}{un2} \par
\bigskip

defined cpageref:   \cpageref{aaa} \par
undefined cpageref: \cpageref{bbb} \par
\bigskip

defined cpagerefrange:        \cpagerefrange{aaa}{ccc} \par
1st undefined cpagerefrange:  \cpagerefrange{und}{ccc} \par
2nd undefined cpagerefrange:  \cpagerefrange{aaa}{und} \par
both undefined cpagerefrange: \cpagerefrange{unf1}{un2} \par
\bigskip

defined nameref:   \namecref{aaa} \par
undefined nameref: \namecref{und} \par


\newpage
\section{Two}

\label{aaa}%
% \label{bbb}%
It would be nice if I could just use \Cref{ccc} and cite everywhere,
but when a reference is undefined have latex spit out a warning and
then insert this custom ``nice'' (e.g., \Cref{bbb}) text instead of a
??  double question mark.

\newpage
\section{Three}
\label{ccc}

\end{document}

如您所见,它已设置为您可以在 的定义中定义所需的字符串\undeffmt。 (我试图使它与您的原始示例保持相似,但如果由我决定,我可能会选择不同的东西。)

最后,如果这不符合您的需要,这很可能是因为这类问题确实需要一个“最小工作示例”,以便其他人才能正确地看到您的隐含选择和假设。

相关内容