Почему мой expl3 \prop_item увеличивает мой \stepcounter?

Почему мой expl3 \prop_item увеличивает мой \stepcounter?

Что я пытаюсь сделать

Я хочу создать пользовательский тег перекрестной ссылки, на который читатель может нажать и просмотреть строку текста, на которую я ссылаюсь. Однако я хочу, чтобы нумерация тегов была автоматизирована, чтобы я мог добавлять и вычитать элементы из своего текста, не перенумеровывая что-либо вручную.

Чтобы добиться этого, я сейчас собираю , expl3 \prop_который ведет себя подобно Python dictили C-подобным, mapкоторые довольно распространены. Я устанавливаю и вызываю свои пользовательские теги внутри команд и выдаю тест. НО, похоже, что он \prop_itemувеличивает мой счетчик таким образом, которого я не ожидаю.

МВЭ

\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}

введите описание изображения здесь

Делаем входные переменные неизменяемыми

Кажется, мои \dictappend{#1}{A*\thearticle***}отформатированные строки не передают неизменяемые значения, \theкак я ожидал. Разве это не так работает?

Чего я не хочу или что не работает

  • Я пробовал использовать детали изэта почта, но ни одна конфигурация не помогла, что я пробовал. Это странно, потому что ответ @egreg, кажется, должен работать, когда я применяю его к \dictappend{#1}{\edef\newstring{AJ\thearticlejournal}}, но это просто заставляет мою строку исчезнуть.
  • Создание определения метки с 2 аргументами, напримерэтот вопросздесь не приемлемо. Я хочу иметь возможность вставлять новую запись в большой список без ручной перенумерации. Мой вариант использования требует самоссылки.
  • Поскольку у меня есть несколько счетчиков, на которые я хочу ссылаться \myref, использование \theдля доступа к количеству не дает нужного мне эффекта.как указано здесь. Используя его \theв одиночку, лучшее, что я мог сделать, — это ввести только значение счетчика.
  • Аналогично, работая с \refstepcounterпохожимиэтот примервозвращает только значение вместо текста.

Спросите

Почему мои переменные увеличиваются во время этой операции? Как это исправить, чтобы они не менялись после определения каждой записи словаря?

решение1

Когда вы сохраняете значение счетчика в списке свойств с помощью:

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

Затем используйте \dictappendкак \countAJ:

\dictappend{#1}{AJ\thearticlejournal}

Вы сохраняете AJ\thearticlejournalданные «без манипуляций», учитывая nподпись в \prop_gput:Nnn.

При использовании этого значения в \CGetthen AJ\thearticlejournalпроисходит его расширение, другими словами, вы получаете текущее значение для \thearticlejournalв месте, которое вы вызвали \CGet\myref).

Если вы хотите, чтобы это значение было тем, которое было в точке, в которой вы его сохранили, то вам нужно развернуть его в этой точке. Что вы можете сделать, используя \prop_gput:Nnxвместо \prop_gput:Nnnin \dictappend:

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

Связанный контент