모든 비용을 요약하고 문서의 다른 위치에 결과를 표시합니다.

모든 비용을 요약하고 문서의 다른 위치에 결과를 표시합니다.

다양한 비용에 대한 비용이 여러 위치에 나열되어 있는 대규모 문서가 있다고 가정해 보겠습니다. 이러한 비용이 나열되는 모든 지점에서 비용 자체뿐 아니라 아직 사용할 수 있는 예산에 대한 개요도 보고 싶습니다. 문서 뒤에 나타나는 비용을 포함하여 문서에 표시된 모든 비용을 고려합니다.

MWE

\documentclass{article}
\usepackage{hyperref}

\makeatletter
\newcommand\mylabel[2]{\def\@currentlabel{#2}\phantomsection\label{mylabel:#1}}
\newcommand\myref[1]{\ref{mylabel:#1}}
\makeatother

\newcounter{FixMoney}
\setcounter{FixMoney}{1000}
\newcounter{SaveValue}
\setcounter{SaveValue}{\value{FixMoney}}

\makeatletter
\newcommand{\calcCosts}[1]{%
\bgroup
\newcount\PP
\PP=#1 %Piece Price
\setcounter{SaveValue}{\inteval{\value{SaveValue}-\the\PP}}%
\mylabel{overall}{\the\value{SaveValue}}Piece price:\,\the\PP\,€ / Money left overall \myref{overall}\,€)
\egroup}
\makeatother
\makeatletter

\begin{document}
\calcCosts{3}\\
\calcCosts{30}\\
\calcCosts{400}
\end{document}

산출 산출

결과는 정확히 내가 기대하는 것과 내가 달성할 것입니다. 왼쪽에는 비용이 있고 오른쪽에는 남은 예산이 있습니다.

하지만

다음과 같은 경고가 표시됩니다!

`mylabel:overall' 라벨이 다중 정의되었습니다.

\label이제 이러한 목적으로 사용하는 접근 방식이 실제로 올바른지, 아니면 동일한 기능을 다른 방식으로 달성할 수 있는지에 대한 의문이 생깁니다 .

답변1

아마도 선택적 인수를 통해 하이퍼링크에 대한 앵커를 배치할 위치를 지정할 수 있고 상호 참조 레이블이 원하는 대로 작동하는 메커니즘일 것입니다.

\euro(유럽 위원회의 유로 기호( eurosym을 로드한 후)가 아니라 European Computer Modern Fonts의 유로 기호를 원하는 것 같습니다 .)

\documentclass{article}

% \euro - euro-symbol which complies to the symbol suggested and
% and copyrighted(!) by the European Commission -
% <https://european-union.europa.eu/institutions-law-budget/euro/design_en> :
\usepackage{eurosym}  

% In correspondence
% <https://chat.stackexchange.com/transcript/message/63127536#63127536>
% David Carlisle revealed:
% Euro-symbol of European Computer Modern Fonts (ec - Computer
% modern fonts in T1 and TS1 encodings <https://www.ctan.org/tex-archive/fonts/ec>);
% in other words: Joerg Knappen's guess of what the euro symbol would be:
\newcommand\CMReuro{{%
  \fontfamily{cmr}\fontencoding{TS1}\selectfont
  \symbol{191}%
  %\texteuro
}}

\usepackage{hyperref}

\makeatletter
\ExplSyntaxOn\@ifundefined{inteval}{\cs_new_eq:NN \inteval \int_eval:n}{}\ExplSyntaxOff
%--Basic Infrastructure----------------------------------------------------
\newcommand\InitializeNewKindOfBudget[2]{%
  \@bsphack
  \expandafter\@ifdefinable\expandafter{\csname(BudgetNameSpace)#1\endcsname}{%
    \expandafter\protected@xdef\csname(BudgetNameSpace)#1\endcsname{\inteval{(#2)}}%
  }%
  \@esphack
}%
\newcommand\ReduceBudget[2]{%
  \@bsphack
  \expandafter\protected@xdef\csname(BudgetNameSpace)#1\endcsname{%
    \inteval{(\csname(BudgetNameSpace)#1\endcsname)-(#2)}%
  }%
  \@esphack
}%
\newcommand\CurrentBudget[1]{\csname(BudgetNameSpace)#1\endcsname}%
\newcommand\Budgetlabel[2]{%
  \@bsphack\begingroup
  \Hy@localanchornametrue
  \phantomsection
  \protected@edef\@currentlabel{\csname(BudgetNameSpace)#1\endcsname}%
  \label{#2}%
  \endgroup\@esphack
}
%--Infrastructure for your scenario----------------------------------------
\InitializeNewKindOfBudget{MoneyForPieces}{1000}%
\NewDocumentCommand{\calcCosts}{om}{%
  % #1 label to create; #2 amount of money to withdraw from MoneyForPieces.
  \ReduceBudget{MoneyForPieces}{#2}%
  \IfNoValueF{#1}{\Budgetlabel{MoneyForPieces}{#1}}%
  Piece price:\,#2\,\CMReuro\ / Money left currently \CurrentBudget{MoneyForPieces}\,\CMReuro\ / Money left overall \ref*{overall}\,\CMReuro)
}%
\makeatother

\begin{document}
\noindent Budget total: \CurrentBudget{MoneyForPieces}\\
\calcCosts{3}\\
\calcCosts{30}\\
\calcCosts[overall]{400}

% Be aware that the outcome both of the command \texteuro and the unicode-
% character € is engine-dependent and differs depending on whether using
% latex, pdflatex, xelatex or  lualatex and and may probably also vary
% between different LaTeX-releases.

\LARGE
\noindent
\verb|\euro|: \euro / \verb|\texteuro|: \texteuro / \verb|\CMReuro|: \CMReuro / \verb|€|: €

\end{document}

TeX Live 2020에서 LuaLaTeX로 컴파일할 때 얻는 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요



정수뿐만 아니라 부동소수점 숫자로도 계산하려는 경우, 다음은 매우 기본적인 장부를 위한 매우 기본적인 루틴입니다.

\documentclass{article}
\usepackage{zref}
\usepackage{siunitx}
\usepackage{hyperref}

% \euro - euro sign which complies to the symbol suggested and
% and copyrighted(!) by the European Commission -
% <https://european-union.europa.eu/institutions-law-budget/euro/design_en> :
\usepackage{eurosym}  

% Euro sign of European Computer Modern Fonts (ec - Computer
% modern fonts in T1 and TS1 encodings <https://www.ctan.org/tex-archive/fonts/ec>);
% in other words: Joerg Knappen's guess of what the euro sign would be:
\newcommand\CMReuro{{%
  \fontfamily{cmr}\fontencoding{TS1}\selectfont
  \symbol{191}%
  %\texteuro
}}

\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
%
%--Generic infrastructure--------------------------------------------------
%
\cs_new_protected_nopar:Npn \InitializeNewPostingAccount #1#2{
  \@bsphack
  \zref@newprop{PostingAccount#1}{0}
  \exp_args:Nnf
  \zref@setcurrentglobal{PostingAccount#1}{\fp_to_decimal:n{(#2)}}
  \@esphack
}%
\cs_new_protected_nopar:Npn \WithdrawFromPostingaccount #1#2 {
  \@bsphack
  \exp_args:Nnf
  \zref@setcurrentglobal{PostingAccount#1}{
    \fp_to_decimal:n{(\zref@getcurrent{PostingAccount#1})-(#2)}
  }
  \@esphack
}%
\cs_new_protected_nopar:Npn \SaldoOfPostingAccount #1 {
  \fp_to_decimal:n {(\zref@getcurrent{PostingAccount#1})}
}
\cs_new_protected_nopar:Npn \RecordSaldoOfPostingAccountToLabel #1#2 {
  \zref@labelbyprops{#2}{PostingAccount#1}
}
\cs_new_protected_nopar:Npn \ReferToRecordedSaldoOfPostingAccount #1#2#3 {
  \zref@ifrefundefined{#2}
    {\use_ii:nn}
    {\zref@ifrefcontainsprop{#2}{PostingAccount#1}{\use_i:nn}{\use_ii:nn}}
  {\PrintAmountOfMoney{\zref@extractdefault{#2}{PostingAccount#1}{0}}{#3}}
  {\zref@refused{#2}\textsf{??}}
}
\cs_new_protected_nopar:Npn \PrintAmountOfMoney #1#2 {
  \exp_args:Nne
  \use:n {\SI [{% Adjust this according to your needs and the
                % conventions in your country - refer to the
                % documentation of siunitx:
                 add-decimal-zero,
                 add-integer-zero,
                 detect-mode=true,
                 round-integer-to-decimal=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)}}{\CMReuro}
}
%
%--Infrastructure for your scenario----------------------------------------
%
\InitializeNewPostingAccount{MoneyForPieces}{1000.24}%

\cs_new_protected_nopar:Npn \WithdrawFromMoneyForPieces #1 {
  \WithdrawFromPostingaccount{MoneyForPieces}{#1}
  Piece~price:\nobreakspace
  \PrintAmountOfMoney{#1}{2}\nobreakspace/~
  Money~left~currently~\PrintAmountOfMoney{\SaldoOfPostingAccount{MoneyForPieces}}{2}\nobreakspace/~
  Money~left~overall~\ReferToRecordedSaldoOfPostingAccount{MoneyForPieces}{overall}{2})
}
\cs_new_protected_nopar:Npn\RecordFinalMoneyForPiecesSaldoToLabel {
  \RecordSaldoOfPostingAccountToLabel{MoneyForPieces}{overall}
}
\ExplSyntaxOff
\makeatother

\begin{document}

\noindent
\begin{minipage}{1.1\textwidth}
\noindent Budget total: \PrintAmountOfMoney{\SaldoOfPostingAccount{MoneyForPieces}}{2}\\
\WithdrawFromMoneyForPieces{3.24}\\
\WithdrawFromMoneyForPieces{30}\\
\WithdrawFromMoneyForPieces{400}%
\RecordFinalMoneyForPiecesSaldoToLabel
\end{minipage}

% Be aware that the outcome both of the command \texteuro and the unicode-
% character € is engine-dependent and differs depending on whether using
% latex, pdflatex, xelatex or  lualatex and and may probably also vary
% between different LaTeX-releases.

\LARGE

\bigskip

\noindent
Some different euro sign-notations yielding different symbols:

\noindent
\verb|\euro|: \euro/ \verb|\texteuro|: \texteuro/ \verb|\CMReuro|: \CMReuro/ \verb|€|: €

\end{document}

TeX Live 2020에서 pdfLaTeX로 컴파일할 때 얻는 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요

답변2

문서 끝 부분에 전체 값을 한 번만 저장하십시오. 나는 링크를 생성하지 않을 것입니다. 전체 가치와 관련된 위치가 없기 때문에 의미가 없습니다. 명령 내에서 새 카운터를 할당하지 마십시오. 카운터는 항상 전역적으로 할당되어야 합니다.

\documentclass{article}
\usepackage{hyperref}

\newcounter{FixMoney}
\setcounter{FixMoney}{1000}
\newcounter{SaveValue}
\setcounter{SaveValue}{\value{FixMoney}}

\newcommand{\calcCosts}[1]{%
\setcounter{SaveValue}{\inteval{\value{SaveValue}-#1}}%
Piece price:\,#1\,€ / (Money left overall \ref*{mylabel:overall}\,€)}

\makeatletter
\AddToHook{shipout/lastpage}{{\def\@currentlabel{\the\value{SaveValue}}\label{mylabel:overall}}}
\makeatother
\begin{document}
\calcCosts{3}\\
\calcCosts{30}\\
\calcCosts{400}
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보