У меня проблема в том, что мои перекрестные ссылки и соответствующие вычисления, похоже, не работают должным образом в \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-package назначения для введения новых свойств ( \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}