2.7 自定义
在LaTeX中, 很多命令和环境无法满足我们的需要, 于是我们需要自己设计一些简单的命令和环境, 来方便我们文章的写作, 自定义的命令和环境会更好的服务我们自身.
2.7.1 自定义命令
定义新命令
先给出自定义命令的命令:\newcommand{<新命令>}[<参数数量>][<默认值>]{<定义内容>}
.
它允许作者定义一条新命令, 该命令的各种必要参数和可选参数说明如下, 其中新命令两端的花括号可以省略, 但是不建议省略.
新命令是一个声明形式的命令, 通常放在导言中, 这样全文都可以使用该命令, 如果放在正文中, 那么只有该命令声明后的内容才能使用该命令, 或者所在环境和组合之内, 即在环境中定义的命令无法在环境之外使用, 在花括号内定义的命令同样无法在花括号使用, 如{\newcommand{\cmdA}{a} \cmdA} \cmdA
中, 花括号内的\cmdA
会正常输出a, 而花括号外的\cmdA
会报错. 而且自定义命令的各种参数中不得含有抄录命令\verb
或抄录环境verbatim
.
例 自定义一条命令, 使其可以生成你自己的姓名.
\newcommand{\myname}{Zhonghao Sun}
\myname is a student of HIT. \myname's sitting here to study \LaTeX.
但是好像又有了点新的问题, 像我们在命令一节里讲的一样, Zhonghao Sun
后面的空格又不见了, 原因应该很明显了, 自定义命令后的空格被当成了命令结束的标志从而使得Sun
和is
中间的空格丢失, 那我们在自定义命令中主动添加一个空格不就可以了吗?也不行的, 因为那样做的话在第二句中的'
前又会多出一个空格, 怎么解决呢, xspace
宏包解决了这个问题, 调用宏包\usepackage{xspace}
, 并将上述定义内容改为
Zhonghao Sun\xspace
即可, 命令\xspace
可以自动生成一个空格, 除非其后是标点. 再试一下, 这个自定义命令就算完成了.
在上例中, 新命令\myname
定义为自己的姓名, 每当使用这个命令就可以生成一个名字, 对于论文排版中要大量出现的文字, 可以将它简化为一个自定义命令, 提高输入效率也防止出错.
例 自定义一条带参数的命令, 用于将部分文本转为对应中文字体.
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newcommand{\myfont}[1]{\setCJKfamilyfont{font}{#1}\CJKfamily{font}}
{\myfont{华文行楷} 华文行楷}
{\myfont{方正姚体} 方正姚体}
\end{document}
上述自定义命令中, 定义了一个必要参数:字体, 用来选择需要的字体. 下面给出一个可选参数与一个必要参数的例子:
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newcommand{\myfont}[2][华文行楷]
{\setCJKfamilyfont{CJKfont}{#1}\newfontfamily\nCJKfont{#2}\CJKfamily{CJKfont}\nCJKfont}
\myfont[方正姚体]{Lucida Handwriting} Hello World. 这是我的字体
\end{document}
使用可选参数可以简化命令使其更灵活, 但是可选参数也更容易被忘记.这里我们只选取了改变字体命令来进行举例, 对于其他的命令也可以自行进行尝试.
带星号的自定义命令:如果把自定义命令改为\newcommand*
, 其不同之处就是命令中的各种参数不能超过一行, 即命令中不能含有换行符或\par
, 否则会出错.
系统仍然提供了一种防止同名冲突的命令:\providecommand{<新命令>}[<参数数量>][<默认值>]{<定义内容>}
, 如此定义出来的新命令会检查被调用的宏包提供了同名命令, 所定义的内容将会被保存下来, 直到提供重名命令的宏包被取消, 该定义的命令才会被调用. 另外, 如果想自定义有可选子参数的命令, 可以调用keycommand
宏包, 并使用命令\newkeycommand
, 具体使用方法可以查看宏包文档.
修改已有命令
如果我们对系统内部的某个命令或已定义的命令的排版效果不满意, 我们可以对其进行修改:
\renewcommand{<已有命令>}[<参数数量>][<默认值>]{<定义内容>}
这个命令只能用于已有命令的修改, 而且对已有命令不要轻易将其重新定义, 因为原定义中可能隐藏着你需要而没注意过的内容, 如果确实需要重新定义, 应该先查明已有命令的定义, 再进行修改. 同样, 修改命令也有对应的星号形式\renewcommand*
2.7.2 自定义环境
定义新环境
如果没有找到自己满足的环境, 那么我们也可以自定义一个环境, 如自定义命令一样, 自定义环境的命令如下
\newenvironment{<新环境>}[<参数数量>][<默认值>]{<开始定义>}{<结束定义>}
然后就可以使用这个新环境了:
\begin{新环境}{参数1}{参数2}
...
\end{新环境}
新环境定义命令中的各种参数的用途如下
例 自定义一个定理环境:
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newenvironment{Theorem}{\par\noindent\textbf{定理}\quad}{\par}
\begin{Theorem}
设可微函数……
\end{Theorem}
\end{document}
定义中的\quad
是一种长度设置命令, 我们在数学式一章中会更详细的介绍它. 开始定义中与结束定义中的的\par
都是要新起一段. 的如果我们需要在某些定理的后面添加定理的名称, 可以使用带可选参数的自定义环境, 看下例
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newenvironment{Theorem}[1][]{\par\noindent\textbf{定理}(#1)\quad}{\par}
\begin{Theorem}[可微性定理]
设可微函数……
\end{Theorem}
\end{document}
我们看已完成的论文中的定理, 定义都是带着序号的, 而如何让这个序号也加在定理后面呢, 在下一节计数器中我们会介绍.
修改已有环境
与修改已有命令一样, 命令为:
\renewenvrionment{<已有环境>}[<参数数量>][<默认值>]{<开始定义>}{<结束定义>}
同样修改已有环境和定义新命令也有带号的形式\renewenvironment*
和\newenvironment*
, 这些都与修改已有命令的使用方法相同.
2.7.3 多余的空格
在使用自定义命令或环境时, 可能会产生并不需要的空格, 如果希望消除空格的话, 可以在定义内容或新环境的定义中分别使用以下命令:
例 自定义两个引用环境, 其中第二个使用忽略空格命令, 对比两者的排版效果.
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newenvironment{QuoteA}{``}{''}
\newenvironment{QuoteB}{``\ignorespaces}{\unskip''\ignorespacesafterend}
当设备处于\begin{QuoteA} 休眠 \end{QuoteA}时\par
当设备处于\begin{QuoteB} 休眠 \end{QuoteB}时
\end{document}
在后面也会有自定义的情况, 比如自定义计数器等, 在后面对应的章节我们会一一介绍.