我正在寻找以下问题的解决方案:
\def\m#1{{
\dimen0=200pt
\#1=\the#1 % Outputs 200pt rather than 100pt
}}
\dimen0=100pt
\m{\dimen0}
编辑:
上面的代码示例说明,如果宏恰好在内部使用同一个寄存器,则将寄存器作为参数传递给宏可能会导致令人惊讶的结果。所以我想知道是否有办法传递寄存器的值而不是寄存器本身。
答案1
你可以将寄存器的扩展值放入宏中\m
。无论是否使用 eTeX,因为我们不需要使用\dimexpr
。
\def\m#1{{
\dimen0=200pt
\#1=#1 % Outputs 200pt rather than 100pt
}}
\dimen0=100pt
\expandafter\m\expandafter{\the\dimen0}
答案2
如果您使用 e-TeX,则可以避免使用寄存器,利用\dimexpr
本质上是一个无名维度寄存器的事实:
\def\m#1{\expandafter\minner\expandafter{\the\dimexpr#1\relax}}
\def\minner#1{{\dimen0=200pt \#1=#1}}
输入\dimen0=100pt \m{\dimen0}
将产生
#1=100.0pt
如果没有 e-TeX 和\dimexpr
,解决方法是保留一个寄存器用于此特定目的:
\newdimen\mypersonalandprivateregister
\def\m#1{\mypersonalandprivateregister=#1\relax
{{\dimen0=200pt \#1=\the\mypersonalandprivateregister}}%
}
当然,的主体\m
不能包含对的任何其他分配\mypersonalandprivateregister
。