Warum erhöht mein expl3 \prop_item meinen \stepcounter?

Warum erhöht mein expl3 \prop_item meinen \stepcounter?

Was ich versuche zu tun

Ich möchte ein benutzerdefiniertes Querverweis-Tag erstellen, auf das ein Leser klicken kann, um die Textzeile anzuzeigen, auf die ich verweise. Ich möchte jedoch, dass die Nummerierung der Tags automatisiert wird, damit ich Elemente zu meinem Text hinzufügen und daraus entfernen kann, ohne etwas manuell neu nummerieren zu müssen.

Um dies zu erreichen, bastele ich gerade ein Programm zusammen, das sich ähnlich wie die weit verbreiteten expl3 \prop_Python- dictoder C-ähnlichen Programme verhält. Ich setze und rufe meine benutzerdefinierten Tags in Befehlen auf und gebe einen Test aus. ABER es scheint, als würde mein Zähler auf eine Weise erhöht, die ich nicht erwarte.map\prop_item

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}

Bildbeschreibung hier eingeben

Eingabevariablen unveränderlich machen

Es scheint, als \dictappend{#1}{A*\thearticle***}würden meine formatierten Zeilen keine unveränderlichen Werte übergeben, \thewie ich es erwarten würde. Funktioniert das nicht so?

Was ich nicht will oder nicht funktioniert

  • Ich habe versucht, Teile vondieser Beitrag, aber keine der Konfigurationen, die ich ausprobiert habe, hat geholfen. Das ist seltsam, denn die Antwort von @egreg scheint zu funktionieren, wenn ich sie auf anwende \dictappend{#1}{\edef\newstring{AJ\thearticlejournal}}, aber dadurch verschwindet einfach mein String.
  • Erstellen einer 2-Argument-Beschriftungsdefinition a ladiese Frageist hier nicht akzeptabel. Ich möchte einen neuen Eintrag in eine große Liste einfügen können, ohne die Dinge manuell neu nummerieren zu müssen. Mein Anwendungsfall erfordert Selbstreferenz.
  • Da ich mehrere Zähler habe, auf die ich verweisen möchte \myref, \thehat die Verwendung von zum Zugriff auf die Anzahl nicht den gewünschten Effekt.wie hier zitiert. Bei \thealleiniger Verwendung konnte ich höchstens nur den Zählerwert eingeben.
  • Ebenso die Arbeit mit \refstepcounterähnlichendieses Beispielgibt nur den Wert statt des Textes zurück.

Die Frage

Warum werden meine Variablen während dieser Operation erhöht? Wie kann ich das beheben, sodass sie sich nach der Definition jedes Dict-Eintrags nicht ändern?

Antwort1

Wenn Sie den Wert Ihres Zählers in der Eigenschaftenliste speichern mit:

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

Dann verwenden Sie \dictappendes \countAJals:

\dictappend{#1}{AJ\thearticlejournal}

Sie speichern AJ\thearticlejournal"ohne Manipulation", vorausgesetzt die nSignatur ist in \prop_gput:Nnn.

Wenn Sie diesen Wert in verwenden, \CGetwird AJ\thearticlejournalerweitert, d.h. Sie erhalten den aktuellen Wert für \thearticlejournalan der aufgerufenen Stelle \CGet(und \myref).

Wenn Sie möchten, dass dieser Wert der Wert an der Stelle ist, an der Sie ihn gespeichert haben, müssen Sie ihn an dieser Stelle erweitern. Dies können Sie tun, indem Sie \prop_gput:Nnxanstelle von \prop_gput:Nnnin verwenden \dictappend:

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

verwandte Informationen