如果我使用其他长度来定义长度,有没有办法稍后更新该长度而无需再次给出定义?
假设我定义几个长度如下
\newlength{\Test}\setlength{\Test}{20pt}
\newlength{\Tist}\setlength{\Tist}{30pt}
\newlength{\Tost}\setlength{\Tost}{\dimexpr \Test + \Tist}
\the\Test\ +
\the\Tist\ =
\the\Tost
这将产生
20.0pt + 30.0pt = 50.0pt
如果我稍后重新定义计算中使用的长度之一,例如,
\setlength{\Test}{40pt}
有没有办法“更新”相关长度而不明确给出计算公式?目前它不会更新:
\the\Test\ +
\the\Tist\ =
\the\Tost
现在会产生
40.0pt + 30.0pt = 50.0pt
答案1
如果定义\Tost
为宏,它将在使用时扩展,因此结果将始终使用\Test
和的当前值\Tist
:
\documentclass{article}
\newlength{\Test}\setlength{\Test}{20pt}
\newlength{\Tist}\setlength{\Tist}{30pt}
\newcommand*{\Tost}{\dimexpr \Test + \Tist\relax}
\begin{document}
\the\Test\ +
\the\Tist\ =
\the\Tost
\setlength{\Test}{40pt}
\the\Test\ +
\the\Tist\ =
\the\Tost
\end{document}
将导致:
答案2
你可以做这样的事情:
\documentclass{article}
\newlength{\Test}\setlength{\Test}{20pt}
\newlength{\Tist}\setlength{\Tist}{30pt}
\newlength{\Tost}\setlength{\Tost}{\dimexpr \Test + \Tist}
\newcommand{\updatelength}[2]{%
\setlength{#1}{#2}%
\setlength{\Tost}{\dimexpr \Test + \Tist}%
}
\begin{document}
\the\Test\ +
\the\Tist\ =
\the\Tost
\updatelength{\Test}{40pt}
\the\Test\ +
\the\Tist\ =
\the\Tost
\end{document}
答案3
我认为你需要一个宏而不是一个长度。setlength
命令运行一次并给出值。宏可以随时调用并再次计算。因此,你可以将计算放在宏中:
\documentclass{article}
\newlength{\Test}\setlength{\Test}{20pt}
\newlength{\Tist}\setlength{\Tist}{30pt}
\newlength{\Tost}
\def\recalc{
\setlength{\Tost}{\dimexpr \Test + \Tist}
}
\begin{document}
\recalc
\the\Test\ +
\the\Tist\ =
\the\Tost
\setlength{\Test}{40pt}
\recalc
\the\Test\ +
\the\Tist\ =
\the\Tost
\end{document}
输出: