为什么我的 expl3 \prop_item 会增加我的 \stepcounter?

为什么我的 expl3 \prop_item 会增加我的 \stepcounter?

我正在尝试做什么

我想创建一个自定义交叉引用标签,读者可以点击该标签并查看我引用的文本行。但是,我希望标签的编号能够自动进行,这样我就可以在文本中添加和删除项目,而无需手动重新编号。

为了实现这一点,我目前正在拼凑一个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:Nnnin来实现\dictappend

\NewDocumentCommand{\dictappend}{mm}{%
  \prop_gput:Nnx\g_prop_dict{#1}{#2}
}

相关内容