将寄存器的值作为宏参数传递

将寄存器的值作为宏参数传递

我正在寻找以下问题的解决方案:

\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

相关内容