Перекрестные ссылки и вычисления с плавающей точкой внутри среды вкладок

Перекрестные ссылки и вычисления с плавающей точкой внутри среды вкладок

Основываясь на этомВ/А

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

введите описание изображения здесь

Связанный контент