我有一个 .tex 文档,其中包含一些对不存在标签的引用。例如,它可能有\ref*{some:string}
,但没有\label{some:string}
。这导致在生成 PDF 时打印双问号??
。这些引用过去指向一个超大的附录,我没有将其包括在此文档的简短版本中。不过,我希望能够打印正确的章节编号,而不是??
。
因此,我创建了一个命令,创建一个仅包含缺失标签的空方程式并赋予其所需的标签,以便我可以将标签字符串链接到正确的部分编号。
\newcommand{\dummylabel}[2]{\begin{equation*}\tag{#2}\label{#1}\end{equation*}}
在我的文档的某个部分,我有一个这样的列表\dummylabel
,如下所示:
\dummylabel{some:string1}{A.1}
\dummylabel{some:string2}{C}
...
但是,这有打印编号的空方程式的副作用(尽管我使用带星号的方程式环境),这是我不想要的。
那么,有没有办法隐藏这些空的方程式?或者,有没有其他方法可以为这些引用创建标签和手动为它们提供标签/编号,以便在生成 PDF 时它会打印该标签而不是??
?
请注意,这些参考文献都带有星号(\ref*{...}
),因此实际上并没有创建超链接,这很好。
答案1
当然,您需要手动定义参考。
\documentclass{article}
\makeatletter
\newcommand{\dummylabel}[2]{\def\@currentlabel{#2}\label{#1}}
\makeatother
\begin{document}
\dummylabel{some:string1}{A.1}
\dummylabel{some:string2}{C}
Here are references to the dummy labels: \ref{some:string1} and \ref{some:string2}
\end{document}
如果您加载hyperref
,请使用\ref*
以便不建立链接。
解释:\label{foo}
使foo
指的是 的当前值\@currentlabel
;通常是\refstepcounter
设置\@currentlabel
,但人们可以将其设置为任何想要的值。
警告。命令\dummylabel
应该放在之后\begin{document}
,因为在序言中该.aux
文件不可写入。
您也可以将其放置\dummylabel
在底部,就在之前\end{document}
。
答案2
我使用 @Ulrike Fischer 的 hack 解决了同样的问题压缩文本.tex。这是下面代码中的注释部分。我定义了另一个命令来保留原始命令\ref
,并且如果标签不存在,则可以添加额外内容
\documentclass{report}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\checkref}{mmO{\ref{#1}}}{\@ifundefined{r@#1}{#2}{#3}}
%\AtBeginDocument{\let\Oriref\ref
% \renewcommand\ref[1]{%
% \@ifundefined{r@#1}
% {no label #1}
% {ref of #1: \Oriref{#1}}}}
\makeatother
\begin{document}
\section{one}\label{testyes}
\ref{testyes}
\ref{testno}
\checkref{testyes}{NO}
\checkref{testyes}{NO}[YES]
\checkref{testno}{NO}[YES]
\end{document}