![标记文本并在稍后引用](https://linux22.com/image/320233/%E6%A0%87%E8%AE%B0%E6%96%87%E6%9C%AC%E5%B9%B6%E5%9C%A8%E7%A8%8D%E5%90%8E%E5%BC%95%E7%94%A8.png)
有没有办法将标签附加到字符串,然后通过引用来引用该字符串?
例如,
\labelText{This is a text that is also a tag}{label:text}
然后用它来引用该字符串,\ref{label:text}
其中字符串本身将作为标签。
为什么我需要它?我正在编写伪代码并使用命令go to #line number
,但如果我在代码中插入额外的行,行号可能会改变。通过引用可以避免这种情况。
答案1
类似这样?这会将文本明确写入文件.aux
并提供指向该文件的超链接。用于\nameref
获取标签内容,而不是标签编号(由 提供\ref
)
有了更多信息,就可以提供更好的解决方案。
\documentclass{article}
\usepackage{blindtext}
\usepackage{hyperref}
\usepackage{nameref}
\newcounter{mylabelcounter}
\makeatletter
\newcommand{\labelText}[2]{%
#1\refstepcounter{mylabelcounter}%
\immediate\write\@auxout{%
\string\newlabel{#2}{{1}{\thepage}{{\unexpanded{#1}}}{mylabelcounter.\number\value{mylabelcounter}}{}}%
}%
}
\makeatother
\begin{document}
\blindtext[5]
\begin{center}
In \nameref{label:text} we have
\end{center}
\section{First} \label{firstsection}
\blindtext[5]
\labelText{This \textsc{is} a text that is also a tag}{label:text}
\end{document}
答案2
\label
将引用的当前值\@currentlabel
;只需使用此功能。
\documentclass{article}
% for LaTeX before 2015 uncomment the two following lines
%\usepackage{fixltx2e}
%\MakeRobust{\ref}
% for LaTeX between 2015 and 2021 uncomment the following line
%\MakeRobust{\ref}
\makeatletter
\newcommand{\labeltext}[2]{%
\@bsphack
\csname phantomsection\endcsname % in case hyperref is used
\def\@currentlabel{#1}{\label{#2}}%
\@esphack
}
\makeatother
\begin{document}
\section{Test}\label{sec-test}
Some text and a textual label\labeltext{Some text in section~\ref{sec-test}}{try}
\section{Again}
Here it is: ``\ref{try}''
\end{document}
如果您的 LaTeX 内核早于 2015/01/01,请更新它。在此之前,请添加\usepackage{fixltx2e}
以便\MakeRobust
可用。\ref
如果您加载,则无需进行健壮处理hyperref
。
答案3
添加第二个完全不同的答案,适用于我的crossreftools
包(需要版本 0.6,来自
DropBox 链接)
\documentclass{article}
\usepackage{blindtext}
\usepackage{hyperref}
\usepackage{crossreftools}
\makeatletter
\def\labelText{%
\@ifstar{\@labeltextstarred}{\@labeltext}
}
\newcommand{\@labeltextstarred}[2]{%
\crtcrossreflabel*{#1}[#2]%
}
\newcommand{\@labeltext}[2]{%
\crtcrossreflabel{#1}[#2]%
}
\makeatother
\begin{document}
\labelText{Sample with holes}{label:text} \labelText*{and now for something completely different}{other:text}
In \crtlnameref{label:text} or \crtunameref{other:text} or \crtnameref{label:text}
\end{document}