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- dict
oder 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}
Eingabevariablen unveränderlich machen
Es scheint, als \dictappend{#1}{A*\thearticle***}
würden meine formatierten Zeilen keine unveränderlichen Werte übergeben, \the
wie 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
,\the
hat die Verwendung von zum Zugriff auf die Anzahl nicht den gewünschten Effekt.wie hier zitiert. Bei\the
alleiniger 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 \dictappend
es \countAJ
als:
\dictappend{#1}{AJ\thearticlejournal}
Sie speichern AJ\thearticlejournal
"ohne Manipulation", vorausgesetzt die n
Signatur ist in \prop_gput:Nnn
.
Wenn Sie diesen Wert in verwenden, \CGet
wird AJ\thearticlejournal
erweitert, d.h. Sie erhalten den aktuellen Wert für \thearticlejournal
an 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:Nnx
anstelle von \prop_gput:Nnn
in verwenden \dictappend
:
\NewDocumentCommand{\dictappend}{mm}{%
\prop_gput:Nnx\g_prop_dict{#1}{#2}
}