我想要一个宏,在其中可以插入一个键作为参数并获取我之前定义的值。这应该类似于创建变量数组但使用字符串/文本而不是数字。
用法应该是这样的:
\setprefix{foaf}{http://xmlns.com/foaf/0.1/}
然后
\getprefix{foaf}
它应该返回http://xmlns.com/foaf/0.1/
。当我尝试使用前面提到的问题中的代码时,我得到了! Illegal parameter number in definition of
。
答案1
\def\setprefix#1#2{\expandafter\def\csname MY@#1\endcsname{#2}}
\def\getprefix#1{\csname MY@#1\endcsname}
应该就是您所需要的。MY@
内部前缀是任意的,只需与其他前缀不同(因此,LT@
除非您想破坏,否则不要使用longtable
)。通过在那里使用不同的字符串,您可以拥有不同的宏数组。
答案2
您可以使用\csname...\endcsname
:
\documentclass{article}
\makeatletter
\newcommand\setprefix[2]{\global\@namedef{gecko@\detokenize{#1}}{#2}}
\newcommand{\getprefix}[1]{%
\@ifundefined{gecko@\detokenize{#1}}
{\@latex@warning{No prefix `\detokenize{#1}' defined}UNKNOWN}%
{\@nameuse{gecko@\detokenize{#1}}}%
}
\makeatother
\setprefix{foaf}{http://xmlns.com/foaf/0.1/}
\setprefix{\just#stupid@input}{http://xmlns.com/foaf/0.1/}
\begin{document}
\getprefix{foaf}
\getprefix{fuaf}
\getprefix{\just#stupid@input}
\end{document}
在第一个参数中,\setprefix
您基本上只能使用平衡括号。
答案3
\documentclass{article}
\newcommand\setprefix[2]{\expandafter\def\csname#1\endcsname{#2}}
\newcommand\getprefix[1]{\csname#1\endcsname}
\begin{document}
\setprefix{foaf}{http://xmlns.com/foaf/0.1/}
\getprefix{foaf}
\end{document}
\key
还要注意,您可以在示例中使用 来调用前缀\foaf
(只要键是字母即可)。
回滚到原始答案,删除警告。