跳到正文

用 \newcommand 定义自己的命令

在导言区写 \newcommand{\name}{replacement},用 [n] 指定参数 #1 到 #n;此后 \name 在文本和数学公式中都会被替换为它的定义。

不带参数的命令

命令可以减少输入,并让记号保持一致。在导言区定义一次,就能在任何地方使用。

集合和产品名称的简写

\documentclass{article}
\usepackage{amssymb}
\newcommand{\R}{\mathbb{R}}
\newcommand{\product}{Scissor LaTeX}
\begin{document}
Every $x \in \R$ has a square $x^2 \ge 0$.
This page was typeset by \product.
\end{document}
由 Scissor LaTeX 排版: 集合和产品名称的简写

参数和默认值

名称后面的 [n] 表示命令接受几个参数;在定义中它们写作 #1、#2 等。第二个方括号为第一个参数指定默认值,使其成为可选参数。

参数和可选的第一个参数

\documentclass{article}
\newcommand{\vect}[1]{\mathbf{#1}}
\newcommand{\norm}[1]{\left\lVert #1 \right\rVert}
\newcommand{\greet}[2][Hello]{#1, #2!}
\begin{document}
The length of $\vect{v}$ is $\norm{\vect{v}}$.
\greet{Erika} \greet[Good morning]{John}
\end{document}

修改已有的命令

\renewcommand 替换一个已经存在的命令,\providecommand 只在命令尚不存在时才定义它。在 TeX 安装中,对已被占用的名称使用 \newcommand 会报错;这时请使用 \renewcommand。

\renewcommand 和 \providecommand

\documentclass{article}
\renewcommand{\emph}[1]{\textbf{#1}}
\providecommand{\R}{\mathbb{R}}
\begin{document}
This is \emph{emphasised} in bold now, and $\R$ is defined.
\end{document}

运算符名称

sin 和 log 等函数名以直立体排版,并带有正确的间距。\DeclareMathOperator(amsmath)可以定义你自己的运算符;带星号的形式像 \max 一样,在独立公式中把上下限放在下方。

\DeclareMathOperator 及其带星号的形式

\documentclass{article}
\usepackage{amsmath}
\DeclareMathOperator{\Var}{Var}
\DeclareMathOperator*{\argmax}{arg\,max}
\begin{document}
\[
  \Var(X) = \mathbb{E}\left[(X - \mu)^2\right],
  \qquad
  \hat{\theta} = \argmax_{\theta} L(\theta)
\]
\end{document}

自定义环境

\newenvironment{name}[n]{before}{after} 定义一个环境:“before”代码在 \begin{name} 处运行,“after”代码在 \end{name} 处运行。参数可以在“before”部分中使用。

带参数的环境

\documentclass{article}
\newenvironment{task}[1]
  {\par\noindent\textbf{Task #1.}\ }
  {\par}
\begin{document}
\begin{task}{44}
Measure the rainfall every morning.
\end{task}
\end{document}

可用的写法

命令在 Scissor LaTeX 中说明
\newcommand, \renewcommand, \providecommand可用最多 9 个参数,第一个参数可以是带默认值的可选参数。带星号的形式也可用。
\DeclareRobustCommand可用与 \newcommand 相同。
\newenvironment, \renewenvironment可用支持参数和默认值。
\DeclareMathOperator, \DeclareMathOperator*可用
\def\name{...}, \gdef, \edef, \xdef部分可用简单的定义和 #1 形式的参数可用;\def\pt(#1,#2){...} 这类带分隔符的参数无法匹配,会产生错乱的输出。
\let\new\old可用
\NewDocumentCommand, \RenewDocumentCommand (xparse)不支持定义会被丢弃,在使用该命令的地方会报告为未知命令。
\DeclarePairedDelimiter (mathtools)可用
\makeatletter, \makeatother接受名称中带 @ 的命令不会运行。

定义会在排版之前展开,所以命令可以用在文本、数学公式、图表标题和章节标题中。为防止死循环,展开达到安全上限时会停止,并在“问题”标签页中给出提示。

xparse 命令

xparse 的 \NewDocumentCommand 不会被读取。定义会被丢弃,在使用该命令的地方,它的名称会被跳过并给出提示,而参数留在文本中。

不支持 \NewDocumentCommand

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\pair}{m m}{(#1, #2)}
\begin{document}
The pair \pair{a}{b} loses its parentheses and comma.
\end{document}

“问题”标签页: Skipped 1 unknown command: \pair

要解决这个问题,请用 \newcommand{\pair}[2]{(#1, #2)} 写出同样的命令。对于可选参数,带默认值的 \newcommand 可以满足常见需求。

与 TeX 安装的不同之处

xparse 和 mathtools 的手册在 CTAN 上:xparse、mathtools。关于运算符和函数名,另请参见求和、积分和函数名。

常见问题

如何在 LaTeX 中定义新命令?

在导言区写 \newcommand{\name}{text}。若要两个参数,在名称后面加上 [2],并在文本中使用 #1 和 #2。

\newcommand 和 \def 有什么区别?

\newcommand 会检查名称是否可用,并支持一个可选参数。\def 是底层的 TeX 命令;它会不加询问地覆盖已有定义。请优先使用 \newcommand 和 \renewcommand。

\NewDocumentCommand 在 Scissor LaTeX 中可用吗?

不可用。请用 \newcommand 改写这类命令,它支持必选参数和一个可选参数。

本页的每个示例都在构建网站时由 Scissor LaTeX 排版。 最后更新:2026-11-07