
ここで何かとても基本的なことを見逃しているような気がします。後で取り出せるように、pgfkeys に値を保存しようとしています。しかし、いくつかの計算を利用する必要があり、マクロを再利用すると、保存されている値もすべて変更されます。ここに MWE があります:
\documentclass[varwidth]{standalone}
\usepackage{pgfkeys}
\usepackage{pgfmath}
\begin{document}
--- 1st interation\\
\pgfmathtruncatemacro\tmp{0}
\pgfkeys{/x/.initial=\tmp}
x (pgfkeys): \pgfkeys{/x}\\
x (pgfkeysvalueof): \pgfkeysvalueof{/x}
--- 2nd interation\\
\pgfmathtruncatemacro\tmp{1}
x (pgfkeys): \pgfkeys{/x}\\
x (pgfkeysvalueof): \pgfkeysvalueof{/x}
\end{document}
結果として得られるドキュメントは次のようになります。
— 1st interation
x (pgfkeys): 0
x (pgfkeysvalueof): 0
— 2nd interation
x (pgfkeys): 1
x (pgfkeysvalueof): 1
ご覧のとおり、pgfkey x の値は、触れなくても変更されています。理解できることを楽しみにしています。
- \tmp 変数の後のほうの変更によって、前の割り当ても変更されるのはなぜですか?
- 以前に割り当てられた値を変更しないようにするにはどうすればよいですか?
答え1
このようなことが起こらないようにキーを拡張するのはどうでしょうか? そうすれば、キーにマクロの値を設定するのではなく、キーを設定した時点で\tmp
値が拡張されます。\tmp
\documentclass[varwidth]{standalone}
\usepackage{pgfkeys}
\usepackage{pgfmath}
\begin{document}
--- 1st interation\\
\pgfmathtruncatemacro\tmp{0}
\pgfkeys{/x/.initial/.expanded=\tmp}
x (pgfkeys): \pgfkeys{/x}\\
x (pgfkeysvalueof): \pgfkeysvalueof{/x}
--- 2nd interation\\
\pgfmathtruncatemacro\tmp{1}
x (pgfkeys): \pgfkeys{/x}\\
x (pgfkeysvalueof): \pgfkeysvalueof{/x}
\end{document}