我想创建一个具有以下功能的命令:
\newcommand{\mycom}[2]{...}
\newcommand{\linktomycom}[1]{...}
在文档正文中:
\mycom{firstitem}{This is the first item}
然后:
\linktomycom{firstitem}
这相当于:
\hyperref[firstitem]{This is the first item}
并链接至我写作的位置\mycom
。
...
我尝试过 phantomsec,但它似乎缺少命名功能。谢谢任何提示。
答案1
命令可以像这样定义:
\makeatletter
\newcommand{\mycom}[2]{\hypertarget{#1}{#2}\global\@namedef{mycom@#1}{#2}}
\newcommand{\linktomycom}[1]{%
\@ifundefined{mycom@#1}{\textbf{??}\@latex@warning{Reference `#1' on page \thepage \space undefined}}%
{\hyperlink{#1}{\@nameuse{mycom@#1}}}%
}
\makeatother
\mycom{...}{...}
使用第二个参数的文本创建一个名为第一个参数的目标,并将标题保存在宏中\mycom@<first argument>
。
\linktomycom{...}
检查是否\mycom@<first argument>
已定义 - 如果未定义,则会产生两个问号和一个 LaTeX 警告,否则,会生成一个包含先前保存的文本的指定目标的链接。
(定义被括在里面,因为使用了名称中\makeatletter ... \makeatother
带有 的内部 LaTeX 宏。)@
编辑:
我无法确定您是否希望该\mycom
命令生成可见的标题或仅生成(不可见的)锚点 - 如果您想要后者,则必须用空文本定义目标:
\newcommand{\mycom}[2]{\hypertarget{#1}{}\@namedef{mycom@#1}{#2}}