我在编写大型文档时使用了 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
。 (我试图使它与您的原始示例保持相似,但如果由我决定,我可能会选择不同的东西。)
最后,如果这不符合您的需要,这很可能是因为这类问题确实需要一个“最小工作示例”,以便其他人才能正确地看到您的隐含选择和假设。