Referencias cruzadas y cálculo de punto flotante dentro de un entorno de tabulación

Referencias cruzadas y cálculo de punto flotante dentro de un entorno de tabulación

Basado en estoq/A

Tengo el problema de que mis referencias cruzadas y los cálculos correspondientes no parecen funcionar correctamente dentro de un \tabbingentorno. El cálculo en sí parece funcionar, pero la referencia cruzada probablemente esté encapsulada dentro del entorno '\tabbing`.

Por cierto: un entorno de minipágina muestra el mismo comportamiento, por lo que creo que se trata de un 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}

RESULTADO Resultado

Como puede ver, el importe se deduce temporalmente dentro del entorno de pestañas, pero no se tiene en cuenta en el cálculo "general".

Respuesta1

El código al que se hace referencia en el enlaceA fue escrito por mí.

Al escribirlo, pasé por alto que con el paquete zref las asignaciones para introducir nuevas propiedades ( \zref@newprop) se realizan globalmente (no restringidas al alcance actual), mientras que las asignaciones para establecer valores de propiedades ( \zref@setcurrent) siempre están restringidas al alcance actual, que también puede ser un ámbito local formado por algún entorno. En el código siguiente agregué una variante de \zref@setcurrentdónde se realizan las asignaciones 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}

ingrese la descripción de la imagen aquí

información relacionada