交叉引用由自定义声明定义的文本

交叉引用由自定义声明定义的文本

我研究了交易所上大量的交叉引用(或链接)条目,但还没有找到一个符合我需求的条目。如果我错过了解决方案,请提前致歉。

我想交叉引用文本,而不是计数器。我希望交叉引用链接文本能够自动获取目标声明中的任何更改。(我特别不想在更改目标文本时调整链接文本。目标文本中的更改应自动反映到指向它的任何链接中。)最后,我想对自定义声明而不是内置声明执行此操作。

以下是自定义声明定义的示例及其实例:

% it is not important how this declaration is defined, 
% only that it have link-able text.
\newcommand{\heading}[2]{
\vspace{#2}
{\begin{center}\Large\textbf{#1}\end{center}}
\vspace{#2}
}

...

\heading{Target Link Text}{6pt} % I want to link to this text

现在我想使用某种形式的标签和交叉引用命令来交叉引用此声明实例。因此,如下所示:

\heading{Target Link Text}{6pt} \label{foo}

...

The linked text is: \somelinkcommand{foo} % replace somelinkcommand by a real command

在生成的输出中,我们会看到以下内容(不带引号):

“链接文本是:目标链接文本”

因此,该行为有点类似于 hyperref 包中的 \nameref 选项,只是它支持自定义/用户命令。请问我该怎么做?提前致谢。

答案1

(这是对我的答案的一次重大编辑,因为我忽略了人们可能会将\label-commands 放入命令的第一个参数中\heading而不是将它们放在该命令后面。)

就在几周前,TeX - LaTeX StackExchange 上出现了一个问题“如何防止在新环境中引用枚举?”,我看到了详细阐述与\label..\ref机制相关的事物在 LaTeX 2ε 中相互作用的方式的机会。我当时的回答可以在这里找到: https://tex.stackexchange.com/a/442118/118714

让您的\heading-command 使用\NR@gettitle重新定义宏\@currentlabelname以扩展为 -references 所需的文本短语\nameref,并继续使用\refstepcounter- - \label-\nameref机制。(\NR@gettitle执行“中和”命令,例如\label不应在\label-command 的数据中出现,因为这会导致每个引用尝试创建已经存在的标签。)在您的场景中,\refstepcounter它仅用于其“副作用”——除了增加计数器之外——放置锚点并使该锚点的名称可供 -command 使用\label。您也可以将-referencing-data\let\@currentlabel=\@currentlabelname转换为-referencing-data。\nameref\ref

\documentclass{article}
\usepackage{hyperref}
\usepackage{lipsum}

\makeatletter
\newcounter{heading}
\newcommand\heading[2]{%
  % \refstepcounter is only used for is side-effect of placing an anchor for hyperlinks
  % and making that anchor's name available to \label.
  \vspace{#2}%
  {\begin{center}%
  \refstepcounter{heading}% <- This places an anchor for hyperlinks.
  \NR@gettitle{#1}%<- This extracts disturbing things like \label-commands from the title
                  %   and defines \@currentlabelname which in turn is used by sectioning
                  %   commands for providing to the `\label`-command data for \nameref-
                  %   references.
  \let\@currentlabel=\@currentlabelname %<-This makes the data for \nameref-references also
                                        %  data for \ref-references.
  \Large\textbf{#1}%
  \end{center}}%
  % Do it again outside the scope as users might wish to place the \label-command not
  % into the argument of the \heading-command but behind the headingt command:
  \NR@gettitle{#1}\let\@currentlabel=\@currentlabelname
  \vspace{#2}%
}%
\makeatother

\begin{document}

\nameref{firstheading}

\nameref{secondheading}

\ref{firstheading}

\ref{secondheading}

\section{A section}
\lipsum[1]

\heading{This is the first heading}{6pt}\label{firstheading}

\newpage
\section{A section}
\lipsum[2]

\heading{This is the second heading}{6pt}\label{secondheading}

\end{document}

答案2

以下内容能满足您的要求吗?

\documentclass[12pt]{article}
\usepackage{titlesec} 
\usepackage{hyperref}
\usepackage{lipsum}
\makeatletter % https://tex.stackexchange.com/a/123667/121799
\def\ttl@useclass#1#2{%
  \@ifstar
    {\ttl@labelfalse\@dblarg{#1{#2}}}% {\ttl@labelfalse#1{#2}[]}%
    {\ttl@labeltrue\@dblarg{#1{#2}}}}
\makeatother
\titleformat{\paragraph}[block]{\Large\normalfont\bfseries\filcenter}{\theparagraph}{0em}{}
\newcommand{\heading}[2][5pt]{
\titlespacing*{\paragraph}{0pt}{#1}{#1}
\paragraph{#2}}
\newcommand{\somelinkcommand}[2][]{\nameref{#2}}
\begin{document}

\heading{koala bear\label{koala}}

\lipsum[1-5]

\somelinkcommand{koala}s are cute

\end{document}

相关内容