summaryrefslogtreecommitdiff
path: root/info/lshort/chinese/src/chap/chap.03.elements.tex
blob: 4d289d43e3da3e02ddf52f139cbc1470ea7a1c63 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
\chapter{文档元素}\label{chap:elements}
\addtocontents{los}{\protect\addvspace{10pt}}

\begin{intro}
在知道了如何输入文字后,我们将在本章了解一个结构化的文档所依赖的各种元素——章节、目录、列表、图表、交叉引用、脚注等等。
\end{intro}

\section{章节和目录}\label{sec:secs}

\subsection{章节标题}\label{subsec:secs}

\cmdindex{part,chapter,section,subsection,subsubsection,paragraph,subparagraph}
\clsindex{article,book,report}

一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节。三个标准文档类 \cls{article}、\cls{report} 和 \cls{book}%
\footnote{千万注意是\textbf{标准文档类},其它文档类,如果不是从标准文档类衍生而来,
很可能没有定义或只定义了一部分命令,如 \cls{beamer} 或 \cls{moderncv} 等。}%
提供了划分章节的命令:
\begin{command}
\cmd{chapter}\marg{title} \quad
\cmd{section}\marg{title} \quad
\cmd{subsection}\marg{title} \\
\cmd{subsubsection}\marg{title} \quad
\cmd{paragraph}\marg{title} \quad
\cmd{subparagraph}\marg{title}
\end{command}
其中 \cmd{chapter} \textbf{只在 \cls{book} 和 \cls{report} 文档类有定义}。这些命令生成章节标题,并能够自动编号。
除此之外 \LaTeX{} 还提供了 \cmd{part} 命令,用来将整个文档分割为大的分块,但不影响 \cmd{chapter} 或 \cmd{section} 等的编号。

上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容(详见 \ref{sec:pagestyle} 节)。每个命令有两种变体:
\begin{itemize}
  \item 带可选参数的变体:\cmd{section}\oarg{short title}\marg{title}\par
  标题使用 \Arg{title} 参数,在目录和页眉页脚中使用 \Arg{short title} 参数;
  \item 带星号的变体:\cmd{section*}\marg{title}\par
  标题不带编号,也不生成目录项和页眉页脚。
\end{itemize}

较低层次如 \cmd{paragraph} 和 \cmd{subparagraph} 即使不用带星号的变体,生成的标题默认也不带编号,事实上,除 \cmd{part} 外:
\begin{itemize}
  \item \cls{article} 文档类带编号的层级为 \cmd{section} / \cmd{subsection} / \cmd{sub\-sub\-section} 三级;
  \item \cls{report}/\cls{book} 文档类带编号的层级为 \cmd{chapter} / \cmd{section} / \cmd{sub\-section} 三级。
\end{itemize}
对此的详细解释和调整方法见 \ref{subsec:latex-counts} 小节。

\pkgindex{titlesec}
\LaTeX{} 及标准文档类并未提供为 \cmd{section} 等章节命令定制格式的功能,这一功能由 \pkg{titlesec} 宏包提供。详情请参考宏包的帮助文档。

\subsection{目录}\label{sec:toc}

\cmdindex{tableofcontents}
\pkgindex{tocbibind,tocloft,titletoc}
在 \LaTeX{} 中生成目录非常容易,只需在合适的地方使用命令:
\begin{command}
\cmd{tableofcontents}
\end{command}

这个命令会生成单独的一章(\cls{book} / \cls{report})或一节(\cls{article}),标题默认为 ``Contents''{},可通过 \ref{sec:latex-settings} 节给出的方法定制标题。
\cmd{tableof\-contents} 生成的章节默认不写入目录(\cmd{section*} 或 \cmd{chapter*}),可使用 \pkg{tocbibind} 等宏包修改设置。

正确生成目录项,一般需要编译两次源代码。

\cmdindex{addcontentsline}
有时我们使用了 \cmd{chapter*} 或 \cmd{section*} 这样不生成目录项的章节标题命令,
而又想手动生成该章节的目录项,可以在标题命令后面使用:
\begin{command}
\cmd{addcontentsline}\marg*{toc}\marg{level}\marg{title}
\end{command}

其中 \Arg{level} 为章节层次 \texttt{chapter} 或 \texttt{section} 等,\Arg{title} 为出现于目录项的章节标题。

\pkg{titletoc}、\pkg{tocloft} 等宏包提供了具体定制目录项格式的功能,详情请参考宏包的帮助文档。

\subsection{文档结构的划分}\label{sec:matters}

\cmdindex{appendix}
所有标准文档类都提供了一个 \cmd{appendix} 命令将正文和附录分开%
\footnote{有的参考文档可能使用 \cmd{begin} \marg*{appendix} \ldots \cmd{end} \marg*{appendix} 这样的写法,
虽然有效,但并不规范,只要使用 \cmd{appendix} 命令就够了。},
使用 \cmd{appendix} 后,最高一级章节改为使用拉丁字母编号,从 A 开始。

\clsindex{book}
\cmdindex{frontmatter,mainmatter,backmatter}
\cls{book} 文档类还提供了前言、正文、后记结构的划分命令:
\begin{description}
  \item[\cmd{frontmatter}] 前言部分,页码为小写罗马字母格式;其后的 \cmd{chapter} 不编号。
  \item[\cmd{mainmatter}] 正文部分,页码为阿拉伯数字格式,从 1 开始计数;其后的章节编号正常。
  \item[\cmd{backmatter}] 后记部分,页码格式不变,继续正常计数;其后的 \cmd{chapter} 不编号。
\end{description}

\cmdindex{include}
以上三个命令还可和 \cmd{appendix} 命令结合,生成有前言、正文、附录、后记四部分的文档。
源代码 \ref{code:book-struct} 结合 \ref{sec:latex-multi-files} 节的 \cmd{include} 命令
和其它一些命令示意了一份完整的文档结构。

\begin{sourcecode}[htp]
\begin{Verbatim}
\documentclass{book}

% 导言区,加载宏包和各项设置,包括参考文献、索引等
\usepackage{makeidx}        % 调用 makeidx 宏包,用来处理索引
\makeindex                  % 开启索引的收集
\bibliographystyle{plain}   % 指定参考文献样式为 plain

\begin{document}

\frontmatter         % 前言部分
\maketitle           % 标题页
\include{preface}    % 前言章节 preface.tex
\tableofcontents

\mainmatter          % 正文部分
\include{chapter1}   % 第一章 chapter1.tex
\include{chapter2}   % 第二章 chapter2.tex
...
\appendix            % 附录
\include{appendixA}  % 附录 A appendixA.tex
...

\backmatter          % 后记部分
\include{prologue}   % 后记 prologue.tex
\bibliography{books} % 利用 BibTeX 工具从数据库文件 books.bib 生成参考文献
\printindex          % 利用 makeindex 工具生成索引

\end{document}
\end{Verbatim}
\caption{\cls{book} 文档类的文档结构示例。}\label{code:book-struct}
\end{sourcecode}

\section{标题页}\label{sec:titlepage}

\cmdindex{title,author,date,today}
\cmdindex{thanks,and}
\LaTeX{} 支持生成简单的标题页。首先需要给定标题和作者等信息:
\begin{command}
\cmd{title}\marg{title} \quad
\cmd{author}\marg{author} \quad
\cmd{date}\marg{date}
\end{command}
其中前两个命令是必须的(不用 \cmd{title} 会报错;不用 \cmd{author} 会警告),\cmd{date} 命令可选。
\LaTeX{} 还提供了一个 \cmd{today} 命令自动生成当前日期,\cmd{date} 默认使用 \cmd{today}。
在 \cmd{title}、\cmd{author} 等命令内可以使用 \cmd{thanks} 命令生成标题页的脚注,用 \cmd{and} 隔开多个人名。

\cmdindex{maketitle}
\pinyinindex{biaotiye}{标题页}
在信息给定后,就可以使用 \cmd{maketitle} 命令生成一个简单的标题页了。
源代码 \ref{code:titlepage} 给出了一个标题页的示例和大致效果。
\cls{article} 文档类的标题默认不单独成页,而 \cls{report} 和 \cls{book} 默认单独成页。
可在 \cmd{document\-class} 命令调用文档类时指定 \texttt{titlepage / notitlepage} 选项以修改默认的行为。

\begin{sourcecode}[htp]
\begin{Verbatim}
\title{Test title}
\author{ Mary\thanks{E-mail:*****@***.com}
  \and Ted\thanks{Corresponding author}
  \and Louis}
\date{\today}
\end{Verbatim}
\bigskip
\makeatletter
\begin{minipage}{\textwidth}
    \centering
    \renewcommand\thempfootnote{\@fnsymbol\c@mpfootnote}%
    {\LARGE Test title \par}%
    \vskip 1.5em%
    {\large
        \lineskip .5em%
        \begin{tabular}[t]{c}%
            Mary\footnote{E-mail:*****@***.com}
        \end{tabular}
        \hskip 1em \@plus.17fil%
        \begin{tabular}[t]{c}%
            Ted\footnote{Corresponding author}
        \end{tabular}
        \hskip 1em \@plus.17fil%
        \begin{tabular}[t]{c}%
            Louis
        \end{tabular}\par}%
    \vskip 1em%
    {\large \csname CTEX@todayold\endcsname}%
\end{minipage}
\makeatother
\caption{\LaTeX{} 默认的标题页示例和效果。}\label{code:titlepage}
\end{sourcecode}

\envindex{titlepage}
\LaTeX{} 标准类还提供了一个简单的 \env{titlepage} 环境,生成不带页眉页脚的一页。用户可以在这个环境中使用各种排版元素自由发挥,
生成自定义的标题页以替代 \cmd{maketitle} 命令。甚至可以利用 \env{titlepage} 环境重新定义 \cmd{maketitle}:
\begin{verbatim}
\renewcommand{\maketitle}{\begin{titlepage}
... % 用户自定义命令
\end{titlepage}}
\end{verbatim}

事实上,为标准文档类指定了 \texttt{titlepage} 选项以后,使用 \cmd{maketitle} 命令生成的标题页就是一个 \env{titlepage} 环境。

以上是 \LaTeX{} 标准文档类的标题页相关命令用法。在各种文档模板中经常有自定义的标题页,
有可能需要除了 \cmd{title} 和 \cmd{author} 以外的命令给定信息,用法也可能与标准文档类的不一致
(甚至有些模板可能没有定义 \env{titlepage} 等环境)。使用文档模板前\textbf{一定要仔细阅读文档模板的帮助文档}。

\section{交叉引用}\label{sec:crossref}

\cmdindex{label}
交叉引用是 \LaTeX{} 强大的自动排版功能的体现之一。在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用 \cmd{label} 命令:
\begin{command}
\cmd{label}\marg{label-name}
\end{command}

\cmdindex{ref,pageref}
之后可以在别处使用 \cmd{ref} 或 \cmd{pageref} 命令,分别生成交叉引用的编号和页码:
\begin{command}
\cmd{ref}\marg{label-name} \quad
\cmd{pageref}\marg{label-name}
\end{command}
\begin{example}
A reference to this subsection
\label{sec:this} looks like:
``see section~\ref{sec:this} on
page~\pageref{sec:this}.''
\end{example}

为了生成正确的交叉引用,一般也需要多次编译源代码。

\cmd{label} 命令可用于记录各种类型的交叉引用,使用位置分别为:
\begin{description}
  \item[章节标题] 在章节标题命令 \cmd{section} 等之后紧接着使用。
  \item[行间公式] 单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用。
  \item[有序列表] 在 \env{enumerate} 环境的每个 \cmd{item} 命令之后、下一个 \cmd{item} 命令之前任意位置使用。
  \item[图表标题] 在图表标题命令 \cmd{caption} 之后紧接着使用。
  \item[定理环境] 在定理环境内部任意位置使用。
\end{description}

在使用不记编号的命令形式(\cmd{section*}、\cmd{caption*}、带可选参数的 \cmd{item} 命令等)时不要使用 \cmd{label} 命令,
否则生成的引用编号不正确。

\section{脚注和边注}\label{sec:footnote-marginpar}

\cmdindex{footnote}
使用 \cmd{footnote} 命令可以在页面底部生成一个脚注:
\begin{command}
\cmd{footnote}\marg{footnote}
\end{command}

假如我们输入以下文字和命令:
\begin{verbatim}
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote{出自《千字文》。}
\end{verbatim}

在正文中则为:%
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote{出自《千字文》。}

\cmdindex{footnotemark,footnotetext}
有些情况下(比如在表格环境、各种盒子内)使用 \cmd{footnote} 并不能正确生成脚注。我们可以分两步进行,
先使用 \cmd{foot\-note\-mark} 为脚注计数,再在合适的位置用 \cmd{foot\-note\-text} 生成脚注。比如:

\begin{verbatim}
\begin{tabular}{l}
\hline
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\
\hline
\end{tabular}
\footnotetext{表格里的名句出自《千字文》。}
\end{verbatim}

效果为:

\leavevmode\begin{tabular}{l}
\hline
“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\
\hline
\end{tabular}
\footnotetext{表格里的名句出自《千字文》。}

\cmdindex{marginpar}
使用 \cmd{marginpar} 命令可在边栏位置生成边注:
\begin{command}
\cmd{marginpar}\oarg{left-margin}\marg{right-margin}
\end{command}
如果只给定了 \Arg{right-margin},那么边注在奇偶数页文字相同;如果同时给定了 \Arg{left-margin},
则偶数页使用 \Arg{left-margin} 的文字。

例如以下代码:
\begin{verbatim}
\marginpar{\footnotesize 边注较窄,不要写过多文字,最好设置较小的字号。}
\end{verbatim}
其效果见边栏。\marginpar{\footnotesize 边注较窄,不要写过多文字。最好设置较小的字号。}

\section{特殊环境}\label{sec:envs}

\subsection{列表}\label{subsec:lists}

\envindex{enumerate,itemize}
\cmdindex{item}
\LaTeX{} 提供了基本的有序和无序列表环境 \env{enumerate} 和 \env{itemize},两者的用法很类似,都用 \cmd{item} 标明每个列表项。
\env{enumerate} 环境会自动对列表项编号。
\begin{command}
\cmd{begin}\marg*{enumerate} \\
\cmd{item} \ldots \\
\cmd{end}\marg*{enumerate}
\end{command}

其中 \cmd{item} 可带一个可选参数,将有序列表的计数或者无序列表的符号替换成自定义的符号。
列表可以嵌套使用,最多嵌套四层。
\begin{example}
\begin{enumerate}
  \item An item.
  \begin{enumerate}
    \item A nested item.\label{itref}
    \item[*] A starred item.
  \end{enumerate}
  \item Reference(\ref{itref}).
\end{enumerate}
\end{example}

\begin{example}
\begin{itemize}
  \item An item.
  \begin{itemize}
    \item A nested item.
    \item[+] A `plus' item.
    \item Another item.
  \end{itemize}
  \item Go back to upper level.
\end{itemize}
\end{example}

\envindex{description}
关键字环境 \env{description} 的用法与以上两者类似,不同的是 \cmd{item} 后的可选参数用来写关键字,以粗体显示,一般是必填的:
\begin{command}
\cmd{begin}\marg*{description} \\
  \cmd{item}\oarg{item title} \ldots \\
\cmd{end}\marg*{description}
\end{command}

\begin{example}
\begin{description}
  \item[Enumerate] Numbered list.
  \item[Itemize] Non-numbered list.
\end{description}
\end{example}

各级无序列表的符号由命令 \cmd{labelitemi} 到 \cmd{labelitemiv} 定义,可以简单地重新定义它们:
\begin{example}
\renewcommand{\labelitemi}{\ddag}
\renewcommand{\labelitemii}{\dag}
\begin{itemize}
  \item First item
  \begin{itemize}
    \item Subitem
    \item Subitem
  \end{itemize}
  \item Second item
\end{itemize}
\end{example}

有序列表的符号由命令 \cmd{labelenumi} 到 \cmd{labelenumiv} 定义,
重新定义这些命令需要用到 \ref{sec:counters} 节的计数器相关命令:
\begin{example}
\renewcommand{\labelenumi}%
  {\Alph{enumi}>}
\begin{enumerate}
  \item First item
  \item Second item
\end{enumerate}
\end{example}

默认的列表间距比较宽,\LaTeX{} 本身也未提供方便的定制功能,可用 \pkg{enumitem} 宏包定制各种列表间距。
\pkg{enumitem} 宏包还提供了对列表标签、引用等的定制。有兴趣的读者可参考其帮助文档。

\subsection{对齐环境}\label{subsec:flush}

\envindex{center,flushleft,flushright}
\env{center}、\env{flush\-left} 和 \env{flush\-right} 环境分别用于生成居中、左对齐和右对齐的文本环境。
\begin{command}
\cmd{begin}\marg*{center} \ldots\ \cmd{end}\marg*{center} \\
\cmd{begin}\marg*{flushleft} \ldots\ \cmd{end}\marg*{flushleft} \\
\cmd{begin}\marg*{flushright} \ldots\ \cmd{end}\marg*{flushright}
\end{command}

\begin{example}
\begin{center}
Centered text using a
\verb|center| environment.
\end{center}
\begin{flushleft}
Left-aligned text using a
\verb|flushleft| environment.
\end{flushleft}
\begin{flushright}
Right-aligned text using a
\verb|flushright| environment.
\end{flushright}
\end{example}

\cmdindex{centering,raggedleft,raggedright}
除此之外,还可以用以下命令直接改变文字的对齐方式:
\begin{command}
\cmd{centering} \quad
\cmd{raggedright} \quad
\cmd{raggedleft}
\end{command}

\begin{example}
\centering
Centered text paragraph.

\raggedright
Left-aligned text paragraph.

\raggedleft
Right-aligned text paragraph.
\end{example}

三个命令和对应的环境经常被误用,有直接用所谓 \cmd{flushleft} 命令或者 \env{raggedright} 环境的,都是不甚严格的用法(即使它们可能有效)。
有一点可以将两者区分开来:\env{center} 等环境会在上下文产生一个额外间距,而 \cmd{centering} 等命令不产生,只是改变对齐方式。
比如在浮动体环境 \env{table} 或 \env{figure} 内实现居中对齐,用 \cmd{centering} 命令即可,没必要再用 \env{center} 环境。

\subsection{引用环境}\label{subsec:quote}

\envindex{quote,quotation}
\LaTeX{} 提供了两种引用的环境:\env{quote} 用于引用较短的文字,首行不缩进;\env{quotation} 用于引用若干段文字,首行缩进。
引用环境较一般文字有额外的左右缩进。
\begin{example}
Francis Bacon says:
\begin{quote}
Knowledge is power.
\end{quote}
\end{example}

\begin{example}
《木兰诗》:
\begin{quotation}
万里赴戎机,关山度若飞。
朔气传金柝,寒光照铁衣。
将军百战死,壮士十年归。

归来见天子,天子坐明堂。
策勋十二转,赏赐百千强。……
\end{quotation}
\end{example}

\envindex{verse}
\env{verse} 用于排版诗歌,与 \env{quotation} 恰好相反,\env{verse} 是首行悬挂缩进的。
\begin{example}
Rabindranath Tagore's short poem:
\begin{verse}
Beauty is truth's smile
when she beholds her own face in
a perfect mirror.
\end{verse}
\end{example}

\subsection{摘要环境}\label{subsec:abstract}

\envindex{abstract}
摘要环境 \env{abstract} 默认只在标准文档类中的 \cls{article} 和 \cls{report} 文档类可用,
一般用于紧跟 \cmd{maketitle} 命令之后介绍文档的摘要。如果文档类指定了 \texttt{titlepage} 选项,则单独成页;
反之,单栏排版时相当于一个居中的小标题加一个 \env{quotation} 环境,双栏排版时相当于 \cmd{section*} 定义的一节。

\subsection{代码环境}\label{subsec:verbatim}

\envindex{verbatim}
有时我们需要将一段代码原样转义输出,这就要用到代码环境 \env{verbatim},它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;
带星号的版本更进一步将空格显示成“\textvisiblespace”。
\begin{example}
\begin{verbatim}
#include <iostream>
int main()
{
  std::cout << "Hello, world!"
            << std::endl;
  return 0;
}
\end{verbatim}
\end{example}

\begin{example}
\begin{verbatim*}
for (int i=0; i<4; ++i)
  printf("Number %d\n",i);
\end{verbatim*}
\end{example}

\cmdindex{verb}
要排版简短的代码或关键字,可使用 \cmd{verb} 命令:
\begin{command}
\cmd{verb}\Arg{delim}\Arg{code}\Arg{delim}
\end{command}

\Arg{delim} 标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用 \texttt| 符号。

同 \env{verbatim} 环境,\cmd{verb} 后也可以带一个星号,以显示空格:
\begin{example}
\verb|\LaTeX| \\
\verb+(a || b)+ \verb*+(a || b)+
\end{example}

\cmd{verb} 命令对符号的处理比较复杂,一般\textbf{不能用在其它命令的参数里},否则多半会出错。

\pkg{verbatim} 宏包优化了 \env{verbatim} 环境的内部命令,并提供了 \cmd{verbatiminput} 命令用来直接读入文件生成代码环境。
\pkg{fancyvrb} 宏包提供了可定制格式的 \env{Verbatim} 环境;\pkg{listings} 宏包更进一步,可生成关键字高亮的代码环境,
支持各种程序设计语言的语法和关键字。详情请参考各自的帮助文档。

\section{表格}\label{sec:tabular}

\pinyinindex{biaoge}{表格|(}
\LaTeX{} 里排版表格不如 Word 等所见即所得的工具简便和自由,不过对于不太复杂的表格来讲,完全能够胜任。

\envindex{tabular}
\cmdindex{hline}
\index{&@\texttt\& (\textit{单元格/对齐})}
\index{\@\crcmd{} (\textit{换行})}
排版表格最基本的 \env{tabular} 环境用法为:
\begin{command}
\cmd{begin}\marg*{tabular}\oarg{align}\marg{column-spec}\\
 \Arg{item1} \texttt\& \Arg{item2} \texttt\& \ldots\ \crcmd \\
 \cmd{hline} \\
 \Arg{item1} \texttt\& \Arg{item2} \texttt\& \ldots\ \crcmd \\
\cmd{end}\marg*{tabular}
\end{command}
其中 \Arg{column-spec} 是列格式标记,在接下来的内容将仔细介绍;\texttt\& 用来分隔单元格;
\crcmd{} 用来换行;\cmd{hline} 用来在行与行之间绘制横线。

直接使用 \env{tabular} 环境的话,会\textbf{和周围的文字混排}。此时可用一个可选参数 \Arg{align} 控制垂直对齐:
\verb|t| 和 \verb|b| 分别表示按按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐。
\begin{example}
\begin{tabular}{|c|}
  center-\\ aligned \\
\end{tabular},
\begin{tabular}[t]{|c|}
  top-\\ aligned \\
\end{tabular},
\begin{tabular}[b]{|c|}
  bottom-\\ aligned\\
\end{tabular} tabulars.
\end{example}

但是通常情况下 \env{tabular} 环境很少与文字直接混排,而是会放在 \env{table} 浮动体环境中,并用 \cmd{caption} 命令加标题。

\subsection{列格式}\label{subsec:tabular-cols}

\env{tabular} 环境使用 \Arg{column-spec} 参数指定表格的列数以及每列的格式。基本的列格式见表 \ref{tbl:table-column-spec}。
\begin{table}[htp]
\centering
\caption{\LaTeX{} 表格列格式}\label{tbl:table-column-spec}
\begin{tabular}{*{2}{l}}
 \hline
 \textbf{列格式} & \textbf{说明} \\
 \hline
 \ttfamily l/c/r          & 单元格内容左对齐/居中/右对齐,不折行 \\
 \ttfamily p\marg{width}  & 单元格宽度固定为 \Arg{width},可自动折行 \\
 \ttfamily |              & 绘制竖线 \\
 \ttfamily @\marg{string} & 自定义内容 \Arg{string} \\
 \hline
\end{tabular}
\end{table}

\begin{example}
\begin{tabular}{lcr|p{6em}}
  \hline
  left & center & right
       & par box with fixed width\\
  L    & C      & R     & P \\
 \hline
\end{tabular}
\end{example}

表格中每行的单元格数目不能多于列格式里 \texttt{l/c/r/p} 的总数(可以少于这个总数),否则出错。

\texttt{@} 格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距。
\texttt{@} 格式可以适当使用以充当“竖线”。特别地,\texttt{@}\marg*{} 可直接用来消除单元格前后的间距:
\begin{example}
\begin{tabular}{@{} r@{:}lr @{}}
  \hline
  1  & 1 & one \\
  11 & 3 & eleven \\
  \hline
\end{tabular}
\end{example}

另外 \LaTeX{} 还提供了简便的将格式参数重复的写法 \texttt*\marg{n}\marg{column-spec},比如以下两种写法是等效的:
\begin{verbatim}
\begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|}
\begin{tabular}{|*{5}{c|}*{2}{p{4em}|}}
\end{verbatim}

\pkgindex{array}
有时需要为整列修饰格式,比如整列改变为粗体,如果每个单元格都加上 \cmd{bfseries} 命令会比较麻烦。
\pkg{array} 宏包提供了辅助格式 \texttt> 和 \texttt<,用于给列格式前后加上修饰命令:
\begin{example}
\begin{tabular}{>{\itshape}r<{*}l}
  \hline
  italic & normal \\
  column & column \\
  \hline
\end{tabular}
\end{example}

辅助格式甚至支持插入 \cmd{centering} 等命令改变 \texttt{p} 列格式的对齐方式,
一般还要加额外的命令 \cmd{array\-back\-slash} 以免出错%
\footnote{\cmd{centering} 等对齐命令会破坏表格环境里 \crcmd{} 换行命令的定义,
\cmd{array\-back\-slash} 用来恢复之。如果不加 \cmd{array\-back\-slash} 命令,
也可以用 \cmd{tabular\-newline} 命令代替原来的 \crcmd{} 实现表格换行。}:
\begin{example}
\begin{tabular}
{>{\centering\arraybackslash}p{9em}}
  \hline
  Some center-aligned long text. \\
  \hline
\end{tabular}
\end{example}

\pkg{array} 宏包还提供了类似 \texttt{p} 格式的 \texttt{m} 格式和 \texttt{b} 格式,
三者分别在垂直方向上靠顶端对齐、居中以及底端对齐。
\begin{example}
\newcommand\txt
  {a b c d e f g h i}
\begin{tabular}{cp{2em}m{2em}b{2em}}
  \hline
  pos & \txt & \txt & \txt \\
  \hline
\end{tabular}
\end{example}

\subsection{列宽}\label{subsec:colwidth}

在控制列宽方面,\LaTeX{} 表格有着明显的不足:\texttt{l/c/r} 格式的列宽是由文字内容的自然宽度决定的,
而 \texttt{p} 格式给定了列宽却不好控制对齐(可用 \pkg{array} 宏包的辅助格式),
更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易。

\envindex{tabular*}
\LaTeX{} 本身提供了 \env{tabular*} 环境用来排版定宽表格,但是不太方便使用,
比如要用到 \texttt{@} 格式插入额外命令,令单元格之间的间距为 \cmd{fill},但即使这样仍然有瑕疵:
\begin{example}
\begin{tabular*}{14em}%
{@{\extracolsep{\fill}}|c|c|c|c|}
  \hline
  A & B & C & D \\ \hline
  a & b & c & d \\ \hline
\end{tabular*}
\end{example}

\pkgindex{tabularx}
\envindex[tabularx]{tabularx}
\pkg{tabularx} 宏包为我们提供了方便的解决方案。它引入了一个 \texttt{X} 列格式,类似 \texttt{p} 列格式,
不过会根据表格宽度自动计算列宽,多个 \texttt{X} 列格式平均分配列宽。
\texttt{X} 列格式也可以用 \pkg{array} 里的辅助格式修饰对齐方式:
\begin{example}
\begin{tabularx}{14em}%
{|*{4}{>{\centering\arraybackslash}X|}}
  \hline
  A & B & C & D \\ \hline
  a & b & c & d \\ \hline
\end{tabularx}
\end{example}

\subsection{横线}\label{subsec:hline}

\cmdindex{hline,cline}
我们已经在之前的例子见过许多次绘制表格线的 \cmd{hline} 命令。另外 \cmd{cline}\marg*{\Arg{i}-\Arg{j}} 用来绘制跨越部分单元格的横线:
\begin{example}
\begin{tabular}{|c|c|c|}
  \hline
  4 & 9 & 2 \\ \cline{2-3}
  3 & 5 & 7 \\ \cline{1-1}
  8 & 1 & 6 \\ \hline
\end{tabular}
\end{example}

\pkgindex{booktabs}
\cmdindex[booktabs]{toprule,midrule,bottomrule,cmidrule}
在科技论文排版中广泛应用的表格形式是三线表,形式干净简明。
三线表由 \pkg{booktabs} 宏包支持,它提供了 \cmd{toprule}、\cmd{midrule} 和 \cmd{bottomrule} 命令用以排版三线表的三条线,
以及和 \cmd{cline} 对应的 \cmd{cmidrule}。除此之外,最好不要用其它横线以及竖线:
\begin{example}
\begin{tabular}{cccc}
  \toprule
   & \multicolumn{3}{c}{Numbers} \\
  \cmidrule{2-4}
           & 1 & 2 & 3 \\
  \midrule
  Alphabet & A & B & C \\
  Roman    & I & II& III \\
  \bottomrule
\end{tabular}
\end{example}

\subsection{合并单元格}\label{subsec:tabular-multicol}

\LaTeX{} 是一行一行排版表格的,横向合并单元格较为容易,由 \cmd{multi\-column} 命令实现:
\begin{command}
\cmd{multicolumn}\marg{n}\marg{column-spec}\marg{item}
\end{command}
其中 \Arg{n} 为要合并的列数,\Arg{column-spec} 为合并单元格后的列格式,只允许出现一个 \texttt{l/c/r} 或 \texttt{p} 格式。
如果合并前的单元格前后带表格线 \texttt|,合并后的列格式也要带 \texttt| 以使得表格的竖线一致。
\begin{example}
\begin{tabular}{|c|c|c|}
  \hline
  1 & 2 & Center \\ \hline
  \multicolumn{2}{|c|}{3} &
  \multicolumn{1}{r|}{Right} \\ \hline
  4 & \multicolumn{2}{c|}{C} \\ \hline
\end{tabular}
\end{example}

上面的例子还体现了,形如 \cmd{multicolumn}\marg*{1}\marg{column-spec}\marg{item} 的命令\textbf{可以用来修改某一个单元格的列格式。}

\pkgindex{multirow}
\cmdindex[multirow]{multirow}
纵向合并单元格需要用到 \pkg{multirow} 宏包提供的 \cmd{multirow} 命令:
\begin{command}
\cmd{multirow}\marg{n}\marg{width}\marg{item}
\end{command}
\Arg{width} 为合并后单元格的宽度,可以填 \texttt{*} 以使用自然宽度。

我们看一个结合 \cmd{cline}、\cmd{multi\-column} 和 \cmd{multi\-row} 命令的例子:
\begin{example}
\begin{tabular}{ccc}
  \hline
  \multirow{2}{*}{Item} &
    \multicolumn{2}{c}{Value} \\
  \cline{2-3}
    & First & Second \\ \hline
  A & 1     & 2 \\ \hline
\end{tabular}
\end{example}

\subsection{嵌套表格}\label{subsec:tabular-embed}

相对于合并单元格,拆分单元格对于 \LaTeX{} 来说并非易事。在单元格中嵌套一个小表格可以起到“拆分单元格”的效果。
在以下的例子中,注意要用 \cmd{multi\-column} 命令配合 \texttt{@\{\}} 格式把单元格的额外边距去掉,使得嵌套的表格线能和外层的表格线正确相连:

\begin{example}
\begin{tabular}{|c|c|c|}
 \hline
 a & b & c \\ \hline
 a & \multicolumn{1}{@{}c@{}|}
 {\begin{tabular}{c|c}
   e & f \\ \hline
   e & f \\
  \end{tabular}}
       & c \\ \hline
 a & b & c \\ \hline
\end{tabular}
\end{example}

\pkgindex{makecell}
如果不需要为“拆分的单元格”画线,并且只在垂直方向“拆分”的话,\pkg{makecell} 宏包提供的 \cmd{make\-cell} 命令是一个简单的解决方案:

\begin{example}
\begin{tabular}{|c|c|}
 \hline
 a & \makecell{d1 \\ d2} \\
 \hline
 b & c \\
 \hline
\end{tabular}
\end{example}

\subsection{行距控制}\label{subsec:tabular-colht}

\cmdindex{arraystretch}
\LaTeX{} 生成的表格看起来通常比较紧凑。修改参数 \cmd{array\-stretch} 可以得到行距更加宽松的表格
(相关命令参考 \ref{subsec:newcmd} 小节):
\begin{example}
\renewcommand\arraystretch{1.8}
\begin{tabular}{|c|}
  \hline
  Really loose \\ \hline
  tabular rows.\\ \hline
\end{tabular}
\end{example}

\index{\@\crcmd{} (\textit{换行})}
另一种增加间距的办法是给换行命令 \crcmd{} 添加可选参数,在这一行下面加额外的间距,适合用于在行间不加横线的表格:
\begin{example}
\begin{tabular}{c}
  \hline
  Head lines \\[6pt]
  tabular lines \\
  tabular lines \\ \hline
\end{tabular}
\end{example}

但是这种换行方式的存在导致了一个缺陷——\textbf{表格的首个单元格不能直接使用中括号 \texttt{[]}},
否则 \crcmd{} 往往会将下一行的中括号当作自己的可选参数,因而出错。如果要使用中括号,应当放在花括号 \marg*{} 里面。
或者也可以选择将换行命令写成 \crcmd\texttt{[0pt]}。

\pinyinindex{biaoge}{表格|)}

\section{图片}\label{sec:figures}

\pkgindex{graphicx}

\LaTeX{} 本身不支持插图功能,需要由 \pkg{graphicx} 宏包辅助支持。

使用 \texttt{latex + dvipdfmx} 编译命令时,调用 \pkg{graphicx} 宏包时要指定 \texttt{dvipdfmx} 选项%
\footnote{早期常使用 \texttt{latex + dvips} 组合命令,后者将 \texttt{.dvi} 文件转为 \texttt{.ps} 文件(PostScript),
可进一步通过 \texttt{ps2pdf} 工具生成 PDF。\texttt{dvips} 和 \texttt{dvipdfmx} 在图形、颜色、超链接等功能的实现上有差别,而 \LaTeX{} 无法识别
用户是用 \texttt{dvips} 还是 \texttt{dvipdfmx},所以要指定选项(缺省为 \texttt{dvips})。
\ref{sec:hyperlinks} 节中的 \pkg{hyperref} 宏包同理。};而使用 \texttt{pdflatex} 或 \texttt{xelatex} 命令编译时不需要。

读者可能听说过“\LaTeX{} 只能插入 \texttt{.eps} 格式的图片,需要把 \texttt{.jpg} 转成 \texttt{.eps} 格式”的观点。
\LaTeX{} 发展到今天,这个观点早已过时。事实上不同的编译命令支持的图片格式范围各异,见表 \ref{tbl:figure-format}。
这个表格也能解答诸如“为什么 \texttt{.eps} 格式图片在 \texttt{pdflatex} 编译命令下出错”之类的问题。本表格也再一次说明,使用
\texttt{xelatex} 命令是笔者最推荐的方式。

\begin{table}[htp]
\centering
\caption{各种编译方式支持的主流图片格式}\label{tbl:figure-format}
\begin{tabular}{*{3}{l}}
 \hline
 \textbf{格式}  & \textbf{矢量图} & \textbf{位图} \\
 \hline
 \texttt{latex + dvipdfmx}           & \texttt{.eps}      & n/a \\
 \quad $\llcorner$(调用 \pkg{bmpsize} 宏包 )   & \texttt{.eps .pdf}     & \texttt{.jpg .png .bmp} \\[.3\baselineskip]
 \texttt{pdflatex}                   & \texttt{.pdf}      & \texttt{.jpg .png} \\
 \quad $\llcorner$(调用 \pkg{epstopdf} 宏包)   & \texttt{.pdf .eps} & \texttt{.jpg .png} \\[.3\baselineskip]
 \texttt{xelatex}                    & \texttt{.pdf .eps} & \texttt{.jpg .png .bmp} \\
 \hline
\end{tabular}
\begin{quote}\footnotesize
注:在较新的 \TeX{} 发行版中,\texttt{latex + dvipdfmx} 和 \texttt{pdf\-latex} 命令可不依赖宏包,支持原来需要宏包扩展的图片格式
(但 \texttt{pdf\-latex} 命令仍不支持 \texttt{.bmp} 格式的位图)。
\end{quote}
\end{table}

\cmdindex[graphicx]{includegraphics}
在调用了 \pkg{graphicx} 宏包以后,就可以使用 \cmd{include\-graphics} 命令加载图片了:
\begin{command}
\cmd{includegraphics}\oarg{options}\marg{filename}
\end{command}

\cmdindex[graphicx]{graphicspath}
其中 \Arg{filename} 为图片文件名,与 \cmd{include} 命令的用法类似,文件名可能需要用相对路径或绝对路径表示(见 \ref{sec:latex-multi-files} 节)。
图片文件的扩展名一般可不写。另外一定要注意,\textbf{文件名里既不要有空格(类似 \cmd{include}),也不要有多余的英文点号},否则宏包在解析文件名的过程中会出错。

另外 \pkg{graphicx} 宏包还提供了 \cmd{graphics\-path} 命令,用于声明一个或多个图片文件存放的目录,
使用这些目录里的图片时可不用写路径:
\begin{verbatim}
% 假设主要的图片放在 figures 子目录下,标志放在 logo 子目录下
\graphicspath{{figures/}{logo/}}
\end{verbatim}

\cmd{includegraphics} 命令的可选参数 \Arg{options} 支持 \Arg{key}=\Arg{value} 形式赋值,常用的参数如下:
\begin{table}[htp]
\centering
\caption{\cmd{includegraphics} 命令的可选参数}\label{tbl:graphics-options}
\begin{tabular}{lp{18em}}
 \hline
 \textbf{参数} & \textbf{含义} \\
 \hline
 \texttt{width=}\Arg{width}    &  将图片缩放到宽度为 \Arg{width} \\
 \texttt{height=}\Arg{height}  &  将图片缩放到高度为 \Arg{height} \\
 \texttt{scale=}\Arg{scale}    &  将图片相对于原尺寸缩放 \Arg{scale} 倍 \\
 \texttt{angle=}\Arg{angle}    &  令图片逆时针旋转 \Arg{angle} 度 \\
 \hline
\end{tabular}
\end{table}

\section{盒子}\label{sec:box}

盒子是 \LaTeX{} 排版的基础单元,虽然解释上去有些抽象:每一行是一个盒子,
里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布……颇有一些活字印刷术的味道。

不管如何,\LaTeX{} 提供了一些命令让我们生成一些有特定用途的盒子。

\subsection{水平盒子}\label{subsec:mbox}

\cmdindex{mbox,makebox}
生成水平盒子的命令如下:
\begin{command}
\cmd{mbox}\marg*{\ldots} \\
\cmd{makebox}\oarg{width}\oarg{align}\marg*{\ldots}
\end{command}

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

\cmd{makebox} 更进一步,可以加上可选参数用于控制盒子的宽度 \Arg{width},以及内容的对齐方式 \Arg{align},
可选居中 \texttt{c}(默认值)、左对齐 \texttt{l}、右对齐 \texttt{r} 和分散对齐 \texttt{s}%
\footnote{分散对齐方式强行拉开单词的间距,往往会报 \texttt{Underfull} \cmd{hbox} 的消息。}。
\begin{example}
|\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.}|
\end{example}

\subsection{带框的水平盒子}\label{subsec:fbox}

\cmdindex{fbox,framebox}
\cmd{fbox} 和 \cmd{framebox} 让我们可以为水平盒子添加边框。使用的语法与 \cmd{mbox} 和 \cmd{makebox} 一模一样:
\begin{command}
\cmd{fbox}\marg*{\ldots} \\
\cmd{framebox}\oarg{width}\oarg{align}\marg*{\ldots}
\end{command}
\begin{example}
\fbox{Test some words.}\\
\framebox[10em][r]{Test some words.}
\end{example}

\cmdindex{setlength}
\cmdindex{fboxrule,fboxsep}
可以通过 \cmd{setlength} 命令(见 \ref{subsec:lengths} 小节)调节边框的宽度 \cmd{fbox\-rule} 和内边距 \cmd{fbox\-sep}:
\begin{example}
\framebox[10em][r]{Test box}\\[1ex]
\setlength{\fboxrule}{1.6pt}
\setlength{\fboxsep}{1em}
\framebox[10em][r]{Test box}
\end{example}

\subsection{垂直盒子}\label{subsec:parbox}

\cmdindex{parbox}
\envindex{minipage}
如果需要排版一个文字可以换行的盒子,\LaTeX{} 提供了两种方式:
\begin{command}
\cmd{parbox}\oarg{align}\oarg{height}\oarg{inner-align}\marg{width}\marg*{\ldots} \\[0.5ex]
\cmd{begin}\marg*{minipage}\oarg{align}\oarg{height}\oarg{inner-align}\marg{width} \\
\ldots \\
\cmd{end}\marg*{minipage}
\end{command}

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

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

\cmdindex{footnote,footnotetext,footnotemark}
如果在 \env{minipage} 里使用 \cmd{footnote} 命令,生成的脚注会出现在盒子底部,编号是独立的,并且使用小写字母编号。
这也是 \env{minipage} 环境之被称为“迷你页”(Mini-page)的原因。
而在 \cmd{parbox} 里无法正常使用 \cmd{footnote} 命令,只能在盒子里使用 \cmd{foot\-note\-mark},在盒子外使用 \cmd{foot\-note\-text}。
\begin{example}
\fbox{\begin{minipage}{15em}%
  这是一个垂直盒子的测试。
  \footnote{脚注来自 minipage。}
\end{minipage}}
\end{example}

\subsection{标尺盒子}\label{subsec:rules}

\cmdindex{rule}
\cmd{rule} 命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺):
\begin{command}
\cmd{rule}\oarg{raise}\marg{width}\marg{height}
\end{command}
\begin{example}
Black \rule{12pt}{4pt} box.

Upper \rule[4pt]{6pt}{8pt} and
lower \rule[-4pt]{6pt}{8pt} box.

A \rule[-.4pt]{3em}{.4pt} line.
\end{example}

\section{浮动体}\label{sec:float}

内容丰富的文章或者书籍往往包含许多图片和表格等内容。这些内容的尺寸往往太大,导致分页困难。
\LaTeX{} 为此引入了浮动体的机制,令大块的内容可以脱离上下文,放置在合适的位置。

\envindex{figure,table}
\LaTeX{} 预定义了两类浮动体环境 \env{figure} 和 \env{table}。习惯上 \env{figure} 里放图片,\env{table} 里放表格,
但并没有严格限制,可以在任何一个浮动体里放置文字、公式、表格、图片等等任意内容。

以 \env{table} 环境的用法举例,\env{figure} 同理:
\begin{command}
\cmd{begin}\marg*{table}\oarg{placement} \\
\ldots \\
\cmd{end}\marg*{table}
\end{command}

\Arg{placement} 参数提供了一些符号用来表示浮动体允许排版的位置,如 \texttt{hbp} 允许浮动体排版在当前位置、底部或者单独成页。
\env{table} 和 \env{figure} 浮动体的默认设置为 \texttt{tbp}。
\begin{table}[htp]
\centering
\caption{浮动体的位置参数}\label{tbl:float-placement}
\begin{tabular}{*{2}{l}}
 \hline
 \textbf{参数} & \textbf{含义} \\
 \hline
 \texttt{h} & 当前位置(代码所处的上下文) \\
 \texttt{t} & 顶部 \\
 \texttt{b} & 底部 \\
 \texttt{p} & 单独成页 \\
 \texttt{!} & 在决定位置时忽视限制 \\
 \hline
\end{tabular}
\begin{quote}\footnotesize
注 1:排版位置的选取与参数里符号的顺序无关,\LaTeX{} 总是以 \texttt{h-t-b-p} 的优先级顺序决定浮动体位置。
也就是说 \texttt{[!htp]} 和 \texttt{[ph!t]} 没有区别。\par
注 2:限制包括浮动体个数(除单独成页外,默认每页不超过 3 个浮动体,其中顶部不超过 2 个,底部不超过 1 个)
以及浮动体空间占页面的百分比(默认顶部不超过 70\%,底部不超过 30\%)。
\end{quote}
\end{table}

\envindex{table*,figure*}
双栏排版环境下,\LaTeX{} 提供了 \env{table*} 和 \env{figure*} 环境用来排版跨栏的浮动体。
它们的用法与 \env{table} 和 \env{figure} 一样,不同之处为双栏的 \Arg{placement} 参数只能用 \texttt{tp} 两个位置。

\cmdindex{clearpage}
浮动体的位置选取受到先后顺序的限制。如果某个浮动体由于参数限制、空间限制等原因在当前页无法放置,就要推迟到之后处理,
并使得之后的同类浮动体一并推迟。\cmd{clearpage} 命令会在另起一页之前,先将所有推迟处理的浮动体排版成页,
此时 \texttt{htbp} 等位置限制被完全忽略。

\pkgindex{float}

\pkg{float} 宏包为浮动体提供了 \texttt{H} 位置参数,不与 \texttt{htbp} 及 \texttt{!} 混用。使用 \texttt{H} 位置参数时,
会取消浮动机制,将浮动体视为一般的盒子插入当前位置。这在一些特殊情况下很有用(如使用 \pkg{multicol} 宏包排版分栏内容的时候),
但尺寸过大的浮动体可能使得分页比较困难。

\subsection{浮动体的标题}\label{subsec:caption}

\cmdindex{caption,label}
图表等浮动体提供了 \cmd{caption} 命令加标题,并且自动给浮动体编号:
\begin{command}
\cmd{caption}\marg*{\ldots}
\end{command}
\cmd{caption} 的用法非常类似于 \cmd{section} 等命令,可以用带星号的命令 \cmd{caption*} 生成不带编号的标题,
也可以使用带可选参数的形式 \cmd{caption}\oarg*{\ldots}\marg*{\ldots},使得在目录里使用短标题。
\cmd{caption} 命令之后还可以紧跟 \cmd{label} 命令标记交叉引用。

\pkgindex{caption}
\cmd{caption} 生成的标题形如 ``Figure 1: \ldots''{}(\env{figure} 环境)或 ``Table 1: \ldots''{}(\env{table} 环境)。
可通过修改 \cmd{figurename} 和 \cmd{tablename} 的内容来修改标题的前缀(详见第 \ref{sec:latex-settings} 节)。
标题样式的定制功能由 \pkg{caption} 宏包提供,详见该宏包的帮助文档,在此不作赘述。

\cmdindex{listoftables,listoffigures}
\env{table} 和 \env{figure} 两种浮动体分别有各自的生成目录的命令:
\begin{command}
\cmd{listoftables} \\
\cmd{listoffigures}
\end{command}

它们类似 \cmd{tableofcontents} 生成单独的章节。

\subsection{并排和子图表}\label{subsec:subfig}

我们时常有在一个浮动体里面放置多张图的用法。最简单的用法就是直接并排放置,
也可以通过分段或者换行命令 \crcmd{} 排版多行多列的图片。以下为示意代码,效果大致如图 \ref{fig:parallel-fig} 所示。
\begin{verbatim}
\begin{figure}[htbp]
  \centering
  \includegraphics[width=...]{...}
  \qquad
  \includegraphics[width=...]{...} \\[..pt]
  \includegraphics[width=...]{...}
  \caption{...}
\end{figure}
\end{verbatim}

\begin{figure}[htp]
  \centering
  \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 10ex\hfil}}
  \qquad
  \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}}
  \par\bigskip
  \fcolorbox[gray]{0}{0.96}{\parbox{20em}{\vrule width 0pt height 12ex\hfil}}
  \caption{并排放置图片的示意。}\label{fig:parallel-fig}
\end{figure}

由于标题是横跨一行的,用 \cmd{caption} 命令为每个图片单独生成标题就需要借助前文提到的 \cmd{parbox}
或者 \env{minipage} 环境,将标题限制在盒子内。效果见图 \ref{fig:parallel-cap1} 和图 \ref{fig:parallel-cap2}。
\begin{verbatim}
\begin{figure}[htbp]
  \centering
  \begin{minipage}{...}
    \centering
    \includegraphics[width=...]{...}
    \caption{...}
  \end{minipage}
  \qquad
  \begin{minipage}{...}
    \centering
    \includegraphics[width=...]{...}
    \caption{...}
  \end{minipage}
\end{figure}
\end{verbatim}

\begin{figure}[htp]
  \centering
  \begin{minipage}{12em}
    \centering
    \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}}
    \caption{并排图1。}\label{fig:parallel-cap1}
  \end{minipage}
  \qquad
  \begin{minipage}{12em}
    \centering
    \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}}
    \caption{并排图2。}\label{fig:parallel-cap2}
  \end{minipage}
\end{figure}

\pkgindex{subfig}
\cmdindex[subfig]{subfloat}
当我们需要更进一步,给每个图片定义小标题时,就要用到 \pkg{subfig} 宏包的功能了。
这里仅举一例,效果见图 \ref{fig:subfig}。更详细的用法请参考 \pkg{subfig} 宏包的帮助文档。
\begin{verbatim}
\begin{figure}[htbp]
  \centering
  \subfloat[...]{\label{sub-fig-1}% 为子图加交叉引用
   \begin{minipage}{...}
    \centering
    \includegraphics[width=...]{...}
   \end{minipage}
  }
  \qquad
  \subfloat[...]{%
  \begin{minipage}{...}
    \centering
    \includegraphics[width=...]{...}
  \end{minipage}
  }
  \caption{...}
\end{figure}
\end{verbatim}

\begin{figure}[htp]
  \centering
  \subfloat[并排子图1]{%
  \begin{minipage}{12em}
    \centering
    \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}}
  \end{minipage}}
  \qquad
  \subfloat[并排子图2]{%
  \begin{minipage}{12em}
    \centering
    \fcolorbox[gray]{0}{0.96}{\parbox{10em}{\vrule width 0pt height 12ex\hfil}}
  \end{minipage}}
  \caption{使用 \pkg{subfig} 宏包的 \cmd{subfloat} 命令排版子图。}\label{fig:subfig}
\end{figure}

\endinput