另一个宏中的参数名称

另一个宏中的参数名称

我想在宏中定义一个宏(为了发布干净的代码我进行了简化),其名称取决于第一个宏的参数名称。这里我使用了包amsthmhyperrefaliascnt,但我认为这对回答来说并不重要。

\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 工具:),因此,不用说,这尚未经过测试。

相关内容