为什么这个自定义的“mytarget/mylink”定义对不能正常工作?

为什么这个自定义的“mytarget/mylink”定义对不能正常工作?

目标是获得一对命令,\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>}

用法

  1. 该命令\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”。
  2. 命令\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}

我的努力存在问题

  1. 为什么链接没有\mylink{anchor}{ullallaa}任何指向?
  2. (非强制)我要把剩下的三个newcommands改成 吗\DeclareRobustCommands
  3. (非强制性)有没有比到处放置空格更好的方法来消除空格\@ifnextchar\space{\hspace{-1sp}}{}

我正在运行pdflatex3.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}

相关内容