Por que meu expl3 \prop_item incrementa meu \stepcounter?

Por que meu expl3 \prop_item incrementa meu \stepcounter?

O que estou tentando fazer

Quero criar uma tag de referência cruzada personalizada na qual um leitor possa clicar e visualizar a linha de texto à qual estou fazendo referência. No entanto, quero que a numeração das tags seja automatizada para que eu possa adicionar e subtrair itens do meu texto sem renumerar algo manualmente.

Para conseguir isso, estou atualmente reunindo um expl3 \prop_que se comporte de maneira semelhante ao Python dictou ao tipo C, mapque são bastante comuns. Eu defino e chamo minhas tags personalizadas dentro de comandos e faço um teste. MAS, parece que \prop_itemincremento meu contador de uma maneira que não esperava.

MWE

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

insira a descrição da imagem aqui

Tornando variáveis ​​de entrada imutáveis

Parece que minhas \dictappend{#1}{A*\thearticle***}linhas formatadas não estão passando valores imutáveis \the​​como eu esperaria. Não é assim que funciona?

O que eu não quero ou não funciona

  • Eu tentei usar peças deesta postagem, mas nenhuma configuração ajudou que eu tentei. Isso é estranho, porque a resposta de @egreg parece que deveria funcionar quando eu a aplico \dictappend{#1}{\edef\newstring{AJ\thearticlejournal}}, mas isso apenas faz minha string desaparecer.
  • Fazendo uma definição de rótulo de 2 argumentos à laessa questãonão é aceitável aqui. Quero poder inserir uma nova entrada em uma lista grande sem renumerar as coisas manualmente. Meu caso de uso requer autorreferência.
  • Como tenho vários contadores aos quais quero fazer referência \myref, usar \thepara acessar a contagem não tem o efeito que precisocomo citado aqui. Usando \thesozinho, o melhor que consegui foi a injeção apenas do valor do contador.
  • Da mesma forma, trabalhando com \refstepcountersemelhantes aeste exemploretorna apenas o valor em vez do texto.

A pergunta

Por que minhas variáveis ​​estão aumentando durante esta operação? Como posso corrigir isso de forma que eles não mudem após a definição de cada entrada de dict?

Responder1

Quando você armazena o valor do seu contador na lista de propriedades com:

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

Então use \dictappendcomo \countAJ:

\dictappend{#1}{AJ\thearticlejournal}

Você está armazenando AJ\thearticlejournalcom "sem manipulação", dada a nassinatura em \prop_gput:Nnn.

Quando você usa esse valor em \CGetentão AJ\thearticlejournalé expandido, ou seja, você obtém o valor atual para \thearticlejournalno local que você chamou \CGet(e \myref).

Se você deseja que esse valor seja aquele no ponto em que o armazenou, será necessário expandi-lo nesse ponto. O que você pode fazer usando \prop_gput:Nnxem vez de \prop_gput:Nnnin \dictappend:

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

informação relacionada