Querverweise und Gleitkommaberechnungen innerhalb einer Tabulatorumgebung

Querverweise und Gleitkommaberechnungen innerhalb einer Tabulatorumgebung

Basierend aufQ/A

Ich habe das Problem, dass meine Querverweise und die dazugehörigen Berechnungen innerhalb einer \tabbingUmgebung nicht richtig zu funktionieren scheinen. Die Berechnung selbst scheint zu funktionieren, aber der Querverweis ist wahrscheinlich innerhalb der '\tabbing'-Umgebung gekapselt.

Übrigens: Eine Minipage-Umgebung zeigt dasselbe Verhalten, daher denke ich, dass es sich hier um ein systematisches Problem handelt.

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}

ERGEBNIS Ergebnis

Wie Sie sehen, wird der Betrag innerhalb der Tabulatorumgebung vorübergehend abgezogen, jedoch bei der „Gesamt“-Berechnung nicht berücksichtigt.

Antwort1

Der Code, auf den in der verlinktenA wurde von mir geschrieben.

Beim Schreiben habe ich übersehen, dass mit dem zref-Paket Zuweisungen zum Einfügen neuer Eigenschaften ( \zref@newprop) global erfolgen (nicht auf den aktuellen Bereich beschränkt), während Zuweisungen zum Setzen von Eigenschaftenwerten ( \zref@setcurrent) immer auf den aktuellen Bereich beschränkt sind, der auch ein lokaler Bereich sein kann, der von einer Umgebung gebildet wird. Im folgenden Code habe ich eine Variante hinzugefügt, \zref@setcurrentbei der die Zuweisungen global erfolgen.

\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}

Bildbeschreibung hier eingeben

verwandte Informationen