私がやろうとしていること
読者がクリックして参照しているテキストの行を表示できるカスタム相互参照タグを作成したいと考えています。ただし、手動で番号を付け直さなくてもテキストに項目を追加したり削除したりできるように、タグの番号付けを自動化したいと考えています。
これを実現するために、私は現在、非常に一般的な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}
}