Como posso evitar que uma chave atribuída com variável temporária seja alterada posteriormente?

Como posso evitar que uma chave atribuída com variável temporária seja alterada posteriormente?

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, \tmpmas sim o valor \tmpse 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}

insira a descrição da imagem aqui

informação relacionada