latex定义新命令

Latex 可以使用两类命令来定义新命令:

  1. 一类是 Latex(Lamport Tex)命令,包括 \newcommand、\renewcommand 和 \providecommand,
  2. 一类是更基本的 Tex 原始(primitive)命令,包括 \def、\gdef、\edef 和 \xdef

1.\newcommand、\renewcommand 和 \providecommand

定义新命令的格式是:

\newcommand{\〈name〉}[〈num〉]{〈definition〉}

  1. {\<name>}中的<name>是新命令的名字,由大小写字母构成。命令的名字前面要有\,整体还要用{}括起来,
  2. [<num>]是可选项, <num>是 1~9 中的一个整数,表示命令所带参数的个数,省略这一项,就是不带参数。数字必须用方框号[] 括起来。
  3. {〈definition〉} 是新命令的定义。形参用#1#2 …… #9表示。

在使用命令时,参数用大括号{}括起来,有几个参数,就用几个大括号。

具体用法如下所示,类似于C语言中的#define进行关键字的替换。

\documentclass{article}

%定义不带参数的命令
\newcommand{\HL}{Hello World}  

%定义带一个参数的命令
\newcommand{\WhoLove}[1]{#1 Love Latex!} 

%定义两个带参数的命令
\newcommand{\WhoLWhat}[2]{#1 Love #2!}


%定义一个参数的命令,给字体加红色
\newcommand{\addRed}[1]{\textcolor{red}{#1}}

\begin{document}
    \HL

    \WhoLove{I}

    \WhoLWhat{I}{You}

    \addRed{The color of the font is red.}

\end{document}

效果如下:

但是这样定义会有一个问题:

但是好像又有了点新的问题,比如

\documentclass{article}


\newcommand{\HL}{Hello}  


\begin{document}

    \HL world!

\end{document}

编译出来的是:

Hello后面的空格不见了, 原因应该很明显了, 自定义命令后的空格被当成了命令结束的标志从而使得中间的空格丢失。那该怎么解决呢,

xspace宏包解决了这个问题, 调用宏包\usepackage{xspace}, 并将上述定义内容改为

\newcommand{\HL}{Hello\xspace

\documentclass{article}

\usepackage{xspace}

\newcommand{\HL}{Hello\xspace}  


\begin{document}

    \HL world!

\end{document}

 编译的结果如下:

 即命令\xspace可以自动生成一个空格, 除非其后是标点符号。

\renewcommand:如果新定义的命令与已有命令重名,则无法用\newcommand来定义,这时候可以使用 \renewcommand,强行定义新命令。它的定义方法与\newcommand相同。

\providecommand:在命令不存在时,它相当于\newcommand ;在命令已经存在时,仍沿用存在的定义。它的定义方法与\newcommand相同。

2.\def、\gdef、\edef 和 \xdef

定义新命令的格式是:\def\〈name〉<parameter text>{〈definition〉}

  1. \<name>中的<name>是新命令的名字,由大小写字母构成。命令的名字前面要有\。与\newcommand不同,\def不需要要用{}括起来,
  2. <parameter text>是可选项, 它非常复杂多变,因此也非常强大,借助它可以得到一些不同寻常的命令。
  3. {〈definition〉} 是新命令的定义。形参用#1#2 …… #9表示。

举例子如下:

\documentclass{article}

\usepackage{xspace}


 % 定义不带参数的命令
\def\HL{Hello\xspace}

% 定义带一个参数的命令
\def\WhoLoveLatex#1{#1 love latex!}

% 定义带两个参数的命令
\def\WhoLoveWho#1#2{#1 love #2!}

\begin{document}

    \HL world!

    \WhoLoveLatex{I}

    \WhoLoveWho{I}{You}


\end{document}

编译结果如下:

\gdef:与 \def 几乎完全相同,唯一的区别是 \gdef 是全局的,不受分组{}的影响。

\edef:与 \def 几乎完全相同,唯一的区别是 \edef 的定义中如果嵌套了命令,会首先展开命令, 然后再定义新命令。

\xdef:相当于 \gdef 加 \edef,全局的展开定义。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值