我想在宏中定义一个宏(为了发布干净的代码我进行了简化),其名称取决于第一个宏的参数名称。这里我使用了包amsthm
、hyperref
和aliascnt
,但我认为这对回答来说并不重要。
\providecommand*{\MyFirstautorefname}{MySecond}
我希望它在调用序言时执行代码:\mymacro{Myfist}{MySecond}
。我知道这可能是 Kings 在 LaTeX 中最简单的事情,但我不知道该怎么做……我试过这个代码:
\newcommand{\mymacro}[2]{
\providecommand*{\#1autorefname}{#2}
}
和 一样\csname#1\endcsname
,但是有“autorefname”要连接。
答案1
\newcommand{\mymacro}[2]{%%
\expandafter\providecommand\expandafter
*\csname#1autorefname\endcsname{#2}%%
}
那么如果#1
是的话zzz
\zzzautorefname
就会被定义。
答案2
此外,LaTeX 内核还提供\@namedef
以下功能:
\makeatletter
\newcommand*{\mymacro}[2]{%
\@namedef{#1autorefname}{#2}%
}
\maketatother
事实上,您想要完成的任务非常常见:只需考虑如何定义交叉引用的标签。
警告:与\providecommand
解决方案相反,\@namedef
将默默地覆盖具有相同名称的命令的先前定义;这可以通过以下方式防止
\makeatletter
\newcommand*{\mymacro}[2]{%
\@ifundefined{#1autorefname}{%
\@namedef{#1autorefname}{#2}%
}{%
\typeout{`#1autorefname' is already defined.}%
}
}
\maketatother
或类似的东西。
答案3
expl3
实现此目的的方法可能是:
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \mathfortyfive_maybe_define:Nn #1#2
{ \cs_if_free:NT #1 { \cs_new_nopar:Npn #1 {#2} } }
\cs_generate_variant:Nn \mathfortyfive_maybe_define:Nn { cn }
\NewDocumentCommand \mymacro { mm }
{ \mathfortyfive_maybe_define:cn { #1 autorefname } { #2 } }
\ExplSyntaxOff
但可能存在我不知道的功能;我无法在我的普通计算机上访问我的所有 TeX 工具:)
,因此,不用说,这尚未经过测试。