expl3 \prop_item が \stepcounter を増やすのはなぜですか?

expl3 \prop_item が \stepcounter を増やすのはなぜですか?

私がやろうとしていること

読者がクリックして参照しているテキストの行を表示できるカスタム相互参照タグを作成したいと考えています。ただし、手動で番号を付け直さなくてもテキストに項目を追加したり削除したりできるように、タグの番号付けを自動化したいと考えています。

これを実現するために、私は現在、非常に一般的なexpl3 \prop_Pythondictや 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

この値を で使用すると が\CGet展開AJ\thearticlejournalされます。つまり、(および)\thearticlejournalを呼び出した場所での現在の値を取得します。\CGet\myref

この値を保存した時点の値にしたい場合は、その時点で拡張する必要があります。これは、の\prop_gput:Nnx代わりにを使用することで実行できます。\prop_gput:Nnn\dictappend

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

関連情報