标记文本并在稍后引用

标记文本并在稍后引用

有没有办法将标签附加到字符串,然后通过引用来引用该字符串?

例如,

\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}

相关内容