![为什么这个自定义的“mytarget/mylink”定义对不能正常工作?](https://linux22.com/image/433300/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%E2%80%9Cmytarget%2Fmylink%E2%80%9D%E5%AE%9A%E4%B9%89%E5%AF%B9%E4%B8%8D%E8%83%BD%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
目标是获得一对命令,\mytarget(*)
和\mylink
/ \Mylink
。具体来说,我感兴趣的是为什么“我的”解决方案不起作用,以及如何修复它(如果可能的话)。
句法
\mytarget{<label name>}{<Text to display>}
\mytarget*{<label name>}{<Text to display>}
\mylink{<label name>}{<Text to instead display / could be empty>}
\mylink{<label name>}{<Text to instead display / could be empty>}
用法
该命令
\mytarget
旨在锚可以在文档中使用之前/之后引用。- 未加星号的版本,
\mytarget
,也是文本的一部分。例如,bla bla \mytarget{label name here}{123} uh uh
应该给出bla bla 123 uh uh
,并且“123”部分可以通过 / 更早/更晚地\mylink
引用\Mylink
。 - 带星号的版本,
\mytarget*
是不是文本的一部分。因此bla bla \mytarget*{label name here}{123} uh uh
应该给出bla bla uh uh
,并且“123”部分可以通过 / 更早/更晚地引用\mylink
。\Mylink
请注意,这里看不到“123”。
- 未加星号的版本,
命令
\mylink
/\Mylink
显示相应 的链接\mytarget
。- 例如,
bla bla \mytarget*{label name here}{123} uh uh \mylink{label name here}{}
将产生bla bla uh uh 123
。这里的“123”部分是关联到“bla bla”和“uh uh”之间的位置。(当然,这个例子很荒谬,而且实际上链接指向该行本身)。 - 如果给出了
\mylink{}{}
/的第二个参数,它应该\Mylink{}{}
覆盖原来的第二个参数\mytarget(*)
。例如,bla bla \mytarget*{label name here}{123} uh uh \mylink{label name here}{654}
应该给出bla bla uh uh 654
。“654”部分又是一个链接。 \mylink
/之间的区别\Mylink
在于它\mylink
忠实于 的第二个参数\mytarget(*){}{}
。而\Mylink
一切都以同样的方式预计\Mylink
将第二个参数的首字母大写。因此bla bla \mytarget*{label name here}{turtle} uh uh \mylink{label name here}{}
将得到bla bla uh uh turtle
;而bla bla \mytarget*{label name here}{turtle} uh uh \Mylink{label name here}{}
结果为bla bla uh uh Turtle
。请注意,在第二种情况下,“turtle”被大写为“Turtle”。在这两种情况下,“turtle”和“Turtle”都是链接。
- 例如,
努力
根据以下有益的评论玛丽金,我被引导到这个答案和包装crossreftools
。以下是我尝试过的:
\documentclass[12pt]{book}
\usepackage{amsmath}
\usepackage{aligned-overset}
\usepackage{commath}
\usepackage[shortlabels]{enumitem}
\usepackage[colorlinks=true, linkcolor=blue, hypertexnames=false]{hyperref}
\usepackage{crossreftools}
\makeatletter
\newcommand{\mytarget}{\@ifstar{\@mytargetstar}{\@mytargetnostar}}
\newcommand{\@mytargetstar}[2]{\crtcrossreflabel*{#2}[#1]\@ifnextchar\space{\hspace{-1sp}}{}}
\newcommand{\@mytargetnostar}[2]{\crtcrossreflabel{#2}[#1]\@ifnextchar\space{\hspace{-1sp}}{}}
\DeclareRobustCommand{\mylink}[2]{%
\if\relax\detokenize{#2}\relax
\crtnameref{#1}
\else
\crthyperlink{#1}{#2}
\fi
\@ifnextchar\space{\hspace{-1sp}}{}
}
\DeclareRobustCommand{\Mylink}[2]{%
\if\relax\detokenize{#2}\relax
\crtunameref{#1}
\else
\crthyperlink{#1}{\MakeUppercase #2}
\fi
\@ifnextchar\space{\hspace{-1sp}}{}
}
\makeatother
\begin{document}
a b c \mytarget*{anchor}{I0--I1} d e f
\newpage
Why doesn't the link of \mylink{anchor}{ullallaa} lead anywhere?
\end{document}
我的努力存在问题
- 为什么链接没有
\mylink{anchor}{ullallaa}
任何指向? - (非强制)我要把剩下的三个
newcommand
s改成 吗\DeclareRobustCommands
? - (非强制性)有没有比到处放置空格更好的方法来消除空格
\@ifnextchar\space{\hspace{-1sp}}{}
?
我正在运行
pdflatex
3.141592653-2.6-1.40.22 (MikTeX 21.3),并且我本地发行版中的每个软件包都已于 2021 年 4 月 28 日更新。在默认设置下,Overleaf 上的输出是相同的(就错误而言,以及没有这 3 个软件包时链接不起作用)。
答案1
有时候您的问题是可以读懂的,但是经过这么多的编辑,我感到压力太大了。
我猜你正在寻找 \nameref,所以是这样的(没有所有的星星和变体):
\documentclass{article}
\usepackage{hyperref}
\makeatletter
\newcommand\mytarget[2]{\phantomsection\NR@gettitle{#2}\label{#1}#2}
\newcommand\mylink[1]{\nameref{#1}}
\makeatother
\begin{document}
\mytarget{blub}{TARGET}
\newpage
\mylink{blub}
\end{document}