
Я чувствую, что мне не хватает чего-то очень простого. Я пытаюсь сохранить значения в 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}