LaTeX 进阶语法

文章目录

  • LaTeX进阶语法
    • 一、 样式排版
      • 1、 字体和字号
        • 1.1 字体样式
        • 1.2 字号
        • 1.3 ctex宏包更改中文字体
        • 1.4 文字装饰
      • 2、 段落格式和间距
        • 2.1 长度和长度变量
        • 2.2 行距
        • 2.3 段落格式
        • 2.4 水平间距
        • 2.5 垂直间距
      • 3、 页面和分栏
        • 3.1 页面介绍
        • 3.2 利用 geometry 宏包设置页面参数
        • 3.3 页面内容的垂直对齐
        • 3.4 分栏
        • 3.5 页眉页脚
          • 3.5.1 基本的页眉页脚样式
          • 3.5.2 手动更改页眉页脚的内容
          • 2.5.3 fancyhdr 宏包
    • 二、 特色功能
      • 1、 索引
        • 1.1 使用 makeindex 工具
        • 1.2 索引项的写法
      • 2、 使用颜色
        • 2.1 颜色的表达方式
        • 2.2 带颜色的文本
      • 3、 使用超链接
        • 3.1 hyperref 宏包
        • 3.2 超链接
        • 3.3 PDF 书签
    • 三、 自定义命令和功能
      • 1、 自定义命令和环境
        • 1.1 定义新命令
        • 1.2 定义环境
        • 1.3 xparse 宏包
      • 2、 编写自己的宏包和文档类
        • 2.1 编写简单的宏包
        • 2.2 在宏包中调用其它宏包
        • 2.3 编写自己的文档类
      • 3、 计数器
        • 3.1 定义和修改计数器
        • 3.2 计数器的输出格式
        • 3.3 LaTeX 中的计数器
      • 4、 LaTeX 可定制的一些命令和参数
    • 四、 盒子
      • 1、 水平盒子
      • 2、 带框的水平盒子
      • 3、 垂直盒子
      • 4、 标尺盒子

LaTeX进阶语法

LaTeX 进阶语法_第1张图片

一、 样式排版

在学完基础语法之后,标题、目录、、章节、公式、列表和图片等,学完这些只有,你排版出来的文档还是有许多类似的东西,如,字体,页眉页脚、页边距等等。本章的内容是修改LaTeX的排版样式。

1、 字体和字号

1.1 字体样式

常用的字体样式:

LaTeX 进阶语法_第2张图片

1.2 字号

字号命令实际大小依赖于所使用的文档类及其选项。表 5.3 列出了这些命令在标准文档类中的绝对大小,单位为 pt。

注意,可以选择使用{}来进行分块。

LaTeX还提供了一个基础命令\fontsize来设置任意大小的字号:

语法:\fontsize{size}{base line-skip}

  • size:字号大小
  • base line-skip:基础行距

注意:表5.3中的命令也都设定了与字号对应的基础行距,大小为字号的1.2倍。

如果不是在导言区,\fontsize的设定需要\selectfont命令才能立即生效,而表5.2的字号设定都是立即生效的。

常用的快捷设置字号的命令:

LaTeX 进阶语法_第3张图片

每一个命令对应的字号大小:

LaTeX 进阶语法_第4张图片

1.3 ctex宏包更改中文字体

可以使用ctex宏包中的命令来设置中文字体:

\setCJKmainfont{⟨font name⟩}[⟨font features⟩]
\setCJKsansfont{⟨font name⟩}[⟨font features⟩]
\setCJKmonofont{⟨font name⟩}[⟨font features⟩]

由于中文字体少有对应的粗体或斜体,⟨font features⟩ 里多用其他字体来配置,比如在 Win-dows 中设定基本字体为宋体,并设定对应的 BoldFont 为黑体,ItalicFont 为楷体:

\setCJKmainfont{SimSun}[BoldFont=SimHei, ItalicFont=KaiTi]
1.4 文字装饰

下划线:\underline

An \underline{underlined} text.

\underline 命令生成下划线的样式不够灵活,不同的单词可能生成高低各异的下划线,并且无法换行。ulem 宏包提供了更灵活的解决方案,它提供的 \uline 命令能够轻松生成自动换行的下划线:

An example of \uline{somelong and underlined words.}

斜体:\emph

Some \emph{emphasized words,including \emph{double-emphasized}words}, are shown here.

\emph 命令,它将文字变为斜体以示强调,而如果在已强调的文字中嵌套使用 \emph 命令,命令内则使用直立体文字。

2、 段落格式和间距

2.1 长度和长度变量

长度的数值 ⟨length⟩ 由数字和单位组成。

  • 在一些情况下还会用到可伸缩的“弹性长度”,如 12pt plus 2pt minus 3pt 表示基础长度为 12pt,可以伸展到 14pt,也可以收缩到 9pt。也可只定义 plus 或者 minus 的部分,如 0pt plus 5pt。
  • 长度的数值还可以用长度变量本身或其倍数来表达,如 2.5\parindent 等。
  • 如果需要自定义长度变量,需使用命令:\newlength{\⟨length command⟩}

LaTeX 进阶语法_第5张图片

长度变量可以用 \setlength 赋值,或用 \addtolength 增加长度:

\setlength{\⟨length command⟩}{⟨length⟩}
\addtolength{\⟨length command⟩}{⟨length⟩}
2.2 行距

前文中我们提到过 \fontsize 命令可以为字号设定对应的行距,但我们很少那么用。更常用的办法是在导言区使用 \linespread 命令。

语法:\linespread{⟨factor⟩}

  • factor:其作用于基础行距而不是字号。缺省的基础行距是 1.2 倍字号大小(参考 \fontsize 命令),因此使用 \linespread{1.5} 意味着最终行距为 1.8 倍的字号大小。

  • 如果不是在导言区全局修改,而想要局部地改变某个段落的行距,需要用 \selectfont 命令使 \linespread 命令的改动立即生效。

    {\linespread{2.0}\selectfont
    The baseline skip is set to be
    twice the normal baseline skip.
    Pay attention to the \verb|\par|
    command at the end. \par}
    In comparison, after the
    curly brace has been closed,
    everything is back to normal.
    
2.3 段落格式
\setlength{\leftskip}{⟨length⟩}  % 左缩进
\setlength{\rightskip}{⟨length⟩}  % 右缩进
\setlength{\parindent}{⟨length⟩}  % 首行缩进

控制段落缩进的命令为:

\indent
\noindent

如果需要在某一段不缩进,可在段落开头使用 \noindent 命令。相反地,\indent 命令强制开启一段首行缩进的段落。在段落开头使用多个 \indent 命令可以累加缩进量。

2.4 水平间距

LaTeX 默认为将单词之间的“空格”转化为水平间距。如果需要在文中手动插入额外的水平间距,可使用 \hspace 命令:

This\hspace{1.5cm}is a space of 1.5 cm.

\hspace 命令生成的水平间距如果位于一行的开头或末尾,则有可能因为断行而被舍弃。可使用 \hspace* 命令代替 \hspace 命令得到不会因断行而消失的水平间距。

命令 \stretch{⟨n⟩} 生成一个特殊弹性长度,参数 ⟨n⟩ 为权重。它的基础长度为 0pt,但可以无限延伸,直到占满可用的空间。如果同一行内出现多个 \stretch{⟨n⟩},这一行的所有可用空间将按每个 \stretch 命令给定的权重 ⟨n⟩ 进行分配。

x\hspace{\stretch{1}}
x\hspace{\stretch{3}}
x\hspace{\fill}x  % 相当于\stretvh{1}
2.5 垂直间距

在页面中,段落、章节标题、行间公式、列表、浮动体等元素之间的间距是 LATEX 预设的。

  • 比如 \parskip,默认设置为 0pt plus 1pt。

如果我们想要人为地增加段落之间的垂直间距,可以在两个段落之间的位置使用 \vspace 命令:

A paragraph.

\vspace{2ex}
Another paragraph.

另外 LATEX 还提供了\bigskip, \medskip, \smallskip 来增加预定义长度的垂直间距。

\parbox[t]{3em}{TeX\par TeX}
\parbox[t]{3em}{TeX\par\smallskip TeX}
\parbox[t]{3em}{TeX\par\medskip TeX}
\parbox[t]{3em}{TeX\par\bigskip TeX}

3、 页面和分栏

3.1 页面介绍

控制页边距的参数由图 5.1 里给出的各种长度变量控制。可以用 \setlength 命令修改这些长度变量,以达到调节页面尺寸和边距的作用;反之也可以利用这些长度变量来决定排版内容的尺寸,如在 tabularx 环境或 \includegraphics 命令的参数里,设置图片或表格的宽度为0.8\textwidth。

LaTeX 进阶语法_第6张图片

页边距等比较直观的参数则必须间接设置。我们根据图 5.1 将各个方向的页边距计算公式给出(以奇数页为例):

⟨left-margin⟩ = 1in + \hoffset + \oddsidemargin
⟨right-margin⟩ = \paperwidth − ⟨left-margin⟩ − \textwidth
⟨top-margin⟩ = 1in + \voffset + \topmargin + \headheight + \headsep
⟨bottom-margin⟩ = \paperheight − ⟨top-margin⟩ − \textheight

geometry 宏包提供了设置页边距等参数的简便方法,能够帮我们完成背后繁杂的计算。

3.2 利用 geometry 宏包设置页面参数

调用方式:

  1. 调用 geometry 宏包,然后用其提供的 \grometry命令设置页面参数:

    \usepackage{grometry}
    \grometry{grometry-settings}
    
  2. 直接在导入宏包时设置:

    \usepackage[grometry-settings]{grometry}
    

比如,\geometry{a4paper,left=1.25in,right=1.25in,top=1in,bottom=1in}

3.3 页面内容的垂直对齐

LaTeX 默认将页面内容在垂直方向分散对齐。对于有大量图表的文档,许多时候想要做到排版匀称的页面很困难,垂直分散对齐会造成某些页面的垂直间距过宽,还可能报大量的Underfull \vbox 警告。LaTex 还提供了另一种策略:将页面内容向顶部对齐,给底部留出高度不一的空白。

以下命令分别令页面在垂直方向向顶部对齐/分散对齐:

\raggedbottom
\flushbottom
3.4 分栏

LaTeX 支持简单的单栏或双栏排版。标准文档类的全局选项 onecolumn、twocolumn 可控制全文分单栏或双栏排版。LaTeX 也提供了切换单/双栏排版的命令:

\onecolumn
\twocolumn[⟨one-column top material⟩]

one-column top material:用于排版双栏之上的一部分单栏内容

注意:

  • 切换单/双栏排版时总是会另起一页(\clearpage)。在双栏模式下使用 \newpage 会换栏而不是换页;\clearpage 则能够换页。
  • 双栏排版时每一栏的宽度为 \columnwidth,它由 \textwidth 减去 \columnsep 的差除以 2 得到。两栏之间还有一道竖线,宽度为 \columnseprule,默认为零,也就是看不到竖线。

使用 multicol 宏包进行分栏:

如以下环境将内容分为 3 栏

\begin{multicols}{3}
...
\end{multicols}

multicol 宏包能够在一页之中切换单栏/多栏,也能处理跨页的分栏,且各栏的高度分布平衡。但代价是在 multicols 环境中无法正常使用 table 和 figure 等浮动体环境,它会直接让浮动体丢失。multicols 环境中只能用跨栏的 table* 和 figure* 环境,或者用 float 宏包提供的 H 参数固定浮动体的位置。

3.5 页眉页脚
3.5.1 基本的页眉页脚样式

LaTeX中提供了命令 \pagestyle 来修改页眉页脚的样式:\pagestyle{⟨page-style⟩}

命令 \thispagestyle 只影响当页的页眉页脚样式:\thispagestyle{⟨page-style⟩}

⟨page-style⟩

  • 在 LATEX 里预定义了四类样式

    样式 作用
    empty 页眉页脚为空
    plain 页眉为空,页脚为页码。(article 和 report 文档类默认;book 文档类的每章第一页也为 plain 格式)
    headings 页眉为章节标题和页码,页脚为空。(book 文档类默认)
    myheadings 页眉为页码及 \markdoth\markright命令手动指定的内容,页脚为空。
  • 注意:

    • article 文档类,twoside 选项 偶数页为页码和节标题,奇数页为小节标题和页码;
    • article 文档类,oneside 选项 页眉为节标题和页码;
    • report / book 文档类,twoside 选项 偶数页为页码和章标题,奇数页为节标题和页码;
    • report / book 文档类,oneside 选项 页眉为章标题和页码.
  • \pagenumbering 命令令我们能够改变页眉页脚中的页码样式:\pagenumbering{⟨style⟩}

    ⟨style⟩ :页码样式,默认为 arabic(阿拉伯数字),还可修改为 roman(小写罗马数字)、Roman(大写罗马数字)等。

    注意:

    • 使用 \pagenumbering 命令后会将页码重置为 1。
    • book 文档类的 \frontmatter 和 \mainmatter 内部就使用了 \pagenumbering 命令切换页码样式。
3.5.2 手动更改页眉页脚的内容

对于 headings 或者 myheadings 样式,LaTeX 允许用户使用命令手动修改页眉上面的内容,特别是因为使用了 \chapter* 等命令而无法自动生成页眉页脚的情况:

\markright{⟨right-mark⟩}
\markboth{⟨left-mark⟩}{⟨right-mark⟩}

在双面排版、headings / myheadings 页眉页脚样式下,⟨left-mark⟩ 和 ⟨right-mark⟩ 的内容分别预期出现在左页(偶数页)和右页(奇数页)。事实上 \chapter 和 \section 等章节命令内部也使用 \markboth 或者 \markright 生成页眉。

2.5.3 fancyhdr 宏包

ancyhdr 宏包改善了页眉页脚样式的定义方式,允许我们将内容自由安置在页眉和页脚的左、中、右三个位置,还为页眉和页脚各加了一条横线。

fancyhdr 自定义了样式名称 fancy。使用 fancyhdr 宏包定义页眉页脚之前,通常先用 \pagestyle{fancy} 调用这个样式。在 fancyhdr 中定义页眉页脚的命令为:

\fancyhf[⟨position⟩]{…}  % 用于同时定义页眉和页脚,习惯上用来清空页眉页脚的设置
\fancyhead[⟨position⟩]{…}
\fancyfoot[⟨position⟩]{…}

参数:

  • position:其为 L(左)/C(中)/R(右)以及与 O(奇数页)/E(偶数页)字母的组合。

示例:

% 在导言区使用此代码
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
\fancyhf{}
\fancyfoot[C]{\bfseries\thepage}
\fancyhead[LO]{\bfseries\rightmark}
\fancyhead[RE]{\bfseries\leftmark}
\renewcommand{\headrulewidth}{0.4pt} % 注意不用 \setlength
\renewcommand{\footrulewidth}{0pt}

效果为将章节标题放在和 headings 一致的位置,但使用加粗格式;页码都放在页脚正中;修改横线宽度,“去掉”页脚的横线。

更多使用方法请查看宏包的帮助文档。

二、 特色功能

1、 索引

1.1 使用 makeindex 工具

要使用索引,须经过这么几个步骤(仍设源代码名为 demo.tex):

  1. 在 LATEX 源代码的导言区调用 makeidx 宏包,并使用 \makeindex 命令开启索引的收集:

    \usepackage{makeidx}
    \makeindex
    
  2. 在正文中需要索引的地方使用 \index 命令。\index 命令的参数写法详见下一小
    节;并在需要输出索引的地方(如所有章节之后)使用 \printindex 命令。

  3. 编译过程:

    1. 首先用 xelatex 等命令编译源代码 demo.tex。编译过程中产生索引记录文件 demo.idx;
    2. 用 makeindex 程序处理 demo.idx,生成用于排版的索引列表文件 demo.ind;
    3. 再次编译源代码 demo.tex,正确生成索引列表。
1.2 索引项的写法

使用语法:\index{index entry}

index entry:其为索引项

  • LaTeX 进阶语法_第7张图片

  • 其中 !、@ 和 | 为特殊符号,如果要向索引项直接输出这些符号,需要加前缀 ";而 " 需要输入两个引号 “” 才能输出到索引项。

  • 要使用一个较为复杂的,结合多级索引、索引格式、页码格式等。自己使用时,最好还是遵循“简单”的原则

    Test index.
    \index{Test@\textsf{""Test}|(textbf}
    \index{Test@\textsf{""Test}!sub@"|sub"||see{Test}}
    \newpage
    Test index.
    \index{Test@\textsf{""Test}|)textbf}
    \printindex
    

2、 使用颜色

原始的 LaTeX不支持使用各种颜色。color 宏包或者 xcolor 宏包提供了对颜色的支持,给PDF 输出生成颜色的特殊指令。

2.1 颜色的表达方式

调用 color 或 xcolor 宏包后,我们就可以用如下命令切换颜色:

\color[⟨color-mode⟩]{⟨code⟩}
\color{⟨color-name⟩}

颜色的表达方式有两种:

  1. 使用色彩模型和色彩代码,代码用 0 ∼ 1 的数字代表成分的比例。color 宏包支持 rgb、cmyk 和 gray 模型,xcolor 支持更多的模型如 hsb 等。

    \large\sffamily
    {\color[gray]{0.6}60\% 灰色} \\
    {\color[rgb]{0,1,1}
    青色}
    
  2. 直接使用名称代表颜色,前提是已经定义了颜色名称(没定义的话会报错)。

    \large\sffamily
    {\color{red} 红色} \\
    {\color{blue} 蓝色}
    

    color 宏包仅定义了 8 种颜色名称,xcolor 补充了一些,总共有 19 种。

LaTeX 进阶语法_第8张图片

xcolor 还支持将颜色通过表达式混合或互补:

\large\sffamily
{\color{red!40} 40\% 红色}\\
{\color{blue}蓝色
\color{blue!50!black}蓝黑
\color{black}黑色}\\
{\color{-red}红色的互补色}

我们还可以通过命令自定义颜色名称,注意这里的 ⟨color-mode⟩ 是必选参数:\definecolor{⟨color-name⟩}{⟨color-mode⟩}{⟨code⟩}

如果调用 color 或 xcolor 宏包时指定 dvipsnames 选项,就有额外的 68 种颜色名称可用。xcolor 宏包还支持通过指定其它选项载入更多颜色名称。限于篇幅不展开介绍,详情请参考 xcolor宏包的手册。

2.2 带颜色的文本

原始的 \color 命令类似于字体命令 \bfseries,它使之后排版的内容全部变成指定的颜色,所以直接使用时通常要加花括号分组。color / xcolor 宏包都定义了一些方便用户使用的带颜色元素。

\textcolor[⟨color-mode⟩]{⟨code⟩}{⟨text⟩}
\textcolor{⟨color-name⟩}{⟨text⟩}

使用示例:

文字用\textcolor{red}{红色}强调

3、 使用超链接

3.1 hyperref 宏包

hyperref 宏包涉及的链接遍布 LaTeX的每一个角落——目录、引用、脚注、索引、参考文献等等都被封装成超链接。但这也使得它与其它宏包发生冲突的可能性大大增加,虽然宏包已经尽力解决各方面的兼容性,但仍不能面面俱到。为减少可能的冲突,习惯上将 hyperref 宏包放在其它宏包之后调用

hyperref 宏包提供了命令 \hypersetup 配置各种参数。参数也可以作为宏包选项,在调用宏包时指定:

\hypersetup{⟨option1⟩,⟨option2⟩={value},…}
\usepackage[⟨option1⟩,⟨option2⟩={value},…]{hyperref}

可用参数:

LaTeX 进阶语法_第9张图片

3.2 超链接

hyperref 宏包提供了直接书写超链接的命令,用于在 PDF 中生成 URL:

\url{⟨url⟩}
\nolinkurl{⟨url⟩}

\url 和 \nolinkurl 都像抄录命令 \verb 一样输出一个 URL,区别是前者还为 URL 加上了超链接,后者没有。在 \url 等命令的参数 ⟨url⟩ 里,可直接输入如 %、& 这样的特殊符号。
我们也可以像 HTML 中的超链接一样,把一段文字作为超链接:\href{⟨url⟩}{⟨text⟩}

\url{https://wikipedia.org} \\
\nolinkurl{https://wikipedia.org} \\
\href{https://wikipedia.org}{Wiki}

使用 hyperref 宏包后,文档中所有的引用、参考文献、索引等等都转换为超链接。用户也可对某个 \label 命令定义的标签 ⟨label⟩ 作超链接:\hyperref[⟨label⟩]{⟨text⟩}

默认的超链接在文字外边加上一个带颜色的边框(在打印 PDF 时边框不会打印),可指定colorlinks 参数修改为将文字本身加上颜色,或修改 pdfborder 参数调整边框宽度以“去掉”边框;hidelinks 参数则令超链接既不变色也不加边框。

\hypersetup{hidelinks}
% or:
\hypersetup{pdfborder={0 0 0}}
3.3 PDF 书签

hyperref 宏包另一个强大的功能是为 PDF 生成书签。对于章节命令 \chapter、\section等,默认情况下会为 PDF 自动生成书签。和交叉引用、索引等类似,生成书签也需要多次编译源代码,第一次编译将书签记录写入 .out 文件,第二次编译才正确生成书签。

使用 CJK 宏包时,为了防止中文书签出现乱码,需要进行繁琐的设置;但在使用 ctex 宏包和文档类、且使用 xelatex 或 lualatex 编译的情况下,无需用户额外干预,即可正确生成中文书签。

hyperref 还提供了手动生成书签的命令:\pdfbookmark[⟨level⟩]{⟨bookmark⟩}{⟨anchor⟩}

参数说明:

  • bookmark:书签名称
  • anchor:书签项使用的锚点(类似交叉引用的标签)
  • level:书签的层级,默认为零

章节命令里往往有 LATEX 命令甚至数学公式,而 PDF 书签是纯文本,对命令和公式的处理很困难,有出错的风险。hyperref 宏包已经为我们处理了许多常见命令,如 \LaTeX 和字体命令 \textbf 等,对于未被处理的命令或数学公式,就要在章节标题中使用如下命令,分别提供LATEX 代码和 PDF 书签可用的纯文本:\texorpdfstring{⟨LATEX code⟩}{⟨PDF bookmark text⟩}

比如:

\section{质能公式 \texorpdfstring{$E=mc^2$}{E=mc\textasciicircum 2}}

三、 自定义命令和功能

1、 自定义命令和环境

1.1 定义新命令

使用如下命令可以定义你自己的命令:\newcommand{\⟨name⟩}[⟨num⟩]{⟨definition⟩}

参数:

  • name:需要定义的命令名称
  • definition:命令的具体定义
  • num:可选参数,用于指定新命令所需要的参数数目(最多9个)
    • 如果缺省可选参数,默认就是0

比如,不带参数的命令:

\newcommand{\tnss}{The not so Short
Introduction to \LaTeXe}
This is ``\tnss'' \ldots{} ``\tnss''

带参数的命令:

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}

LaTeX 不允许使用 \newcommand 定义一个与现有命令重名的命令。如果需要修改命令定义的话,使用 \renewcommand 命令。它使用与命令 \newcommand 相同的语法。

在某些情况之下,使用 \providecommand 命令是一种比较理想的方案:在命令未定义时,它相当于 \newcommand;在命令已定义时,沿用已有的定义。

1.2 定义环境

与 \newcommand 命令类似,可以用 \newenvironment 定义新的环境。它的语法如下所示:\newenvironment{⟨name⟩}[⟨num⟩]{⟨before⟩}{⟨after⟩}

参数:

  • name:需要定义的环境的名称
  • num:可选参数,用于指定定义新环境所需要的参数数目
    • 如果缺省可选参数,默认就是0
  • before:在此环境包含文本之前处理
  • after:内容将在遇到\end{name}命令时处理

使用示例:

\newenvironment{king}
{\rule{1ex}{1ex}  
\hspace{\stretch{1}}}  % 这一部分是before
{\hspace{\stretch{1}}
\rule{1ex}{1ex}}  % 这一部分是after
\begin{king}
My humble subjects \ldots
\end{king}

参数 ⟨num⟩ 的使用方式与 \newcommand 命令相同。LATEX 还同样保证你不会不小心新建重名的环境。如果你确实希望改变一个现有的环境,你可以使用命令 \renewenvironment,它使用和命令 \newenvironment 相同的语法。

1.3 xparse 宏包

通过 \newcommand 和 \newenvironment 定义的命令或环境格式比较固定。如果需要定义带有多个可选参数、或者带星号的命令或环境,可以使用 xparse 宏包。它提供了 \NewDocument-Command 和 \NewDocumentEnvironment 等命令,具体语法如下:

\NewDocumentCommand\⟨name⟩{⟨arg spec⟩}{⟨definition⟩}
\NewDocumentEnvironment{⟨name⟩}{⟨arg spec⟩}{⟨before⟩}{⟨after⟩}

LaTeX 进阶语法_第10张图片

使用示例:

LaTeX 进阶语法_第11张图片

-NoValue- 标记可以用 \IfNoValueTF 等命令来判断:

\IfNoValueTF{⟨argument⟩}{⟨true code⟩}{⟨false code⟩}
\IfNoValueT{⟨argument⟩}{⟨true code⟩}
\IfNoValueF{⟨argument⟩}{⟨false code⟩}

如:

 百分号用于注释掉不必要的空格和换行符
\NewDocumentCommand\hello{om}
{%
\IfNoValueTF{#1}%
{Hello, #2!}%
{Hello, #1 and #2!}%
}
\hello{Alice}
\hello[Bob]{Alice}

\BooleanTrue 和 \BooleanFalse 则可以用 \IfBooleanTF 等命令来判断:

\IfBooleanTF{⟨argument⟩}{⟨true code⟩}{⟨false code⟩}
\IfBooleanT{⟨argument⟩}{⟨true code⟩}
\IfBooleanF{⟨argument⟩}{⟨false code⟩}

如:

\NewDocumentCommand\hereis{sm}
{Here is \IfBooleanTF{#1}{an}{a} #2.}
\hereis{banana}
\hereis*{apple}

LaTeX 进阶语法_第12张图片

2、 编写自己的宏包和文档类

2.1 编写简单的宏包

如果定义了很多新的环境和命令,文档的导言区将变得很长,在这种情况下,可以建立一个新的 LaTeX宏包来存放所有你自己定义的命令和环境,然后在文档中使用 \usepackage 命令来调用自定义的宏包。
写一个宏包的基本工作就是将原本在你的文档导言区里很长的内容拷贝到另一个文件中去,这个文件需要以 .sty 作扩展名。你还需要加入一个宏包专用的命令:\ProvidesPackage{⟨package name⟩}

如:

% 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}}

注意:

  • 这个命令应该放在你的宏包的最前面,并且一定要注意:⟨package name⟩ 需要和宏包的文件名
    一致。 \ProvidesPackage 让 LaTeX 记录宏包的名称,从而在 \usepackage 命令再次调用同一
    个宏包的时候忽略它。
2.2 在宏包中调用其它宏包

如果你想进一步把各种宏包的功能汇总到一个文件里,而不是在文档的导言区罗列一大堆宏包的话,LaTeX 允许你在自己编写的宏包中调用其它宏包,命令为 \RequirePackage,用法和\usepackage 一致:\RequirePackage[⟨options⟩]{⟨package name⟩}

2.3 编写自己的文档类

当你更进一步,需要编写自己的文档类,如论文模板等,问题就稍稍麻烦了一些。首先,自己的文档类以 .cls 作扩展名,开头使用 \ProvidesClass 命令:\ProvidesClass{⟨class name⟩}

注意:

  • {⟨class name⟩} 也需要和文档类的文件名一致。

但是有了上述命令和和你之前学到的 \newcommand 等,还并不能完成一个文档类的编写,因为诸如 \chapter、\section 等等许多常用的命令都是在文档类中定义的。事实上,许多时候我们只需要像调用宏包那样调用一个基本的文档类,省去许多不必要的麻烦。在你的文档类中调用其它文档类的命令是 \LoadClass,用法和 \documentclass 十分相像:\LoadClass[⟨options⟩]{⟨package name⟩}

3、 计数器

3.1 定义和修改计数器

定义一个计数器的方法为:\newcounter{⟨counter name⟩}[⟨parent counter name⟩]

参数:

  • counter name:计数器名称
  • parent counter:计数器可以有上下级关系,可选参数定义上级计数器

以下命令修改计数器的数值,\setcounter 将数值设为 ⟨number⟩;\addtocounter 将数值加上 ⟨number⟩;\stepcounter 将数值加一,并将所有下级计数器归零。

\setcounter{⟨counter name⟩}{⟨number⟩}
\addtocounter{⟨counter name⟩}{⟨number⟩}
\stepcounter{⟨counter name⟩}
3.2 计数器的输出格式

计数器 ⟨counter⟩ 的输出格式由 \the⟨counter⟩ 表示,如 \thechapter等。这个值默认以阿拉伯数字形式输出,如果想改成其它形式,需要重定义 \the⟨counter⟩,如将 equation 计数器的格式定义为大写字母:\renewcommand\theequation{\Alph{equation}}

命令 \Alph 控制计数器 ⟨counter⟩ 的值以大写字母形式显示。下表列出所有可用于修改计数器格式的命令。

注意:这些命令只能用于计数器,不能直接用于数字,如 \roman{1} 这样的命令会出错。

LaTeX 进阶语法_第13张图片

计数器的输出格式还可以利用其它字符,甚至其它计数器的输出格式与之组合。如标准文档类里对 \subsection 相关的计数器的输出格式的定义相当于:\renewcommand\thesubsection{\thesection.\arabic{subsection}}

3.3 LaTeX 中的计数器
  • 所有章节命令 \chapter、\section 等分别对应计数器 chapter、section 等等,而且上下级的关系。而计数器 part 是独立的。
  • 有序列表 enumerate 的各级计数器为 enumi, enumii, enumiii, enumiv,也有上下的关系。
  • 图表浮动体的计数器就是 table 和 figure;公式的计数器为 equation。这些计数器在article 文档类中是独立的,而在 report 和 book 中以 chapter 为上级计数器。
  • 页码、脚注的计数器分别是 page 和 footnote。

我们可以利用前面介绍过的命令,修改计数器的样式以达到想要的效果,比如把页码修改成大写罗马数字,左右加横线,或是给脚注加上方括号:

\renewcommand\thepage{--~\Roman{page}~--}
\renewcommand\thefootnote{[\arabic{footnote}]}

特殊的计数器:

  • secnumdepth:

    secnumdepth 计数器控制章节编号的深度,如果章节的层级大于 secnumdepth,那么章节的标题、在目录和页眉页脚的标题都不编号(照常生成目录和页眉页脚),章节计数器也不计数。

    可以用 \setcounter 命令设置 secnumdepth 为较大的数使得层级比较深的章节也编号,如设置为 4 令 \paragraph 也编号;或者设置一个较小的数以取消编号,如设置为 -1 令 \chapter不编号。后者是生成不编号的章节的一个妙招,免去了手动使用 \addcontentsline 和 \mark-both 的麻烦。

    secnumdepth 计数器在 article 文档类里默认为 3(subsubsection 一级);在 report 和 book文档类里默认为 2(subsection 一级)。

  • tocdepth:

    tocdepth 计数器控制目录的深度,如果章节的层级大于 tocdepth,那么章节将不会自动写入目录项。默认值同 secnumdepth。

4、 LaTeX 可定制的一些命令和参数

LaTeX 进阶语法_第14张图片

LaTeX 进阶语法_第15张图片

四、 盒子

1、 水平盒子

生成水平盒子的命令如下:

\mbox{…}
\makebox[⟨width⟩][⟨align⟩]{…}

\mbox 生成一个基本的水平盒子,内容只有一行,不允许分段(除非嵌套其它盒子,比如后文的垂直盒子)。外表看上去,\mbox 的内容与正常的文本无二,不过断行时文字不会从盒子里断开。

\makebox 更进一步,可以加上可选参数用于控制盒子的宽度 ⟨width⟩,以及内容的对齐方式⟨align⟩,可选居中 c(默认值)、左对齐 l、右对齐 r 和分散对齐 s 。

|\mbox{Test some words.}|\\
|\makebox[10em]{Test some words.}|\\
|\makebox[10em][l]{Test some words.}|\\
|\makebox[10em][r]{Test some words.}|\\
|\makebox[10em][s]{Test some words.}|

2、 带框的水平盒子

\fbox 和 \framebox 让我们可以为水平盒子添加边框。使用的语法与 \mbox 和 \makebox 一模一样:

\fbox{…}
\framebox[⟨width⟩][⟨align⟩]{…}

可以通过 \setlength 命令调节边框的宽度 \fboxrule 和内边距 \fboxsep:

\fbox{Test some words.}\\
\framebox[10em][r]{Test box}\\[1ex]
\setlength{\fboxrule}{1.6pt}
\setlength{\fboxsep}{1em}
\framebox[10em][r]{Test box}

3、 垂直盒子

如果需要排版一个文字可以换行的盒子,LaTeX 提供了两种方式:

\parbox[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}{…}
\begin{minipage}[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}
…
\end{minipage}

其中 ⟨align⟩ 为盒子和周围文字的对齐情况(类似 tabular 环境);⟨height⟩ 和 ⟨inner-align⟩设置盒子的高度和内容的对齐方式,类似水平盒子 \makebox 的设置,不过 ⟨inner-align⟩ 接受的参数是顶部 t、底部 b、居中 c 和分散对齐 s。

三字经:\parbox[t]{3em}%
{人之初 性本善 性相近 习相远}
\quad
千字文:
\begin{minipage}[b][8ex][t]{4em}
天地玄黄 宇宙洪荒
\end{minipage}

如果在 minipage 里使用 \footnote 命令,生成的脚注会出现在盒子底部,编号是独立的,并且使用小写字母编号。这也是 minipage 环境之被称为“迷你页”(Mini-page)的原因。而在\parbox 里无法正常使用 \footnote 命令,只能在盒子里使用 \footnotemark,在盒子外使用\footnotetext。

\fbox{\begin{minipage}{15em}%
这是一个垂直盒子的测试。
\footnote{脚注来自 minipage。}
\end{minipage}}

4、 标尺盒子

\rule 命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺):\rule[⟨raise⟩]{⟨width⟩}{⟨height⟩}

Black \rule{12pt}{4pt} box.
Upper \rule[4pt]{6pt}{8pt} and
lower \rule[-4pt]{6pt}{8pt} box.
A \rule[-.4pt]{3em}{.4pt} line.

你可能感兴趣的:(基础,python,前端,开发语言)