2.7 自定義
在LaTeX中, 很多命令和環(huán)境無法滿足我們的需要, 于是我們需要自己設(shè)計一些簡單的命令和環(huán)境, 來方便我們文章的寫作, 自定義的命令和環(huán)境會更好的服務(wù)我們自身.
2.7.1 自定義命令
定義新命令
先給出自定義命令的命令:\newcommand{<新命令>}[<參數(shù)數(shù)量>][<默認(rèn)值>]{<定義內(nèi)容>}
.
它允許作者定義一條新命令, 該命令的各種必要參數(shù)和可選參數(shù)說明如下, 其中新命令兩端的花括號可以省略, 但是不建議省略.
新命令是一個聲明形式的命令, 通常放在導(dǎo)言中, 這樣全文都可以使用該命令, 如果放在正文中, 那么只有該命令聲明后的內(nèi)容才能使用該命令, 或者所在環(huán)境和組合之內(nèi), 即在環(huán)境中定義的命令無法在環(huán)境之外使用, 在花括號內(nèi)定義的命令同樣無法在花括號使用, 如{\newcommand{\cmdA}{a} \cmdA} \cmdA
中, 花括號內(nèi)的\cmdA
會正常輸出a, 而花括號外的\cmdA
會報錯. 而且自定義命令的各種參數(shù)中不得含有抄錄命令\verb
或抄錄環(huán)境verbatim
.
例 自定義一條命令, 使其可以生成你自己的姓名.
\newcommand{\myname}{Zhonghao Sun}
\myname is a student of HIT. \myname's sitting here to study \LaTeX.
但是好像又有了點新的問題, 像我們在命令一節(jié)里講的一樣, Zhonghao Sun
后面的空格又不見了, 原因應(yīng)該很明顯了, 自定義命令后的空格被當(dāng)成了命令結(jié)束的標(biāo)志從而使得Sun
和is
中間的空格丟失, 那我們在自定義命令中主動添加一個空格不就可以了嗎长已?也不行的, 因為那樣做的話在第二句中的'
前又會多出一個空格, 怎么解決呢, xspace
宏包解決了這個問題, 調(diào)用宏包\usepackage{xspace}
, 并將上述定義內(nèi)容改為
Zhonghao Sun\xspace
即可, 命令\xspace
可以自動生成一個空格, 除非其后是標(biāo)點. 再試一下, 這個自定義命令就算完成了.
在上例中, 新命令\myname
定義為自己的姓名, 每當(dāng)使用這個命令就可以生成一個名字, 對于論文排版中要大量出現(xiàn)的文字, 可以將它簡化為一個自定義命令, 提高輸入效率也防止出錯.
例 自定義一條帶參數(shù)的命令, 用于將部分文本轉(zhuǎn)為對應(yīng)中文字體.
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newcommand{\myfont}[1]{\setCJKfamilyfont{font}{#1}\CJKfamily{font}}
{\myfont{華文行楷} 華文行楷}
{\myfont{方正姚體} 方正姚體}
\end{document}
上述自定義命令中, 定義了一個必要參數(shù):字體, 用來選擇需要的字體. 下面給出一個可選參數(shù)與一個必要參數(shù)的例子:
\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}
使用可選參數(shù)可以簡化命令使其更靈活, 但是可選參數(shù)也更容易被忘記.這里我們只選取了改變字體命令來進(jìn)行舉例, 對于其他的命令也可以自行進(jìn)行嘗試.
帶星號的自定義命令:如果把自定義命令改為\newcommand*
, 其不同之處就是命令中的各種參數(shù)不能超過一行, 即命令中不能含有換行符或\par
, 否則會出錯.
系統(tǒng)仍然提供了一種防止同名沖突的命令:\providecommand{<新命令>}[<參數(shù)數(shù)量>][<默認(rèn)值>]{<定義內(nèi)容>}
, 如此定義出來的新命令會檢查被調(diào)用的宏包提供了同名命令, 所定義的內(nèi)容將會被保存下來, 直到提供重名命令的宏包被取消, 該定義的命令才會被調(diào)用. 另外, 如果想自定義有可選子參數(shù)的命令, 可以調(diào)用keycommand
宏包, 并使用命令\newkeycommand
, 具體使用方法可以查看宏包文檔.
修改已有命令
如果我們對系統(tǒng)內(nèi)部的某個命令或已定義的命令的排版效果不滿意, 我們可以對其進(jìn)行修改:
\renewcommand{<已有命令>}[<參數(shù)數(shù)量>][<默認(rèn)值>]{<定義內(nèi)容>}
這個命令只能用于已有命令的修改, 而且對已有命令不要輕易將其重新定義, 因為原定義中可能隱藏著你需要而沒注意過的內(nèi)容, 如果確實需要重新定義, 應(yīng)該先查明已有命令的定義, 再進(jìn)行修改. 同樣, 修改命令也有對應(yīng)的星號形式\renewcommand*
2.7.2 自定義環(huán)境
定義新環(huán)境
如果沒有找到自己滿足的環(huán)境, 那么我們也可以自定義一個環(huán)境, 如自定義命令一樣, 自定義環(huán)境的命令如下
\newenvironment{<新環(huán)境>}[<參數(shù)數(shù)量>][<默認(rèn)值>]{<開始定義>}{<結(jié)束定義>}
然后就可以使用這個新環(huán)境了:
\begin{新環(huán)境}{參數(shù)1}{參數(shù)2}
...
\end{新環(huán)境}
新環(huán)境定義命令中的各種參數(shù)的用途如下
例 自定義一個定理環(huán)境:
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newenvironment{Theorem}{\par\noindent\textbf{定理}\quad}{\par}
\begin{Theorem}
設(shè)可微函數(shù)……
\end{Theorem}
\end{document}
定義中的\quad
是一種長度設(shè)置命令, 我們在數(shù)學(xué)式一章中會更詳細(xì)的介紹它. 開始定義中與結(jié)束定義中的的\par
都是要新起一段. 的如果我們需要在某些定理的后面添加定理的名稱, 可以使用帶可選參數(shù)的自定義環(huán)境, 看下例
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newenvironment{Theorem}[1][]{\par\noindent\textbf{定理}(#1)\quad}{\par}
\begin{Theorem}[可微性定理]
設(shè)可微函數(shù)……
\end{Theorem}
\end{document}
我們看已完成的論文中的定理, 定義都是帶著序號的, 而如何讓這個序號也加在定理后面呢, 在下一節(jié)計數(shù)器中我們會介紹.
修改已有環(huán)境
與修改已有命令一樣, 命令為:
\renewenvrionment{<已有環(huán)境>}[<參數(shù)數(shù)量>][<默認(rèn)值>]{<開始定義>}{<結(jié)束定義>}
同樣修改已有環(huán)境和定義新命令也有帶號的形式\renewenvironment*
和\newenvironment*
, 這些都與修改已有命令的使用方法相同.
2.7.3 多余的空格
在使用自定義命令或環(huán)境時, 可能會產(chǎn)生并不需要的空格, 如果希望消除空格的話, 可以在定義內(nèi)容或新環(huán)境的定義中分別使用以下命令:
例 自定義兩個引用環(huán)境, 其中第二個使用忽略空格命令, 對比兩者的排版效果.
\documentclass{article}
\usepackage[UTF8]{ctex}
\begin{document}
\newenvironment{QuoteA}{``}{''}
\newenvironment{QuoteB}{``\ignorespaces}{\unskip''\ignorespacesafterend}
當(dāng)設(shè)備處于\begin{QuoteA} 休眠 \end{QuoteA}時\par
當(dāng)設(shè)備處于\begin{QuoteB} 休眠 \end{QuoteB}時
\end{document}
在后面也會有自定義的情況, 比如自定義計數(shù)器等, 在后面對應(yīng)的章節(jié)我們會一一介紹.