¿Por qué mi expl3 \prop_item incrementa mi \stepcounter?

¿Por qué mi expl3 \prop_item incrementa mi \stepcounter?

Lo que estoy tratando de hacer

Quiero crear una etiqueta de referencia cruzada personalizada en la que un lector pueda hacer clic y ver la línea de texto a la que hago referencia. Sin embargo, quiero que la numeración de las etiquetas sea automatizada para poder agregar y restar elementos de mi texto sin tener que volver a numerar algo manualmente.

Para lograr esto, actualmente estoy preparando un programa expl3 \prop_que se comporta de manera similar a Python dicto C, mapque son bastante comunes. Configuro y llamo mis etiquetas personalizadas dentro de los comandos y escupo una prueba. PERO, parece que \prop_itemincrementa mi contador de una manera que no esperaba.

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}

ingrese la descripción de la imagen aquí

Hacer que las variables de entrada sean inmutables

Parece que mis \dictappend{#1}{A*\thearticle***}líneas formateadas no pasan valores inmutables \thecomo esperaría. ¿No es así como funciona?

Lo que no quiero o no funciona

  • He intentado usar piezas deesta publicación, pero ninguna configuración ayudó que lo intenté. Esto es extraño, porque la respuesta de @egreg parece que debería funcionar cuando la aplico \dictappend{#1}{\edef\newstring{AJ\thearticlejournal}}, pero esto simplemente hace que mi cadena desaparezca.
  • Hacer una definición de etiqueta de 2 argumentos a laesta preguntaNo es aceptable aquí. Quiero poder insertar una nueva entrada en una lista grande sin tener que volver a numerar las cosas manualmente. Mi caso de uso requiere autorreferencia.
  • Como tengo varios contadores a los que quiero hacer referencia \myref, usando\the para acceder al recuento no tiene el efecto que necesitocomo se cita aquí. Usando \thesolo, lo mejor que pude lograr fue inyectar únicamente el valor del contador.
  • Del mismo modo, trabajar con\refstepcounter similares aeste ejemplosolo devuelve el valor en lugar del texto.

La pregunta

¿Por qué mis variables aumentan durante esta operación? ¿Cómo puedo solucionar este problema para que no cambien después de definir cada entrada de diccionario?

Respuesta1

Cuando almacena el valor de su contador en la lista de propiedades con:

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

Luego utilícelo \dictappendcomo \countAJ:

\dictappend{#1}{AJ\thearticlejournal}

Estás almacenando AJ\thearticlejournal"sin manipulación", dada la nfirma en \prop_gput:Nnn.

Cuando usas este valor en \CGetthen AJ\thearticlejournalse expande, en otras palabras, obtienes el valor actual \thearticlejournalen el lugar al que llamaste \CGet(y \myref).

Si desea que este valor sea el del punto en el que lo almacenó, debe expandirlo en ese punto. Lo cual puedes hacer usando \prop_gput:Nnxen lugar de \prop_gput:Nnnen \dictappend:

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

información relacionada