
Sinto que estou faltando algo muito básico aqui. Estou tentando armazenar valores em pgfkeys para poder recuperá-los mais tarde. Porém, tenho que fazer alguns cálculos e se eu reutilizar macros, todos os valores armazenados também mudam. Aqui você tem um 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}
O documento resultante é o seguinte:
— 1st interation
x (pgfkeys): 0
x (pgfkeysvalueof): 0
— 2nd interation
x (pgfkeys): 1
x (pgfkeysvalueof): 1
Como você pode ver, o valor da pgfkey x mudou mesmo que eu não tocasse nela. Estou ansioso para entender:
- Por que a alteração posterior na var \tmp também altera a atribuição anterior?
- Como posso evitar alterar valores atribuídos anteriormente?
Responder1
Que tal expandir a chave para que isso não aconteça? Dessa forma, você não diz à chave para ter o valor da macro, \tmp
mas sim o valor \tmp
se expande no momento em que você define a chave.
\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}