我对如何使用长度寄存器进行计算有一些了解。但是,我总是需要太多的长度寄存器来完成那些可能用表达式就能更好地解决的任务。如何避免使用这么多寄存器?
为了使事情更精确:我有一个 MWE,它可以完成我想要做的事情:
\documentclass{article}
\usepackage{calc}
\def\cone{CONTENT ONE}
\def\ctwo{CONTENT TWO}
\begin{document}
\newdimen\coneheight
\newdimen\conewidth
\newdimen\ctwoheight
\settoheight{\coneheight}{\cone}
\settowidth{\conewidth}{\cone}
\settoheight{\ctwoheight}{\ctwo}
\newdimen\scaled
\setlength{\scaled}{\dimexpr \numexpr \ctwoheight * \conewidth / \coneheight \relax sp\relax}
Result: \the\scaled
\end{document}
我想到的是这样的:
\usepackage{calc}
\def\cone{CONTENT ONE}
\def\ctwo{CONTENT TWO}
\begin{document}
\newdimen\better
\setlength{\better}{\dimexpr \numexpr \heightof{\ctwo} * \widthof{\cone} / \heightof{\cone} \relax sp\relax}
Better: \the\better
\end{document}
但不幸的是,这段代码以各种可能的方式向我咆哮……我不明白,因为我实际上只是用长度表达式替换了长度寄存器。还是不是?
我做错了什么?我怎样才能得到一种更紧凑的表达风格,避免将所有长度放入寄存器中?
答案1
\documentclass{article}
\usepackage{calc}
\newcommand\cone{CONTENT ONE}
\newcommand\ctwo{CONTENT TWO}
\newlength\scaled
\begin{document}
\setlength{\scaled}{\widthof{\cone}*\ratio{\heightof{\ctwo}}{\heightof{\cone}}}
\the\scaled
\end{document}
输出为
76.66681pt
答案2
使用临时盒子寄存器来捕获所需的尺寸。
在 MWE 中,我展示了 OP 的原始方法“结果”以及使用盒子寄存器的修订“更好”的方法以供比较。
\documentclass{article}
\usepackage{calc}
\def\cone{CONTENT ONE}
\def\ctwo{CONTENT TWO}
\begin{document}
\newdimen\coneheight
\newdimen\conewidth
\newdimen\ctwoheight
\settoheight{\coneheight}{\cone}
\settowidth{\conewidth}{\cone}
\settoheight{\ctwoheight}{\ctwo}
\newdimen\scaled
\setlength{\scaled}{\dimexpr \numexpr \ctwoheight * \conewidth / \coneheight \relax sp\relax}
Result: \the\scaled
\sbox0\cone
\sbox2\ctwo
\newdimen\better
\setlength{\better}{\dimexpr \numexpr \ht2 * \wd0 / \ht0 \relax sp\relax}
Better: \the\better
\end{document}
如果希望避免占用临时盒子寄存器,可以创建新的保存盒子:
\documentclass{article}
\usepackage{calc}
\def\cone{CONTENT ONE}
\def\ctwo{CONTENT TWO}
\begin{document}
\newsavebox\boxone
\newsavebox\boxtwo
\sbox\boxone\cone
\sbox\boxtwo\ctwo
\newdimen\better
\setlength{\better}{\dimexpr \numexpr \ht\boxtwo * \wd\boxone / \ht\boxone \relax sp\relax}
Better: \the\better
\end{document}