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