我正在尝试做什么
我想创建一个自定义交叉引用标签,读者可以点击该标签并查看我引用的文本行。但是,我希望标签的编号能够自动进行,这样我就可以在文本中添加和删除项目,而无需手动重新编号。
为了实现这一点,我目前正在拼凑一个expl3
\prop_
行为类似于 Pythondict
或 C 类的map
函数,这很常见。我在命令中设置并调用我的自定义标签并进行测试。但是,似乎我\prop_item
的计数器以我意想不到的方式增加。
平均能量损失
\documentclass{article}
\usepackage{hyperref}
\usepackage{xparse}
% Define a dict-like object where I can store the label and my associated text.
\ExplSyntaxOn
\prop_new:N \g_prop_dict
\NewDocumentCommand{\dictappend}{mm}{%
\prop_gput:Nnn\g_prop_dict{#1}{#2}
}
\NewDocumentCommand{\CGet}{m}{%
\prop_item:Nn\g_prop_dict{#1}
}
\ExplSyntaxOff
% First counter
\newcounter{articlejournal}
\setcounter{articlejournal}{1}
\newcommand{\countAJ}[1]{%
\dictappend{#1}{AJ\thearticlejournal}
\phantomsection\label{#1}{\textbf{AJ\thearticlejournal}}
\stepcounter{articlejournal}
}%
% Secound counter
\newcounter{articleconference}
\setcounter{articleconference}{1}
\newcommand{\countAC}[1]{%
\dictappend{#1}{AC\thearticleconference}
\phantomsection\label{#1}{\textbf{AC\thearticleconference}}
\stepcounter{articleconference}
}%
% Command to retrieve the value and format it correctly.
\newcommand{\myref}[1]{\hyperref[#1]{\textbf{\CGet{#1}}}}
\begin{document}
\countAJ{foo} - is test 1
\countAJ{bar} - is test 2
\countAC{baz} - this is a different one
Here I reference \myref{bar} and \myref{foo}, and here I want \myref{baz}.
I expect these to look like AJ2, AJ1, and AC1, respectively.
\end{document}
使输入变量不可变
似乎我的\dictappend{#1}{A*\thearticle***}
格式化行没有像我期望的那样传递不可变值\the
。难道不是这样吗?
我不想要的东西或不起作用的东西
- 我尝试过使用这个帖子,但我尝试的配置都没有帮助。这很奇怪,因为@egreg 的答案似乎在我将其应用于时应该有效
\dictappend{#1}{\edef\newstring{AJ\thearticlejournal}}
,但这只会让我的字符串消失。 - 按照以下方式创建 2 个参数的标签定义这个问题此处不可接受。我希望能够将新条目插入大列表中,而无需手动重新编号。我的用例需要自我引用。
- 由于我有多个想要引用的计数器
\myref
,因此使用\the
访问计数不会达到我需要的效果正如这里所引用的。\the
单独使用时,我能做到的最好的就是仅注入计数器值。 - 同样地,使用
\refstepcounter
类似这个例子仅返回值而不是文本。
询问
为什么在此操作期间我的变量会增加?如何修复此问题,使它们在定义每个字典条目后不会改变?
答案1
当您将计数器的值存储在属性列表中时:
\NewDocumentCommand{\dictappend}{mm}{%
\prop_gput:Nnn\g_prop_dict{#1}{#2}
}
然后使用\dictappend
如下\countAJ
方式:
\dictappend{#1}{AJ\thearticlejournal}
由于中有签名AJ\thearticlejournal
,因此您以“不进行任何操作”的方式进行存储。n
\prop_gput:Nnn
\CGet
当您在中使用这个值时,它AJ\thearticlejournal
就会被扩展,换句话说,您会在调用(和)\thearticlejournal
的地方获得 的当前值。\CGet
\myref
如果您希望此值是您存储它时的值,那么您需要在那时扩展它。您可以使用\prop_gput:Nnx
而不是\prop_gput:Nnn
in来实现\dictappend
:
\NewDocumentCommand{\dictappend}{mm}{%
\prop_gput:Nnx\g_prop_dict{#1}{#2}
}