ltproperties:如何向 \RefProperty 添加超链接?

ltproperties:如何向 \RefProperty 添加超链接?

\property_ref:nn从新使用时ltproperties,应如何正确地添加超链接?


在下面的例子中,我定义了两个命令\MyLabel\MyRef\MyLabel将记录当前的标签和类型,并\MyRef相应地打印。我想添加\MyRef指向相应 的超链接MyLabel。但是,直接使用\hyperref[label]{...}会导致错误:

Use of \??? doesn't match its definition.
<argument> \???  

这个错误信息实际上并没有说明太多问题,所以我不知道到底哪里出了问题。

在这种情况下,有一个属性target可能很有用(例如,也许应该用 ? 替换label\property_ref:nn { #1 } { target }。但是我没有成功让它工作:当我写\property_record:nn { #1 } { label, type, target }而不是 时\property_record:nn { #1 } { label, type },错误消失了,但生成的超链接不起作用。

\documentclass{article}

\usepackage{hyperref}

\ExplSyntaxOn

\tl_new:N \l__mymodule_current_type_tl

\property_new:nnnn { type } { now } { unknown } { \l__mymodule_current_type_tl }
\NewDocumentCommand \MyLabel { m }
  {
    \group_begin:
    \exp_args:No \addtocounter { mymodule_ \l__mymodule_current_type_tl } { -1 }
    \exp_args:No \refstepcounter { mymodule_ \l__mymodule_current_type_tl }
    % \label{#1}
    \property_record:nn { #1 } { label, type }
    \group_end:
  }
\NewDocumentCommand \MyRef { m }
  {
    \group_begin:
    % \hyperref[#1]
      {
        \tl_use:c { l_mymodule_ \property_ref:nn { #1 } { type } _label_text_tl }
        \nobreakspace
        % \ref{#1}
        \property_ref:nn { #1 } { label }
      }
    \group_end:
  }

\newcounter{mymodule_T}
\tl_const:Nn \l_mymodule_T_label_text_tl { TEST }
\NewDocumentEnvironment { test } { }
  {
    \tl_set:Nn \l__mymodule_current_type_tl { T }
    \fbox{ \l_mymodule_T_label_text_tl \nobreakspace \tl_use:c {themymodule_T} }
  }
  {
    % Does nothing
  }

\ExplSyntaxOff

\begin{document}

\begin{test}\MyLabel{test}
\end{test}

\bigskip

\MyRef{test}

\end{document}

答案1

如果您想要设置超链接,则需要目标名称。\label会自动存储该名称,但\property_record:nn实际上并非如此。您必须在那里明确添加它。另外,最好不要定义类似这样的通用属性type。这些名称应该为内核保留。如果其他软件包也使用此类名称,您将遇到问题。

\documentclass{article}

\usepackage{hyperref}

\ExplSyntaxOn

\tl_new:N \l__mymodule_current_type_tl

\property_new:nnnn { jinwen/type } { now } { unknown } { \l__mymodule_current_type_tl }
\NewDocumentCommand \MyLabel { m }
  {
    \addtocounter { mymodule_ \l__mymodule_current_type_tl } { -1 }
    \refstepcounter { mymodule_ \l__mymodule_current_type_tl }
    \property_record:nn { #1 } { label, jinwen/type,target }
  }
\NewDocumentCommand \MyRef { m }
  {
     \hyperlink{\property_ref:nn{#1}{target}}
      {
        \cs_if_exist_use:c 
         { l_mymodule_ \property_ref:nn { #1 } { jinwen/type } _label_text_tl }
        \nobreakspace
        \property_ref:nn { #1 } { label }
      }
  }

\newcounter{mymodule_T}

\tl_const:Nn \c_mymodule_T_label_text_tl { TEST }
\NewDocumentEnvironment { test } { }
  {
    \tl_set:Nn \l__mymodule_current_type_tl { T }
    \fbox{ \c_mymodule_T_label_text_tl \nobreakspace \tl_use:c {themymodule_T} }
  }
  {
    % Does nothing
  }

\ExplSyntaxOff

\begin{document}

\begin{test}\MyLabel{test}
\end{test}

\bigskip

\MyRef{test}

\end{document}

相关内容