通用的新命令

通用的新命令

我设置了这个新命令:

\newcommand{\dd}{{\rm d}}

我想以通用方式设置相同的命令。如下所示:

\newcommand{\##}{{\rm #}}

怎么做?

编辑:我设置的新命令(\newcommand{\dd}{{\rm d}})只对字母有效,d对吗?

我想写相同的新命令,但现在可以使用任何字母。

答案1

使用 时\newcommand,您可以为该命令指定“参数”的数量。这些参数就是您为该命令指定的“事物”。

例如,一个命令没有参数是你展示的:

\newcommand{\dd}{{\rm d}}

带有命令参数可以定义为:

%                ↓ number of arguments
\newcommand{\dd}[1]{{\rmfamily #1}}
%                              ↑↑ The first argument

因此当您使用它时,它将#1被第一个参数替换。因此当您输入以下内容时:

\dd{hello}

\dd替换为:

{\rmfamily hello}

对于具有更多参数的命令也是如此。例如:

%                ↓ number of arguments
\newcommand{\dd}[2]{{#1 #2}}
%                       ↑↑ The second argument
%                    ↑↑ The first argument

因此你可以使用,例如:

\dd{\rmfamily}{hello}

将被替换为

{\rmfamily hello}

可选参数

您可以通过指定默认值来定义可选参数:

%                ↓ number of arguments
%                   ↓-------↓ Default value for the first argument
\newcommand{\dd}[2][\rmfamily]{{#1 #2}}
%                                  ↑↑ The second argument
%                               ↑↑ The first argument

所以当你输入

\dd{hello}

或者

\dd[\rmfamily]{hello}

替换是相同的:

{\rmfamily hello}

但是如果你输入

\dd[\bfseries]{hello}

你会得到你好

PS:不要使用\rm,它已被弃用。\rmfamily请使用。

答案2

您不能设置一个名称未知的宏,以便 TeX 解释宏名称,如果有两个相同的字母,则使用{\rmfamily <letter>},如果这是您的意思。(实际上这可能是可行的,因为您可以使用 TeX 做几乎任何事情,但对我来说似乎不是一个好主意。)

但是,您可以做的是编写一个包装器来\newcommand简化这些宏的定义:

\documentclass[]{article}

\newcommand*\rmify[1]
  {%
    \expandafter\newcommand\csname #1#1\endcsname{{\rmfamily #1}}%
  }
\rmify{d}
\rmify{r}

\begin{document}
\sffamily
d\dd r\rr
\end{document}

如果用于数学模式,请将\rmify上面示例中的定义更改为:

\newcommand*\rmify[1]
  {%
    \expandafter\newcommand\csname #1#1\endcsname{\mathrm{#1}}
  }

答案3

你似乎要求设置 TeX,以便

\xx只要找到控制序列(x任意字母),就会\mathrm{x}产生。

然而,使用类似于您想要输入的简单指令,这是不可能的。每个控制序列都必须有自己的定义。

然而,利用一些技巧,可以用一个通用模式进行“批量定义”。

\documentclass{article}

\makeatletter
\count@=`\a\loop
\begingroup\lccode`X=\count255
\lowercase{\endgroup
  \@ifundefined{XX}
    {\expandafter\newcommand\csname XX\endcsname{\mathrm{X}}}
    {\typeout{not redefining \@backslashchar XX}}%
}
\ifnum\count@<`\z \advance\count@ by 1 \repeat
\makeatother

\begin{document}

\texttt{\meaning\aa} % not changed

\texttt{\meaning\bb}

\texttt{\meaning\zz}

\end{document}

这将打印

在此处输入图片描述

控制台将显示

not redefining \aa
not redefining \gg
not redefining \ll
not redefining \ss
not redefining \tt

注意:我假设您想\dd在数学模式中使用和类似的命令,但该语法{\rm d}已被弃用二十多年;正确的语法是\mathrm{d}

相关内容