相互参照とそれに対応する計算が環境内で適切に機能しないという問題があります\tabbing
。計算自体は機能しているように見えますが、相互参照はおそらく '\tabbing` 環境内にカプセル化されています。
ところで、Minipage 環境でも同じ動作が見られるため、これは体系的な問題だと思います。
ムウェ
\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}
ご覧のとおり、金額はタブ環境内で一時的に差し引かれますが、「全体」の計算では考慮されません。
答え1
リンク先のコードあ 私が書きました。
これを書いているときに、zref パッケージでは新しいプロパティ ( \zref@newprop
) を導入するための割り当てはグローバルに実行される (現在のスコープに制限されない) のに対し、プロパティの値を設定するための割り当て ( \zref@setcurrent
) は常に現在のスコープに制限され、このスコープは何らかの環境によって形成されるローカル スコープになることもあることを見落としていました。以下のコードでは、\zref@setcurrent
割り当てがグローバルに実行されるバリエーションを追加しました。
\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}