Ich habe das Problem, dass meine Querverweise und die dazugehörigen Berechnungen innerhalb einer \tabbing
Umgebung 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}
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@setcurrent
bei 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}