newcommand 中的参数,如 newcommand 中名称的一部分

newcommand 中的参数,如 newcommand 中名称的一部分

我想在新命令中使用新命令的一部分

\newcommand{\megakommand}[3]{
\newcommand{#1One}{#2#3}
\newcommand{#1Two}{#3#2}
}

\megakommand{\ciferki}{1}{2}
\ciferkiOne -> 12
\ciferkiTwo -> 21

但会出现如下错误:

此次编译未生成 PDF。如果出现以下情况,可能会发生这种情况:

存在不可恢复的 LaTeX 错误。如果下面或原始日志中显示有 LaTeX 错误,请尝试修复它们并重新编译。

文档环境未包含任何内容。若为空,请添加一些内容并重新编译。

该项目包含一个名为 output.pdf 的文件。如果该文件存在,请重命名并重新编译。

答案1

如果第一个参数\megakommand 需求作为一个控制序列名称...

\documentclass{article}
\makeatletter
\newcommand{\megakommand}[3]{
  \expandafter\def\csname\expandafter\@gobble\string#1One\endcsname{#2#3}
  \expandafter\def\csname\expandafter\@gobble\string#1Two\endcsname{#3#2}
}
\makeatother
\begin{document}

\megakommand{\ciferki}{1}{2}
\ciferkiOne $->$ 12

\ciferkiTwo $->$ 21
\end{document}

在此处输入图片描述

通过使用\def此处而不是\newcommand,这意味着该命令可以覆盖现有命令(而不是抛出错误)。这也意味着参数 2#2#3不能包含段落边界。

答案2

您在这里混合了一些可能的语法,这使其稍微困难一些。下面是一个简化版本,您传递控制序列名称(而不是控制序列本身)并通过\csname...构造新定义的控制序列\endcsname

在此处输入图片描述

\documentclass{article}


\newcommand{\megakommand}[3]{%
  \expandafter\newcommand\csname #1One\endcsname{#2#3}%
  \expandafter\newcommand\csname #1Two\endcsname{#3#2}%
}

\begin{document}

\megakommand{ciferki}{1}{2}

\verb|\ciferkiOne|: \ciferkiOne

\verb|\ciferkiTwo|: \ciferkiTwo

\end{document}

相关内容