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 dict
ou ao tipo C, map
que são bastante comuns. Eu defino e chamo minhas tags personalizadas dentro de comandos e faço um teste. MAS, parece que \prop_item
incremento 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}
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\the
para acessar a contagem não tem o efeito que precisocomo citado aqui. Usando\the
sozinho, o melhor que consegui foi a injeção apenas do valor do contador. - Da mesma forma, trabalhando com
\refstepcounter
semelhantes 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 \dictappend
como \countAJ
:
\dictappend{#1}{AJ\thearticlejournal}
Você está armazenando AJ\thearticlejournal
com "sem manipulação", dada a n
assinatura em \prop_gput:Nnn
.
Quando você usa esse valor em \CGet
então AJ\thearticlejournal
é expandido, ou seja, você obtém o valor atual para \thearticlejournal
no 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:Nnx
em vez de \prop_gput:Nnn
in \dictappend
:
\NewDocumentCommand{\dictappend}{mm}{%
\prop_gput:Nnx\g_prop_dict{#1}{#2}
}