编辑:这个答案指出一个好的解决方案。
我想在数学计算中使用参考标签,并且我认为如果我使用该calc
包,它会相当简单。
\documentclass{article}
\usepackage{calc}
\usepackage{lineno}
\begin{document}
\linenumbers
First line
Second line\label{ls}
As found in \arabic{\ref{ls}-1}
\end{document}
我们发现,这并不起作用。
(我的实际计算会比这更复杂。这是一个简化版本。)
答案1
\documentclass{article}
\usepackage{lineno,refcount}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \calc \fp_eval:n
\ExplSyntaxOff
\begin{document}
\linenumbers
First line
Second line\linelabel{ls}
As found in \calc{\getrefnumber{ls}-1}
\end{document}
\getrefnumber
0
扩展其参数(如果引用尚未确定,则默认为),使其在计算中很有用。
虽然上面的例子使用lineno
(因此,针对某些参考标记的特定包\linelabel
,上述用法也应该适用于标准系统。\label
)\ref
答案2
在简单的情况下,您可以做类似的事情。显然,我不知道您的更复杂用法需要什么。这只是使用 LaTeX 计数器。
我已经将引用改为使用枚举,因为\ref{ls}
没有返回数字,所以显然无法使用。
\documentclass{article}
\begin{document}
\begin{enumerate}
\item First line
\item Second line\label{ls}
\end{enumerate}
\newcounter{mycounter}
\setcounter{mycounter}{\ref{ls}}
\addtocounter{mycounter}{-1}
As found in \arabic{mycounter}
\end{document}
答案3
还有另一种解决方案:
编辑:该代码的第一个版本包含一个愚蠢的错误,当引用生成的数字包含多位数字时,该错误导致代码无法工作;我现在已更正了这个问题。
\documentclass{article}
\makeatletter
\@ifdefinable\striphbox{\def\striphbox#1\hbox#2% #1 is the number, #2 is {}
{{#1}}
}
\newcommand*\calcref[2]{%
\ifcsname r@#1\endcsname
\begingroup
\edef\cs{\ref{#1}}%
\def\next##1{\numexpr #2\relax}%
\number\expandafter\expandafter\expandafter\next\expandafter\striphbox\cs
\endgroup
\fi
}
\makeatother
\begin{document}
\begin{enumerate}
\item First line
\setcounter{enumi}{10}
\item Second line\label{ls}
\end{enumerate}
As found in~\calcref{ls}{#1-1} and in~\calcref{ls}{7*#1+5}\ldots
\end{document}
在第一个参数中\calcref
传递符号标签,在第二个参数中传递数字表达式,其中#1
标记应包含引用数字的位置。