我想在新命令中使用新命令的一部分
\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}