Tenho o problema de que minhas referências cruzadas e os cálculos correspondentes não parecem funcionar corretamente em um \tabbing
ambiente. O cálculo em si parece funcionar, mas a referência cruzada provavelmente está encapsulada dentro do ambiente '\tabbing`.
BTW: Um ambiente Minipage mostra o mesmo comportamento, então acho que este é um problema sistemático.
MWE
\documentclass{article}
\usepackage[parfill]{parskip}
\usepackage{zref}
\usepackage{siunitx}
\newcommand{\myHSpace}{25mm}
\makeatletter
\newcommand\mylabel[2]{%
\def\@currentlabel{#2}\phantomsection\label{mylabel:#1}{#2}}
\newcommand\myref[1]{%
\ref{mylabel:#1}}
\makeatother
\makeatletter
\ExplSyntaxOn
\cs_new_protected_nopar:Npn \DefineExemptionOrderBudget #1#2{%
\@bsphack
\exp_args:Nnf
\zref@newprop{ExemptionOrder#1}{\fp_to_decimal:n{(#2)}}
\@esphack
}%
\cs_new_protected_nopar:Npn \WithdrawFromExemptionOrderBudget #1#2 {%
\@bsphack
\exp_args:Nnf
\zref@setcurrent{ExemptionOrder#1}{%
\fp_to_decimal:n{(\zref@getcurrent{ExemptionOrder#1})-(#2)}
}
\@esphack
}%
\cs_new_protected_nopar:Npn \GetCurrentExemptionOrderBudget #1 {%
\fp_to_decimal:n {(\zref@getcurrent{ExemptionOrder#1})}
}
\cs_new_protected_nopar:Npn \SetRemainingExemptionOrderBudgetToLabel #1#2 {%
\zref@labelbyprops{#2}{ExemptionOrder#1}
}
\cs_new_protected_nopar:Npn \ReferToOverallExemptionOrderBudgetLeft #1#2#3 {%
\zref@ifrefundefined{#2}
{\use_ii:nn}
{\zref@ifrefcontainsprop{#2}{ExemptionOrder#1}{\use_i:nn}{\use_ii:nn}}
{ \PrintMoney{\zref@extractdefault{#2}{ExemptionOrder#1}{0}}{#3}}
{\zref@refused{#2}\textsf{??}}
}
\cs_new_protected_nopar:Npn \PrintMoney #1#2 {%
\exp_args:Nne
\use:n {\SI [{ add-decimal-zero,
add-integer-zero,
detect-mode=true,
round-mode=places,
round-half=up,
group-digits=true,
group-minimum-digits=2,
group-separator=\,,
output-decimal-marker={,},
round-precision={#2}}]}
{\fp_to_decimal:n{round(((#1)+0),#2,NaN)}}{€}
}
\DefineExemptionOrderBudget{ExemptionBudget}{1000}
\cs_new_protected_nopar:Npn \WithdrawFromExemptionOrderBudgetForAccount #1 {%
\WithdrawFromExemptionOrderBudget{ExemptionBudget}{#1}
Piece~price:\nobreakspace
\PrintMoney{#1}{2}\nobreakspace/~
Money~left~currently~\PrintMoney{\GetCurrentExemptionOrderBudget{ExemptionBudget}}{2}\nobreakspace/~
Money~left~overall~\ReferToOverallExemptionOrderBudgetLeft{ExemptionBudget}{overall}{2})
}
\cs_new_protected_nopar:Npn\RecordFinalExemptionOrderBudgetToLabel {%
\SetRemainingExemptionOrderBudgetToLabel{ExemptionBudget}{overall}
}
\ExplSyntaxOff
\makeatother
\begin{document}
Complete Budget: \PrintMoney{\GetCurrentExemptionOrderBudget{ExemptionBudget}}{2}\\
\WithdrawFromExemptionOrderBudgetForAccount{20}\\
\begin{tabbing}
\hspace{\myHSpace}\=\kill
Tabbing:\>\WithdrawFromExemptionOrderBudgetForAccount{20}\\
\end{tabbing}
\WithdrawFromExemptionOrderBudgetForAccount{20}\\
\RecordFinalExemptionOrderBudgetToLabel
\end{document}
Como você pode ver, o valor é deduzido temporariamente no ambiente de tabulação, mas não é levado em consideração no cálculo "geral".
Responder1
O código referenciado no linkA foi escrito por mim.
Ao escrevê-lo, esqueci que com o pacote zref as atribuições para introdução de novas propriedades ( \zref@newprop
) são feitas globalmente (não restritas ao escopo atual), enquanto as atribuições para definir valores de propriedades ( \zref@setcurrent
) são sempre restritas ao escopo atual, que também pode ser um escopo local formado por algum ambiente. No código abaixo adicionei uma variante de \zref@setcurrent
onde as atribuições são feitas globalmente.
\documentclass{article}
\usepackage[parfill]{parskip}
\usepackage{zref}
\usepackage{siunitx}
\newcommand{\myHSpace}{25mm}
\makeatletter
\newcommand\mylabel[2]{%
\def\@currentlabel{#2}\phantomsection\label{mylabel:#1}{#2}}
\newcommand\myref[1]{%
\ref{mylabel:#1}}
\makeatother
\makeatletter
% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
% A variant of \zref@setcurrent which sets properties globally
\ZREF@Robust\def\zref@setcurrentglobal#1#2{%
\zref@propexists{#1}{%
\expandafter\gdef\csname Z@C@#1\endcsname{#2}%
}%
}%
% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
\ExplSyntaxOn
\cs_new_protected_nopar:Npn \DefineExemptionOrderBudget #1#2{%
\@bsphack
\exp_args:Nnf
\zref@newprop{ExemptionOrder#1}{\fp_to_decimal:n{(#2)}}
\@esphack
}%
\cs_new_protected_nopar:Npn \WithdrawFromExemptionOrderBudget #1#2 {%
\@bsphack
\exp_args:Nnf
\zref@setcurrentglobal{ExemptionOrder#1}{% <----\zref@setcurrentglobal instead of \zref@setcurrent
\fp_to_decimal:n{(\zref@getcurrent{ExemptionOrder#1})-(#2)}
}
\@esphack
}%
\cs_new_protected_nopar:Npn \GetCurrentExemptionOrderBudget #1 {%
\fp_to_decimal:n {(\zref@getcurrent{ExemptionOrder#1})}
}
\cs_new_protected_nopar:Npn \SetRemainingExemptionOrderBudgetToLabel #1#2 {%
\zref@labelbyprops{#2}{ExemptionOrder#1}
}
\cs_new_protected_nopar:Npn \ReferToOverallExemptionOrderBudgetLeft #1#2#3 {%
\zref@ifrefundefined{#2}
{\use_ii:nn}
{\zref@ifrefcontainsprop{#2}{ExemptionOrder#1}{\use_i:nn}{\use_ii:nn}}
{\PrintMoney{\zref@extractdefault{#2}{ExemptionOrder#1}{0}}{#3}}
{\zref@refused{#2}\textsf{??}}
}
\cs_new_protected_nopar:Npn \PrintMoney #1#2 {%
\exp_args:Nne
\use:n {\SI [{ add-decimal-zero,
add-integer-zero,
detect-mode=true,
round-mode=places,
round-half=up,
group-digits=true,
group-minimum-digits=2,
group-separator=\,,
output-decimal-marker={,},
round-precision={#2}}]}
{\fp_to_decimal:n{round(((#1)+0),#2,NaN)}}{€}
}
\DefineExemptionOrderBudget{ExemptionBudget}{1000}
\cs_new_protected_nopar:Npn \WithdrawFromExemptionOrderBudgetForAccount #1 {%
\WithdrawFromExemptionOrderBudget{ExemptionBudget}{#1}
Piece~price:\nobreakspace
\PrintMoney{#1}{2}\nobreakspace/~
Money~left~currently~\PrintMoney{\GetCurrentExemptionOrderBudget{ExemptionBudget}}{2}\nobreakspace/~
Money~left~overall~\ReferToOverallExemptionOrderBudgetLeft{ExemptionBudget}{overall}{2})
}
\cs_new_protected_nopar:Npn\RecordFinalExemptionOrderBudgetToLabel {%
\SetRemainingExemptionOrderBudgetToLabel{ExemptionBudget}{overall}
}
\ExplSyntaxOff
\makeatother
\begin{document}
Complete Budget: \PrintMoney{\GetCurrentExemptionOrderBudget{ExemptionBudget}}{2}\\
\WithdrawFromExemptionOrderBudgetForAccount{30}\\
\begin{tabbing}
\hspace{\myHSpace}\=\kill
Tabbing:\>\WithdrawFromExemptionOrderBudgetForAccount{50}\\
\end{tabbing}
\WithdrawFromExemptionOrderBudgetForAccount{20}\\
\RecordFinalExemptionOrderBudgetToLabel
\end{document}