\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}