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 dict
o C, map
que son bastante comunes. Configuro y llamo mis etiquetas personalizadas dentro de los comandos y escupo una prueba. PERO, parece que \prop_item
incrementa 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}
Hacer que las variables de entrada sean inmutables
Parece que mis \dictappend{#1}{A*\thearticle***}
líneas formateadas no pasan valores inmutables \the
como 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\the
solo, 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 \dictappend
como \countAJ
:
\dictappend{#1}{AJ\thearticlejournal}
Estás almacenando AJ\thearticlejournal
"sin manipulación", dada la n
firma en \prop_gput:Nnn
.
Cuando usas este valor en \CGet
then AJ\thearticlejournal
se expande, en otras palabras, obtienes el valor actual \thearticlejournal
en 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:Nnx
en lugar de \prop_gput:Nnn
en \dictappend
:
\NewDocumentCommand{\dictappend}{mm}{%
\prop_gput:Nnx\g_prop_dict{#1}{#2}
}