![动态长度名称](https://linux22.com/image/394764/%E5%8A%A8%E6%80%81%E9%95%BF%E5%BA%A6%E5%90%8D%E7%A7%B0.png)
我想创建类似对象的东西,保存它在 latex 中的自身位置。因为我不知道如何在 latex 中创建对象,所以我想为每个对象创建一个带有分隔名称的长度。就像这样:(别担心\umlPositionX
,\umlPositionY
之前已经定义过了)
\newcommand{\umlClass}[1]{
\newlength{\umlPositionX#1}
\setlength{\umlPositionX#1}{\umlPositionX}
\newlength{\umlPositionY#1}
\setlength{\umlPositionY#1}{\umlPositionY}
}
现在我想获得这样的物体的位置:
\newcommand{\umlXPositionOf}[1]{\setlength{\umlPositionX}{\umlPositionX#1}
\newcommand{\umlYPositionOf}[1]{\setlength{\umlPositionY}{\umlPositionY#1}
但是,创建具有这种动态名称的长度是不可能的。我总是得到错误:
命令 \umlPositionX 已定义。
我认为这是因为#1不属于长度的名称。
答案1
要以您想要的方式将宏修补在一起,可以使用\csname ...\endcsname
。
\documentclass[12pt]{article}
\newlength{\umlPositionX}
\newlength{\umlPositionY}
\setlength{\umlPositionX}{1pt}
\setlength{\umlPositionY}{2pt}
\newcommand{\umlClass}[1]{%
\edef\temp{\noexpand\newlength{\csname umlPositionX#1\endcsname}%
\noexpand\setlength{\csname umlPositionX#1\endcsname}{\umlPositionX}%
\noexpand\newlength{\csname umlPositionY#1\endcsname}%
\noexpand\setlength{\csname umlPositionY#1\endcsname}{\umlPositionY}}%
\temp%
}
\begin{document}
\umlClass{A}\the\umlPositionXA \the\umlPositionYA
\end{document}