\chapter{自定义 \LaTeX{} 命令和功能}\label{chap:custom} \addtocontents{los}{\protect\addvspace{10pt}} \begin{intro} è¯»åˆ°è¿™ä¸€ç« ä¹‹å‰ï¼Œå¦‚æžœä½ ç¡®ä¿æŽŒæ¡äº†å‰å‡ ç« çš„çŸ¥è¯†å¹¶ç†Ÿç»ƒè¿ç”¨ï¼Œä½ å·²ç»èƒ½åˆ¶ä½œå‡ºå†…容和形å¼éƒ½ç›¸å½“丰富的文档了。 ä½†ä½ å¯èƒ½è¿˜ä¸ä¼šæ»¡è¶³ï¼šæˆ‘è¦å¦‚何制作一个简å•ä½†åƒæ ·çš„毕业论文/书ç±/简历模æ¿ï¼Œæ¯æ¬¡å¯ä»¥ç›´æŽ¥å¥—用, 而ä¸æ˜¯å†åœ¨å¯¼è¨€åŒºå†™ä¸€å †ä»£ç ? æœ¬ç« çš„å†…å®¹å°†æœ‰åŠ©äºŽä½ å®žçŽ°è¿™ä¸€ä¸ªç›®æ ‡ï¼Œè®©ä½ èƒ½ç¼–å†™å¯é‡å¤åˆ©ç”¨çš„模å———å®åŒ…和文档类,并在其ä¸è‡ªå·±å®šä¹‰å‘½ä»¤å’ŒçŽ¯å¢ƒã€‚ ä¸è¿‡ä½œä¸ºå…¥é—¨æ‰‹å†Œï¼Œè¿™äº›çŸ¥è¯†ä»æ˜¯ä¸å…¨é¢çš„ã€‚å¦‚æžœä½ ä¸æ»¡è¶³äºŽæ¤ï¼Œéœ€è¦å‚考更多资料,比如 \cite{companion,clsguide}。 \end{intro} \section{自定义命令和环境}\label{sec:defs} ä½ ä¹Ÿè®¸å·²ç»æ„识到了,在本手册ä¸ä»‹ç»çš„所有命令都被包å«åœ¨ä¸€ä¸ªå¸¦é¢œè‰²çš„矩形背景框ä¸ã€‚ 我们并没有直接使用基础的 \LaTeX{} 命令æ¥å®žçŽ°è¿™ä¸ªæ•ˆæžœï¼Œè€Œæ˜¯åˆ›å»ºäº†ä¸€ä¸ª\textbf{å®åŒ…}, 并在其ä¸å®šä¹‰äº†æ‰€éœ€è¦çš„命令和环境。现在åªéœ€å†™æˆè¿™æ ·ç®€å•çš„å½¢å¼ï¼š \begin{example} \begin{command} \cmd{dum} \end{command} \end{example} 这个例åä¸ä½¿ç”¨äº†ä¸€ä¸ªæ–°çš„环境 \env{command}。这个环境负责给命令代ç åŠ ä¸Šä¸€ä¸ªå¸¦é¢œè‰²çš„çŸ©å½¢èƒŒæ™¯æ¡†ã€‚ åŒæ—¶è¿˜ä½¿ç”¨äº†ä¸€ä¸ªå‘½ä»¤ï¼š\cmd{cmd}, 这个命令负责输出命令的åå—,包括å‰é¢çš„å斜线。 一旦想è¦ä¿®æ”¹å‘½ä»¤ä»£ç çš„æ ·å¼ï¼Œæ¯”如更æ¢é¢œè‰²ã€åŠ 边框ç‰ç‰ï¼Œå¯ä»¥é€šè¿‡æ”¹å˜ \env{command} 环境的定义æ¥å¾ˆå®¹æ˜“地创建新的外观, 而ä¸æ˜¯æŒ¨ä¸ªä¿®æ”¹æ¯ä¸ªå‘½ä»¤ç¤ºä¾‹ã€‚ \subsection{定义新命令}\label{subsec:newcmd} \cmdindex{newcommand} 使用如下命令å¯ä»¥å®šä¹‰ä½ 自己的命令: \begin{command} \cmd{newcommand}\marg*{\cmd{\Arg{name}}}\oarg{num}\marg{definition} \end{command} \cmd{newcommand} 的基本用法需è¦ä¸¤ä¸ªå¿…选å‚数,第一个å‚æ•° \Arg{name} 是è¦å®šä¹‰çš„命令å称(带å斜线), 第二个å‚æ•° \Arg{definition} 是命令的具体定义。方括å·é‡Œçš„å‚æ•° \Arg{num} 是å¯é€‰çš„, 用于指定新命令所需的å‚数数目(最多 9 个)。如果缺çœå¯é€‰å‚数,默认就是 0,也就是新定义的命令ä¸å¸¦ä»»ä½•å‚数。 接下æ¥çš„两个例å有助于ç†è§£ã€‚第一个例å定义了一个新的命令 \cmd{tnss}。 这个命令是本手册英文å称“The Not So Short Introduction to \LaTeXe†的简写。 如果需è¦åœ¨æ–‡æ¡£ä¸å¤šæ¬¡ä½¿ç”¨æœ¬æ‰‹å†Œçš„å称,那么使用这个命令是一个éžå¸¸æ–¹ä¾¿çš„办法。 \begin{example} \newcommand{\tnss}{The not so Short Introduction to \LaTeXe} This is ``\tnss'' \ldots{} ``\tnss'' \end{example} 第二个例å演示了如何定义一个带å‚数的命令。在命令的定义ä¸ï¼Œæ ‡è®° \verb|#1| 代表指定的å‚数。如果想使用多个å‚数,å¯ä»¥ä¾æ¬¡ä½¿ç”¨ \verb|#2|ã€â€¦â€¦ã€\verb|#9| ç‰æ ‡è®°ã€‚ \begin{example} \newcommand{\txsit}[1]{This is the \emph{#1} Short Introduction to \LaTeXe} % in the document body: \begin{itemize} \item \txsit{not so} \item \txsit{very} \end{itemize} \end{example} \cmdindex{renewcommand} \LaTeX{} ä¸å…许使用 \cmd{newcommand} 定义一个与现有命令é‡å的命令。如果需è¦ä¿®æ”¹å‘½ä»¤å®šä¹‰çš„è¯ï¼Œ 使用 \cmd{re\-new\-comm\-and} 命令。它使用与命令 \cmd{new\-comm\-and} 相åŒçš„è¯æ³•ã€‚ \cmdindex{providecommand} 在æŸäº›æƒ…况之下,使用 \cmd{providecommand} 命令是一ç§æ¯”较ç†æƒ³çš„方案:在命令未定义时, 它相当于 \cmd{new\-comm\-and};在命令已定义时,沿用已有的定义。 \subsection{定义环境}\label{subsec:newenv} \cmdindex{newenvironment} 与 \cmd{new\-comm\-and} 命令类似,å¯ä»¥ç”¨ \cmd{new\-environ\-ment} 定义新的环境。它的è¯æ³•å¦‚下所示: \begin{command} \cmd{newenvironment}\marg{name}\oarg{num}\marg{before}\marg{after} \end{command} åŒæ ·åœ°ï¼Œ\cmd{newenvironment} 命令有一个å¯é€‰çš„å‚数。在 \Arg{before} ä¸çš„内容将在æ¤çŽ¯å¢ƒåŒ…å« çš„æ–‡æœ¬ä¹‹å‰å¤„ç†ï¼Œè€Œåœ¨ \Arg{after} ä¸çš„内容将在é‡åˆ° \cmd{end\marg{name}} 命令时处ç†ã€‚ 下é¢çš„例å演示了 \cmd{newenvironment} 命令的用法: \begin{example} \newenvironment{king} {\rule{1ex}{1ex}% \hspace{\stretch{1}}} {\hspace{\stretch{1}}% \rule{1ex}{1ex}} \begin{king} My humble subjects \ldots \end{king} \end{example} \cmdindex{renewenvironment} å‚æ•° \Arg{num} 的使用方å¼ä¸Ž \cmd{new\-comm\-and} 命令相åŒã€‚\LaTeX{} 还åŒæ ·ä¿è¯ä½ ä¸ä¼šä¸å°å¿ƒæ–°å»ºé‡åçš„çŽ¯å¢ƒã€‚å¦‚æžœä½ ç¡®å®žå¸Œæœ›æ”¹å˜ä¸€ä¸ªçŽ°æœ‰çš„çŽ¯å¢ƒï¼Œä½ å¯ä»¥ä½¿ç”¨å‘½ä»¤ \cmd{re\-new\-environ\-ment},它使用和命令 \cmd{new\-environ\-ment} 相åŒçš„è¯æ³•ã€‚ \subsection{\pkg{xparse} å®åŒ…简介}\label{subsec:xparse} \pkgindex{xparse} \cmdindex[xparse]{NewDocumentCommand,NewDocumentEnvironment} 通过 \cmd{newcommand} å’Œ \cmd{newenvironment} å®šä¹‰çš„å‘½ä»¤æˆ–çŽ¯å¢ƒæ ¼å¼æ¯”较固定。如果需è¦å®šä¹‰å¸¦æœ‰å¤šä¸ª å¯é€‰å‚æ•°ã€æˆ–者带星å·çš„命令或环境,å¯ä»¥ä½¿ç”¨ \pkg{xparse} å®åŒ…% \footnote{\LaTeX{} 2020-10-01 版本之åŽï¼Œ\pkg{xparse} å®åŒ…已集æˆåœ¨äº†æ ¼å¼ä¹‹ä¸ï¼Œä¸éœ€è¦æ˜¾å¼è°ƒç”¨ã€‚}。 它æ供了 \cmd{New\-Document\-Command} å’Œ \cmd{New\-Document\-Environment} ç‰å‘½ä»¤ï¼Œå…·ä½“è¯æ³•å¦‚下: \begin{command} \cmd{NewDocumentCommand}\cmd{\Arg{name}}\marg{arg spec}\marg{definition} \\ \cmd{NewDocumentEnvironment}\marg{name}\marg{arg spec}\marg{before}\marg{after} \end{command} 相比 \cmd{newcommand} å’Œ \cmd{newenvironment},\pkg{xparse} 通过 \marg{arg spec} æ¥æŒ‡å®šå‚数的个数 å’Œæ ¼å¼ã€‚基本的å‚æ•°æ ¼å¼è§è¡¨~\ref{tbl:xparse-arg-spec}ã€‚æ³¨æ„ \marg{arg spec} ä¸çš„ç©ºæ ¼å¯ä»¥å¿½ç•¥ã€‚ \begin{table}[htp] \centering \caption{\pkg{xparse} å‚æ•°æ ¼å¼}\label{tbl:xparse-arg-spec} \begin{tabular}{cl} \toprule \textbf{å‚æ•°æ ¼å¼} & \textbf{说明} \\ \midrule \verb|m| & 必选å‚数,由 \verb|{...}| 给出 \\ \verb|o| & å¯é€‰å‚数,由 \verb|[...]| 给出;未给出时返回 \verb|-NoValue-| æ ‡è®° \\ \verb|O|\marg{default} & å¯é€‰å‚数,但在未给出时则返回默认值 \Arg{default} \\ \verb|s| & å¯é€‰çš„æ˜Ÿå· \verb|*| \\ \verb|+| & 修饰åŽé¢çš„ \verb|m|ã€\verb|o| ç‰ï¼Œè¡¨ç¤ºå…许在å‚æ•°ä¸åˆ†æ®µ \\ \bottomrule \end{tabular} \end{table} ä¸åŒè¾“入值在解æžåŽçš„结果å¯ä»¥è§è¡¨~\ref{tbl:xparse-arg-input} ä¸çš„示例。 \begin{table}[htp] \centering \caption{\pkg{xparse} å‚数示例}\label{tbl:xparse-arg-input} \begin{tabular}{ccccc} \toprule \textbf{å‚æ•°æ ¼å¼} & \textbf{输入值} & \verb|#1| & \verb|#2| & \verb|#3| \\ \midrule \verb|m m| & \verb|{foo}{bar}| & \verb|foo| & \verb|bar| & \\ \verb|o m| & \verb|{foo}| & \verb|-NoValue-| & \verb|foo| & \\ \verb|o o m| & \verb|[foo]{bar}| & \verb|foo| & \verb|-NoValue-| & \verb|bar| \\ \verb|m O{default}| & \verb|{foo}| & \verb|foo| & \verb|default| & \\ \verb|m O{default}| & \verb|{foo}[bar]| & \verb|foo| & \verb|bar| & \\ \verb|m O{default}| & \verb|[bar]| & 报错 & & \\ \verb|s o m| & \verb|*[foo]{bar}| & \cmd{BooleanTrue} & \verb|foo| & \verb|bar| \\ \verb|s m O{default}| & \verb|{foo}| & \cmd{BooleanFalse} & \verb|foo| & \verb|default| \\ \bottomrule \end{tabular} \end{table} \cmdindex[xparse]{IfNoValueTF,IfNoValueT,IfNoValueF} \verb|-NoValue-| æ ‡è®°å¯ä»¥ç”¨ \cmd{IfNoValueTF} ç‰å‘½ä»¤æ¥åˆ¤æ–: \begin{command} \cmd{IfNoValueTF}\marg{argument}\marg{true code}\marg{false code} \\ \cmd{IfNoValueT}\marg{argument}\marg{true code} \\ \cmd{IfNoValueF}\marg{argument}\marg{false code} \end{command} 举例如下: \begin{example} % 百分å·ç”¨äºŽæ³¨é‡ŠæŽ‰ä¸å¿…è¦çš„ç©ºæ ¼å’Œæ¢è¡Œç¬¦ \NewDocumentCommand\hello{om} {% \IfNoValueTF{#1}% {Hello, #2!}% {Hello, #1 and #2!}% } \hello{Alice} \hello[Bob]{Alice} \end{example} \cmdindex[xparse]{BooleanTrue,BooleanFalse,IfBooleanTF,IfBooleanT,IfBooleanF} \cmd{BooleanTrue} å’Œ \cmd{BooleanFalse} 则å¯ä»¥ç”¨ \cmd{IfBooleanTF} ç‰å‘½ä»¤æ¥åˆ¤æ–: \begin{command} \cmd{IfBooleanTF}\marg{argument}\marg{true code}\marg{false code} \\ \cmd{IfBooleanT}\marg{argument}\marg{true code} \\ \cmd{IfBooleanF}\marg{argument}\marg{false code} \end{command} 举例如下: \begin{example} \NewDocumentCommand\hereis{sm} {Here is \IfBooleanTF{#1}{an}{a} #2.} \hereis{banana} \hereis*{apple} \end{example} 需è¦æ³¨æ„的是,与命令ä¸åŒï¼ŒçŽ¯å¢ƒåœ¨å®šä¹‰æ—¶åå—里é¢å¯ä»¥åŒ…å« \verb|*|: \begin{verbatim} \NewDocumentEnvironment {mytabular} { o +m } {...} {...} \NewDocumentEnvironment {mytabular*} { m o +m } {...} {...} \end{verbatim} 用 \verb|s| æ ‡è®°çš„ \verb|*| 则应该放在 \cmd{begin}\marg{env} çš„åŽé¢ï¼š \begin{verbatim} \NewDocumentEnvironment { envstar } { s } {\IfBooleanTF {#1} {star} {no star}} {} \begin{envstar}* \end{envstar} \end{verbatim} \cmdindex[xparse]{RenewDocumentCommand,ProvideDocumentCommand,DeclareDocumentCommand} \cmdindex[xparse]{RenewDocumentEnvironment,ProvideDocumentEnvironment,DeclareDocumentEnvironment} 与 \cmd{renewcommand}ã€\cmd{providecommand} ç‰å‘½ä»¤ç±»ä¼¼ï¼Œ\pkg{xparse} å®åŒ…也å…许在命令或环境 已有定义时åšå‡ºç›¸åº”的处ç†ï¼Œå…·ä½“è§è¡¨~\ref{tbl:xparse-renew}。 \begin{table}[htp] \centering \caption{\pkg{xparse} æ供的其他命令}\label{tbl:xparse-renew} \begin{tabular}{cccc} \toprule \textbf{定义命令} & \textbf{定义环境} & \textbf{已定义} & \textbf{未定义} \\ \midrule \cmd{NewDocumentCommand} & \cmd{NewDocumentEnvironment} & 报错 & 给出定义 \\ \cmd{RenewDocumentCommand} & \cmd{RenewDocumentEnvironment} & é‡æ–°å®šä¹‰ & 报错 \\ \cmd{ProvideDocumentCommand} & \cmd{ProvideDocumentEnvironment} & 什么也ä¸åš & 给出定义 \\ \cmd{DeclareDocumentCommand} & \cmd{DeclareDocumentEnvironment} & é‡æ–°å®šä¹‰ & 给出定义 \\ \bottomrule \end{tabular} \end{table} \section{编写自己的å®åŒ…和文档类}\label{sec:packages} \subsection{编写简å•çš„å®åŒ…}\label{subsec:provide-pkg} \cmdindex{usepackage} 如果定义了很多新的环境和命令,文档的导言区将å˜å¾—很长,在这ç§æƒ…况下,å¯ä»¥å»ºç«‹ä¸€ä¸ªæ–°çš„ \LaTeX{} å®åŒ… æ¥å˜æ”¾æ‰€æœ‰ä½ 自己定义的命令和环境,然åŽåœ¨æ–‡æ¡£ä¸ä½¿ç”¨ \cmd{use\-package} 命令æ¥è°ƒç”¨è‡ªå®šä¹‰çš„å®åŒ…。 \begin{sourcecode}[htp] \begin{Verbatim} % Demo Package by Tobias Oetiker \ProvidesPackage{demopack} \newcommand{\tnss}{The not so Short Introduction to \LaTeXe} \newcommand{\txsit}[1]{The \emph{#1} Short Introduction to \LaTeXe} \newenvironment{king}{\begin{quote}}{\end{quote}} \end{Verbatim} \caption{å®åŒ…的一个最简示例。}\label{code:package} \end{sourcecode} \cmdindex{ProvidesPackage} 写一个å®åŒ…çš„åŸºæœ¬å·¥ä½œå°±æ˜¯å°†åŽŸæœ¬åœ¨ä½ çš„æ–‡æ¡£å¯¼è¨€åŒºé‡Œå¾ˆé•¿çš„å†…å®¹æ‹·è´åˆ°å¦ä¸€ä¸ªæ–‡ä»¶ä¸åŽ»ï¼Œ 这个文件需è¦ä»¥ \texttt{.sty} 作扩展åã€‚ä½ è¿˜éœ€è¦åŠ 入一个å®åŒ…专用的命令: \begin{command} \cmd{ProvidesPackage}\marg{package name} \end{command} è¿™ä¸ªå‘½ä»¤åº”è¯¥æ”¾åœ¨ä½ çš„å®åŒ…的最å‰é¢ï¼Œå¹¶ä¸”一定è¦æ³¨æ„:\textbf{\Arg{package name} 需è¦å’Œå®åŒ…的文件å一致。} \cmd{Provides\-Package} 让 \LaTeX{} 记录å®åŒ…çš„å称,从而在 \cmd{usepackage} 命令å†æ¬¡è°ƒç”¨åŒä¸€ä¸ªå®åŒ…的时候忽略之% \footnote{ä½†å¦‚æžœä½ ä»¥\emph{ä¸åŒçš„选项}多次引入å®åŒ…,则有å¯èƒ½ä¼šå¼•èµ·é”™è¯¯ï¼Œè§é™„录 \ref{sec:errors}。}。 æºä»£ç \ref{code:package} 给出了一个å°çš„å®åŒ…示例,其ä¸åŒ…å«äº†æˆ‘们之å‰å®šä¹‰çš„一些命令。 \subsection{在å®åŒ…ä¸è°ƒç”¨å…¶å®ƒå®åŒ…}\label{subsec:require-pkg} \cmdindex{RequirePackage} å¦‚æžœä½ æƒ³è¿›ä¸€æ¥æŠŠå„ç§å®åŒ…的功能汇总到一个文件里,而ä¸æ˜¯åœ¨æ–‡æ¡£çš„å¯¼è¨€åŒºç½—åˆ—ä¸€å¤§å †å®åŒ…çš„è¯ï¼Œ \LaTeX{} å…è®¸ä½ åœ¨è‡ªå·±ç¼–å†™çš„å®åŒ…ä¸è°ƒç”¨å…¶å®ƒå®åŒ…,命令为 \cmd{RequirePackage},用法和 \cmd{usepackage} 一致: \begin{command} \cmd{RequirePackage}\oarg{options}\marg{package name} \end{command} \subsection{编写自己的文档类}\label{subsec:provide-cls} \cmdindex{ProvidesClass} å½“ä½ æ›´è¿›ä¸€æ¥ï¼Œéœ€è¦ç¼–写自己的文档类,如论文模æ¿ç‰ï¼Œé—®é¢˜å°±ç¨ç¨éº»çƒ¦äº†ä¸€äº›ã€‚首先,自己的文档类以 \texttt{.cls} 作扩展å,开头使用 \cmd{ProvidesClass} 命令: \begin{command} \cmd{ProvidesClass}\marg{class name} \end{command} 当然了,\marg{class name}也需è¦å’Œæ–‡æ¡£ç±»çš„文件å一致。 \cmdindex{LoadClass} ä½†æ˜¯æœ‰äº†ä¸Šè¿°å‘½ä»¤å’Œå’Œä½ ä¹‹å‰å¦åˆ°çš„ \cmd{newcommand} ç‰ï¼Œè¿˜å¹¶ä¸èƒ½å®Œæˆä¸€ä¸ªæ–‡æ¡£ç±»çš„ç¼–å†™ï¼Œå› ä¸ºè¯¸å¦‚ \cmd{chapter}〠\cmd{section} ç‰ç‰è®¸å¤šå¸¸ç”¨çš„命令都是在文档类ä¸å®šä¹‰çš„。事实上,许多时候我们åªéœ€è¦åƒè°ƒç”¨å®åŒ…é‚£æ ·è°ƒç”¨ä¸€ä¸ªåŸºæœ¬çš„æ–‡æ¡£ç±»ï¼Œ çœåŽ»è®¸å¤šä¸å¿…è¦çš„éº»çƒ¦ã€‚åœ¨ä½ çš„æ–‡æ¡£ç±»ä¸è°ƒç”¨å…¶å®ƒæ–‡æ¡£ç±»çš„命令是 \cmd{LoadClass},用法和 \cmd{documentclass} å分相åƒï¼š \begin{command} \cmd{LoadClass}\oarg{options}\marg{package name} \end{command} \section{计数器}\label{sec:counters} \pinyinindex{jishuqi}{计数器} 我们早就è§è¯†åˆ°äº† \LaTeX{} å¯¹æ–‡æ¡£å…ƒç´ è‡ªåŠ¨è®¡æ•°çš„èƒ½åŠ›ï¼šç« èŠ‚ç¬¦å·ã€åˆ—表ã€å›¾è¡¨â€¦â€¦å®ƒä»¬éƒ½æ˜¯ä¾é \LaTeX{} æ供的计数器功能完æˆçš„。 \subsection{定义和修改计数器}\label{subsec:count-defs} \cmdindex{newcounter} 定义一个计数器的方法为: \begin{command} \cmd{newcounter}\marg{counter name}\oarg{parent counter name} \end{command} \Arg{counter name} 为计数器的å称。计数器å¯ä»¥æœ‰ä¸Šä¸‹çº§çš„关系,å¯é€‰å‚æ•° \Arg{parent counter name} 定义为 \Arg{counter name} 的上级计数器。 \cmdindex{setcounter,addtocounter,stepcounter} 以下命令修改计数器的数值,\cmd{set\-counter} 将数值设为 \Arg{number}ï¼›\cmd{add\-to\-counter} å°†æ•°å€¼åŠ ä¸Š \Arg{number}ï¼› \cmd{step\-counter} å°†æ•°å€¼åŠ ä¸€ï¼Œå¹¶\textbf{将所有下级计数器归零}。 \begin{command} \cmd{setcounter}\marg{counter name}\marg{number} \\ \cmd{addtocounter}\marg{counter name}\marg{number} \\ \cmd{stepcounter}\marg{counter name} \end{command} \subsection{è®¡æ•°å™¨çš„è¾“å‡ºæ ¼å¼}\label{subsec:count-value} 计数器 \Arg{counter} çš„è¾“å‡ºæ ¼å¼ç”± \cmd{the\Arg{counter}} 表示,如我们在 \ref{sec:pagestyle} 一节è§è¿‡çš„ \cmd{thechapter} ç‰ã€‚ 这个值默认以阿拉伯数å—å½¢å¼è¾“出,如果想改æˆå…¶å®ƒå½¢å¼ï¼Œéœ€è¦é‡å®šä¹‰ \cmd{the\Arg{counter}},如将 equation è®¡æ•°å™¨çš„æ ¼å¼å®šä¹‰ä¸ºå¤§å†™å—æ¯ï¼š \begin{verbatim} \renewcommand\theequation{\Alph{equation}} \end{verbatim} \cmdindex{arabic,alph,Alph,roman,Roman,fnsymbol} 命令 \cmd{Alph} 控制计数器 \Arg{counter} 的值以大写å—æ¯å½¢å¼æ˜¾ç¤ºã€‚下表列出所有å¯ç”¨äºŽä¿®æ”¹è®¡æ•°å™¨æ ¼å¼çš„命令。 注æ„:这些命令\textbf{åªèƒ½ç”¨äºŽè®¡æ•°å™¨ï¼Œä¸èƒ½ç›´æŽ¥ç”¨äºŽæ•°å—},如 \cmd{roman}\marg*{1} è¿™æ ·çš„å‘½ä»¤ä¼šå‡ºé”™ã€‚ \begin{table}[htp] \centering \caption{è®¡æ•°å™¨è¾“å‡ºæ ¼å¼ç›¸å…³å‘½ä»¤}\label{tbl:counter-commands} \begin{tabular}{lp{22em}l} \hline \textbf{命令} & \textbf{æ ·å¼} & \textbf{范围} \\ \hline \cmd{arabic} & 阿拉伯数å—(默认) & \\ \cmd{alph} & å°å†™å—æ¯ & é™ 0--26 \\ \cmd{Alph} & 大写å—æ¯ & é™ 0--26 \\ \cmd{roman} & å°å†™ç½—é©¬æ•°å— & é™éžè´Ÿæ•´æ•° \\ \cmd{Roman} & å¤§å†™ç½—é©¬æ•°å— & é™éžè´Ÿæ•´æ•° \\ \cmd{fnsymbol} & 一系列符å·ï¼Œç”¨äºŽ \cmd{thanks} 命令生æˆçš„脚注 & é™ 0--9 \\ \hline \end{tabular} \begin{quotation} \small \makeatletter 注:\cmd{fnsymbol} 使用的符å·é¡ºæ¬¡ä¸ºï¼š \@fnsymbol{1} \@fnsymbol{2} \@fnsymbol{3} \@fnsymbol{4} \@fnsymbol{5} \@fnsymbol{6} \@fnsymbol{7} \@fnsymbol{8} \@fnsymbol{9} \makeatother \end{quotation} \end{table} è®¡æ•°å™¨çš„è¾“å‡ºæ ¼å¼è¿˜å¯ä»¥åˆ©ç”¨å…¶å®ƒå—ç¬¦ï¼Œç”šè‡³å…¶å®ƒè®¡æ•°å™¨çš„è¾“å‡ºæ ¼å¼ä¸Žä¹‹ç»„åˆã€‚å¦‚æ ‡å‡†æ–‡æ¡£ç±»é‡Œå¯¹ \cmd{sub\-section} ç›¸å…³çš„è®¡æ•°å™¨çš„è¾“å‡ºæ ¼å¼çš„定义相当于: \begin{verbatim} \renewcommand\thesubsection{\thesection.\arabic{subsection}} \end{verbatim} \subsection{\LaTeX{} ä¸çš„计数器}\label{subsec:latex-counts} \begin{itemize} \item æ‰€æœ‰ç« èŠ‚å‘½ä»¤ \cmd{chapter}ã€\cmd{section} ç‰åˆ†åˆ«å¯¹åº”计数器 chapterã€section ç‰ç‰ï¼Œè€Œä¸”有上下级的关系。 而计数器 part 是独立的。 \item 有åºåˆ—表 \env{enumerate} çš„å„级计数器为 enumi, enumii, enumiii, enumiv,也有上下级的关系。 \item 图表浮动体的计数器就是 table å’Œ figure;公å¼çš„计数器为 equation。 这些计数器在 \cls{article} 文档类ä¸æ˜¯ç‹¬ç«‹çš„,而在 \cls{report} å’Œ \cls{book} ä¸ä»¥ chapter 为上级计数器。 \item 页ç ã€è„šæ³¨çš„计数器分别是 page å’Œ footnote。 \end{itemize} 我们å¯ä»¥åˆ©ç”¨å‰é¢ä»‹ç»è¿‡çš„å‘½ä»¤ï¼Œä¿®æ”¹è®¡æ•°å™¨çš„æ ·å¼ä»¥è¾¾åˆ°æƒ³è¦çš„效果,比如把页ç 修改æˆå¤§å†™ç½—马数å—,左å³åŠ æ¨ªçº¿ï¼Œæˆ–æ˜¯ç»™è„šæ³¨åŠ ä¸Šæ–¹æ‹¬å·ï¼š \begin{verbatim} \renewcommand\thepage{--~\Roman{page}~--} \renewcommand\thefootnote{[\arabic{footnote}]} \end{verbatim} \cmdindex{pagenumbering} 我们在 \ref{subsec:basic-pagesyle} å°èŠ‚ä¸è§è¿‡å‘½ä»¤ \cmd{pagenum\-bering}。 它的内部机制是修改 page è®¡æ•°å™¨çš„æ ¼å¼ \cmd{thepage},并将计数器的值é‡ç½®ä¸º 1。 最åŽä»‹ç»ä¸¤ä¸ªæœ‰ç”¨çš„计数器: \subsubsection{secnumdepth} \index{secnumdepth@secnumdepth (\textit{计数器})} \LaTeX{} æ ‡å‡†æ–‡æ¡£ç±»å¯¹ç« èŠ‚åˆ’åˆ†äº†å±‚çº§ï¼š \begin{itemize} \item 在 \cls{article} 文档类里 part 为 0,section 为 1,ä¾æ¤ç±»æŽ¨ï¼› \item 在 \cls{report} å’Œ \cls{book} 文档类里 part 为 -1,chapter 为 0,section 为 1,ç‰ç‰ã€‚ \end{itemize} secnumdepth è®¡æ•°å™¨æŽ§åˆ¶ç« èŠ‚ç¼–å·çš„æ·±åº¦ï¼Œå¦‚æžœç« èŠ‚çš„å±‚çº§å¤§äºŽ secnumdepthï¼Œé‚£ä¹ˆç« èŠ‚çš„æ ‡é¢˜ã€åœ¨ç›®å½•å’Œé¡µçœ‰é¡µè„šçš„æ ‡é¢˜éƒ½ä¸ç¼–å· ï¼ˆç…§å¸¸ç”Ÿæˆç›®å½•å’Œé¡µçœ‰é¡µè„šï¼‰ï¼Œç« 节计数器也ä¸è®¡æ•°ã€‚ å¯ä»¥ç”¨ \cmd{setcounter} 命令设置 secnumdepth ä¸ºè¾ƒå¤§çš„æ•°ä½¿å¾—å±‚çº§æ¯”è¾ƒæ·±çš„ç« èŠ‚ä¹Ÿç¼–å·ï¼Œ 如设置为 4 令 \cmd{paragraph} 也编å·ï¼›æˆ–者设置一个较å°çš„数以å–消编å·ï¼Œå¦‚设置为 -1 令 \cmd{chapter} ä¸ç¼–å·ã€‚ åŽè€…是生æˆä¸ç¼–å·çš„ç« èŠ‚çš„ä¸€ä¸ªå¦™æ‹›ï¼Œå…去了手动使用 \cmd{add\-contents\-line} å’Œ \cmd{mark\-both} 的麻烦。 secnumdepth 计数器在 \cls{article} 文档类里默认为 3(subsubsection 一级);在 \cls{report} å’Œ \cls{book} 文档类里默认为 2(subsection 一级)。 \subsubsection{tocdepth} \index{tocdepth@tocdepth (\textit{计数器})} tocdepth è®¡æ•°å™¨æŽ§åˆ¶ç›®å½•çš„æ·±åº¦ï¼Œå¦‚æžœç« èŠ‚çš„å±‚çº§å¤§äºŽ tocdepthï¼Œé‚£ä¹ˆç« èŠ‚å°†ä¸ä¼šè‡ªåŠ¨å†™å…¥ç›®å½•é¡¹ã€‚é»˜è®¤å€¼åŒ secnumdepth。 \section{\LaTeX{} å¯å®šåˆ¶çš„一些命令和å‚æ•°}\label{sec:latex-settings} \LaTeX{} 事实上有相当一些å¯ä»¥å®šåˆ¶çš„命令和å‚数,ä¸è¿‡å¯¹äºŽä¿®æ”¹æ ·å¼æˆ–者开å‘å®åŒ…æ¥è¯´ï¼Œè¿™äº›å®šåˆ¶é¡¹è¿˜è¿œè¿œä¸å¤Ÿã€‚ 对于用户æ¥è®²ï¼Œå®¹æ˜“定制的是这一些项目: \begin{itemize} \item æ ‡é¢˜å称/å‰åŽç¼€ç‰ã€‚表 \ref{tbl:latex-settings-names} åˆ—å‡ºäº†æ ‡å‡†æ–‡æ¡£ç±»é‡Œå¯å®šåˆ¶çš„项目, 表ä¸æ‰€æœ‰çš„ \LaTeX{} 命令都å¯ä»¥ç”¨ \cmd{re\-new\-comm\-and} æ¥ä¿®æ”¹ã€‚ \item 长度。å‰æ–‡åœ¨å™è¿°å„ç§æŽ’ç‰ˆå…ƒç´ æ—¶å·²ç»ä»‹ç»è¿‡ä¸€äº›ï¼ŒçŽ°å½’纳于表 \ref{tbl:latex-settings-lengths}。 表ä¸æ‰€æœ‰çš„长度命令å¯ç”¨ \cmd{setlength} æ¥ä¿®æ”¹ã€‚ 大多数控制页é¢å°ºå¯¸çš„长度å‚数在图 \ref{fig:layouts} 给出,æ¤å¤„ä¸å†èµ˜è¿°ã€‚ \end{itemize} \begin{table}[htp] \centering \caption{\LaTeX{} å¯å®šåˆ¶çš„æ ‡é¢˜å称/å‰åŽç¼€}\label{tbl:latex-settings-names} \small \begin{tabular}{llp{24em}} \hline \textbf{命令} & \textbf{默认值} & \textbf{å«ä¹‰} \\ \hline \cmd{partname} & Part & \cmd{part} 命令生æˆçš„æ ‡é¢˜å‰ç¼€ \\ \cmd{chaptername} & Chapter & \cmd{chapter} 命令生æˆçš„æ ‡é¢˜å‰ç¼€ \\ \cmd{appendixname} & Appendix & 使用 \cmd{appendix} 命令生æˆçš„é™„å½•éƒ¨åˆ†çš„ç« æ ‡é¢˜å‰ç¼€ \\ \cmd{abstractname} & Abstract & 摘è¦çŽ¯å¢ƒ \env{abstract} çš„æ ‡é¢˜å称 \\[1ex] \cmd{contentsname} & Contents & \cmd{tableofcontents} 命令生æˆçš„ç›®å½•æ ‡é¢˜ \\ \cmd{listfigurename} & List of Figures & \cmd{listoffigures} 命令生æˆçš„æ’å›¾ç›®å½•æ ‡é¢˜ \\ \cmd{listtablename} & List of Tables & \cmd{listoftables} 命令生æˆçš„è¡¨æ ¼ç›®å½•æ ‡é¢˜ \\[1ex] \cmd{tablename} & Table & \env{table} æµ®åŠ¨ä½“ä¸ \cmd{caption} 命令生æˆçš„æ ‡é¢˜å‰ç¼€ \\ \cmd{figurename} & Figure & \env{figure} æµ®åŠ¨ä½“ä¸ \cmd{caption} 命令生æˆçš„æ ‡é¢˜å‰ç¼€ \\[1ex] \cmd{refname} & References & \env{thebibliography} 环境或 \cmd{biblio\-graphy} 命令生æˆçš„å‚è€ƒæ–‡çŒ®æ ‡é¢˜ï¼ˆ\cls{article} 文档类) \\ \cmd{bibname} & Bibliography & \env{thebibliography} 环境或 \cmd{biblio\-graphy} 命令生æˆçš„å‚è€ƒæ–‡çŒ®æ ‡é¢˜ï¼ˆ\cls{report} å’Œ \cls{book} 文档类)\\ \cmd{indexname} & Index & \cmd{printindex} 命令生æˆçš„ç´¢å¼•æ ‡é¢˜ \\ \hline \end{tabular} \begin{quotation}\footnotesize% 注:形如“第 X ç« â€å’Œâ€œç¬¬ X 部分â€çš„ä¸æ–‡ç« èŠ‚æ ‡é¢˜ä¸èƒ½ç›´æŽ¥ç”±ä¿®æ”¹æœ¬è¡¨çš„命令得到,需è¦ä½¿ç”¨ \pkg{titlesec} ç‰å®åŒ…定制。 如果使用 \pkg{ctex} å®åŒ…æˆ–æ–‡æ¡£ç±»ï¼Œé‚£ä¹ˆæ ‡é¢˜é»˜è®¤è¢«ä¿®æ”¹æˆâ€œç¬¬ X ç« â€å’Œâ€œç¬¬ X 部分â€çš„å½¢å¼ï¼Œæœ¬è¡¨ä¸çš„å…¶å®ƒæ ‡é¢˜ä¹Ÿä¿®æ”¹ä¸ºä¸æ–‡æ ‡é¢˜ã€‚è¯¦è§ \pkg{ctex} å®åŒ…的帮助文档。 \end{quotation} \end{table} \begin{table}[htp] \centering \caption{\LaTeX{} å¯å®šåˆ¶çš„长度å‚æ•°}\label{tbl:latex-settings-lengths} \small \begin{tabular}{lll} \hline \textbf{命令} & \textbf{默认值} & \textbf{å«ä¹‰} \\ \hline \cmd{fboxrule} & 0.4pt & \cmd{fbox} 或 \cmd{framebox} ç‰å¸¦æ¡†ç›’å的线宽 \\ \cmd{fboxsep} & 3pt & \cmd{fbox} 或 \cmd{framebox} ç‰å¸¦æ¡†ç›’åçš„å†…è¾¹è· \\[1ex] \cmd{arraycolsep} & 5pt & \env{array} çŽ¯å¢ƒçš„è¡¨æ ¼é¡¹å‰åŽçš„é—´è·\textsuperscript{注 1} \\ \cmd{tabcolsep} & 6pt & \env{tabular} çŽ¯å¢ƒçš„è¡¨æ ¼é¡¹å‰åŽçš„é—´è·\textsuperscript{注 1} \\ \cmd{arrayrulewidth} & 0.4pt & è¡¨æ ¼çº¿å®½ \\ \cmd{doublerulesep} & 2pt & è¿žç»ä¸¤æ ¹è¡¨æ ¼çº¿ä¹‹é—´çš„é—´è· \\[1ex] \cmd{abovecaptionskip} & 10pt & \cmd{caption} 命令上方的间è·\textsuperscript{注 2} \\ \cmd{belowcaptionskip} & 0pt & \cmd{caption} 命令下方的间è·\textsuperscript{注 2} \\[1ex] \cmd{columnsep} & 10pt & åŒæ 排版下两æ çš„é—´è· \\ \cmd{columnseprule} & 0pt & åŒæ 排版下两æ 之间竖线的宽度 \\ \hline \end{tabular} \begin{quotation}\footnotesize% 注 1:\cmd{arraycolsep} å’Œ \cmd{tabcolsep} 是æ¯ä¸ªè¡¨æ ¼é¡¹æœ¬èº«å‰åŽçš„é—´è·ï¼ˆè¡¨æ ¼çº¿å‰åŽæ— é—´è·ï¼›\texttt{@} åˆ—æ ¼å¼ä¼šæ¶ˆé™¤ä¸Žå‰åŽè¡¨æ ¼é¡¹çš„é—´è·ï¼‰ã€‚ ä¸¤ä¸ªè¡¨æ ¼é¡¹ä¹‹é—´çš„é—´è·ç›¸å½“于 2\cmd{arraycolsep} 或 2\cmd{tabcolsep}。\par 注 2:在默认设置下,\cmd{caption} 命令和ä½äºŽå®ƒä¸‹æ–¹çš„å›¾è¡¨ä¹‹é—´æ— é—´è·ã€‚å®åŒ… \pkg{caption} 改善了这个问题。 \end{quotation} \end{table} \endinput