summaryrefslogtreecommitdiff
path: root/info/latex-notes-zh-cn/src/basics.tex
blob: 29367ddcbca361c997a81e18611ad57f17da44af (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
\chapter{入门}

\section{Hello, World!}
\label{sec:hello_world}
把下面例子用编辑器保存为~\verb|hello_world.tex|,这就是一个最简单的~\LaTeX~源文件。

\begin{code}
%hello_world.tex
\documentclass{article}
\begin{document}
    Hello, World!
\end{document}
\end{code}

有了源文件,我们可以在命令行把它编译成~DVI~文件(DVI~格式见\ref{sec:dvi}小节)。此命令知道输入的是~\LaTeX~源文件,所以这里的~\verb|.tex|~后缀可以省略。以后的示例中可以省略的后缀都用~\verb|()|~标出,不再特别声明。
\begin{code}
latex hello_world(.tex)
\end{code}

如果系统显示类似下面的错误信息,请检查源文件是否有拼写错误。\verb|.log|~文件里有更详细的编译信息。
\begin{code}
! LaTeX Error:
...
! Emergency stop.
...
No pages of output.
Transcript written on hello_world.log.
\end{code}

如果编译成功,系统会报出类似下面的信息:
\begin{code}
Output written on hello_world.dvi (1 page, 232 bytes).
Transcript written on hello_world.log.
\end{code}

每种~\LaTeX~发行包附带不同的~DVI~浏览器,比如~MiKTeX~的是~yap。
\begin{code}
yap hello_world(.dvi)
\end{code}

\section{格式及其转换}
\subsection{页面描述语言}
\label{sec:pdl}
页面描述语言(Page Description Language,PDL)是一种在较高层次上描述实际输出结果的语言。本文只讨论其中三种与~\LaTeX~紧密相关的格式:DVI、PostScript、PDF。

\subsubsection{PostScript}
最早的打印机只用于打印字符,它使用的硬字符与打字机类似。后来出现的点阵(dot matrix)打字机用一系列的点来“画”出字符,当然它也可以画出图形。当时矢量图的打印只能由绘图仪(plotter)来完成。

1976~年,施乐(Xerox)推出了首台激光打印机,它结合了点阵打印机和绘图仪的优点,可以同时打印高质量的图形和文字。

同一时期,John Warnock~也在酝酿一种类似于~Forth~的图形设计语言,也就是后来的~PostScript(PS),当时他正在旧金山一家电脑图形公司~Evans \& Sutherland~工作。1978~年老板想让~Warnock~搬到位于犹他州的总部,他不想搬家就跳槽到了施乐。

Warnock~和~Martin Newell~开发了新的图形系统~JaM(John and Martin),它后来被合并到施乐的打印机驱动程序~InterPress~中去。这两位还开发过另一个系统~MaJ。

1982~年,Warnock~和施乐研究中心图形实验室主任~Chuck Geschke~一起离开施乐,成立了~Adobe~公司。Newell~后来也加入了~Adobe。

1984~年~Adobe~发布~PS~后不久,Steve Jobs~跑来参观,并建议用它来驱动激光打印机。次年,武装着~PS~驱动的~Apple LaserWriter~横空出世,打响了~80~年代中期桌面出版革命的第一枪。

90~年代中后期,廉价喷墨打印机的流行使得~PS~逐渐式微,因为~PS~驱动对它们毕竟是一个成本负担。

\subsubsection{PDF}
1993~年,Adobe~推出了一种开放的格式:Portable Document Format(PDF),它于~2007~年成为~ISO 32000~标准。除了开放,PDF~比起~PS~还有一些其它优势:
\begin{itemize}
    \item PDF~基本上是~PS~的一个子集,因此更轻便。
    \item PDF~可以嵌入更先进的字体,具体见\ref{sec:font}节。
    \item PDF~支持嵌入乱七八糟的东东,比如动画。
    \item PDF~支持透明图形。
\end{itemize}

PDF~虽然拥有上述优势,起初它的推广却并不顺利,因为其读写工具~Acrobat~太贵。Adobe~很快推出了免费的~Acrobat Reader(后更名为~Adobe Reader),并不断改进~PDF,终于使它超越了曾经的事实标准~PS,成为网络时代电子文档的新标准。

\subsubsection{DVI}
\label{sec:dvi}
Knuth~最初设计的~\TeX~只能用于~XGP~打印机,这台打印机本身还需要一台~PDP-6~主机为它服务。1979~年,David Fuchs\footnote{Fuchs~本科毕业于普林斯顿,1978~年进入斯坦福攻读博士学位。他不是~Knuth~的学生,但是完成过一些~\TeX~的开发任务。他在~Adobe~工作过一段时间,现在混入了娱乐圈,担任过电影《Red Diaper Baby》和《Haiku Tunnel》的制片人。}提出把~\TeX~的输出改为设备无关的格式,也就是~Device Independent format(DVI)。

DVI~只是一种中间格式,用户还需要另外的处理程序(driver)把它转换为其它格式,比如~PS~或~PDF~,甚至~PNG、SVG~等。DVI~不能嵌入字体和图形,PS~和~PDF~可以选择是否嵌入字体。

\subsubsection{Ghostscript}
\label{sec:ghostscript}
PS~输出时需要一个解释器(Raster Image Processor,RIP)来把它转换为点阵图形。RIP~可以是软件,也可以是固件(firmware)或硬件\footnote{固件~RIP~在打印机内置处理器上运行,硬件~RIP~常见于高端打印设备。}。

Ghostscript~是一个基于~RIP~的软件包,除了~RIP~它还有一些其它功能,比如处理~EPS,把~PS~转换为~PDF~等。Ghostscript~已经被移植到~Windows、Unix/Linux、Mac OS~等多种操作系统,和它匹配的前端图形用户界面(GUI)有\href{http://pages.cs.wisc.edu/~ghost/}{GSview、Ghostview、gv}等。

\subsection{格式转换}
\label{sec:convert_format}
DVI、PS、PDF~等格式的的转换关系如\Fref{fig:convert_format}所示。

\begin{figure}[htbp]
\centering
\begin{tikzpicture}
    \node[box] (tex) {.tex};
    \node[box] (dvi) [right=5 of tex] {.dvi};
    \node[box] (pdf) [right=6 of dvi] {.pdf};
    \node[box] (ps) [above=3 of pdf] {.ps};
    \path (tex) edge [arrow] node[auto] {latex} (dvi)
        (dvi) edge [arrow] node[auto] {dvipdfm} (pdf)
        (dvi.north) [arrow,draw] to node[above,sloped] {dvips} (ps.west)
        (ps) edge [arrow] node[right] {ps2pdf} (pdf)
        (tex) edge [arrow,bloop] (pdf);
    \node [below=.7 of dvi] {pdflatex};
\end{tikzpicture}
\caption{格式转换}
\label{fig:convert_format}
\end{figure}

最早的~driver~是~\verb|dvips|,它把~DVI~转换为~PS。\verb|dvipdf|~把~DVI~转为~PDF,它后来被~\verb|dvipdfm|~所取代;\verb|dvipdfm|~主要用于处理单字节字符,1999~年之后停止开发;在~\verb|dvipdfm|~基础上发展来的~\verb|dvipdfmx|~可以处理多字节编码(字符编码详见\ref{sec:encoding}节)。

pdf\TeX~是一种特殊的driver,它跳过~DVI,直接用~\TeX~源文件生成~PDF。基于~pdf\TeX~的~pdf\LaTeX~则把\LaTeX~源文件转为~PDF。

包老师倾向于~\verb|dvipdfmx|,因为它对图形格式的兼容性较好,而且擅长处理中文。

得到~DVI~后,我们可以在控制台用以下命令把它转为~PDF。
\begin{code}
dvipdfm hello_world(.dvi)
\end{code}

我们也可以把它转为~PS,接着用~Ghostscript~的一个命令行程序把它转换为~PDF,注意第二个命令需要~\verb|.ps|~后缀。一般情况下不推荐这种方法,因为它多了个步骤。
\begin{code}
dvips hello_world(.dvi)
ps2pdf hello_world.ps
\end{code}

pdf\LaTeX~用法如下。
\begin{code}
pdflatex hello_world(.tex)
\end{code}

\section{\LaTeX~语句}
\LaTeX~源文件的每一行称作一条语句(statement),语句可以分三种:命令(command)、数据(data)和注释(comment)。

命令分为两种:普通命令和环境(environment)。普通命令以\verb|\|~起始,大多只有一行;而环境包含一对起始声明和结尾声明,用于多行的场合。命令和环境可以互相嵌套。

数据就是普通内容。注释语句以~\verb|%|~起始,它在编译过程中被忽略。

例如在\ref{sec:hello_world}节例1中,第一行是注释,第二行是普通命令;第三、五行是环境的起始和结尾声明;第四行是数据。

\section{文档结构}
\subsection{文档类、序言、正文}
\LaTeX~源文件的结构分三大部分,依次为:文档类声明、序言(可选)、正文。

文档类声明用来指定文档的类型;序言(preamble)用来完成一些特殊任务,比如引入宏包,定义命令,设置环境等;文档的实际内容则放在正文部分。这里的正文指得是\verb|\begin{document}|和\verb|\end|~\verb|{document}|之间的部分,和通常人们心目中的“正文”概念有所出入。

这三部分的基本语法如下:
\begin{code}
\documentclass[options]{class}  %文档类声明
\usepackage[options]{package}   %引入宏包
...
\begin{document}                %正文
...
\end{document}
\end{code}

常用的文档类(documentclass)有三种:\verb|article、report、book|,它们的常用选项见\fref{tab:class_options}。

\begin{table}[htbp]
\centering
\caption{文档类常用选项}
\label{tab:class_options}
\begin{tabularx}{350pt}{lX}
    \toprule
    10pt, 11pt, 12pt & 正文字号,缺省10pt。\LaTeX~会根据正文字号选择标题、上下标等的字号。\\
    letterpaper, a4paper & 纸张尺寸,缺省是~letter。\\
    notitlepage, titlepage & 标题后是否另起新页。article~缺省~notitlepage,report~和~book~缺省有~titlepage。\\
    onecolumn, twocolumn & 栏数,缺省单栏。\\
    oneside, twoside & 单面双面。article~和~report~缺省单面,book~缺省双面。\\
    landscape & 打印方向横向,缺省纵向。\\
    openany, openright & 此选项只用于~report~和~book。report~缺省~openany~,book~缺省~openright。\\
    draft & 草稿模式。有时某些行排得过满,draft~模式可以在它们右边标上粗黑线提醒用户。\\
    \bottomrule
\end{tabularx}
\end{table}

\LaTeX~的核心只提供基本的功能,系统以宏包(package)的形式提供附加功能或增强原有功能。其它一些编程语言也有类似的模块化机制,比如~C/C++~的~\verb|#include|,Java~的~\verb|import|。

\subsection{标题、摘要、章节}


一份文档正文部分的开头通常有标题、作者、摘要等信息,之后是章节等层次结构,内容则散布于层次结构之间。

标题、作者、日期等命令如下,注意\verb|\maketitle|~命令要放在最后。
\begin{code}
\title{标题}
\author{作者}
\today
\maketitle
\end{code}

摘要环境用法如下:
\begin{code}
\begin{abstract}
...
\end{abstract}
\end{code}

常用的层次结构命令如下,
\begin{code}
\chapter{...}
\section{...}
\subsection{...}
\subsubsection{...}
\end{code}

每个高级层次可以包含若干低级层次。\verb|article|~中没有~\verb|chapter|,而~\verb|report|~和~\verb|book|~则支持上面所有层次。

\subsection{目录}

我们可以用~\verb|\tableofcontents|~命令来生成整个文档的目录,\LaTeX~会自动设定目录包含的章节层次,也可以用~\verb|\setcounter|~命令来指定目录层次深度。
\begin{code}
\tableofcontents
\setcounter{tocdepth}{2}
\end{code}

如果不想让某个章节标题出现在目录中,可以使用以下带~\verb|*|~的命令来声明章节。
\begin{code}
\chapter*{...}
\section*{...}
\subsection*{...}
\end{code}

类似地,我们也可以用以下命令生成插图和表格的目录,插图和表格功能将在后面章节中介绍。

\begin{code}
\listoffigures
\listoftables
\end{code}

当章节或图表等结构发生变化时,我们需要执行两遍编译命令以获得正确结果。\LaTeX~之所以设计成这样可能是因为当时的电脑内存容量有限。

\section{文字排版}
\subsection{字符输入}
文档中可以输入的内容大致可以分为:普通字符、控制符、特殊符号、注音符号、预定义字符串等。而这些内容有两种输入模式:文本模式(缺省)和数学模式,普通的行间(inline)数学模式用\verb|\$...\$|来表示。

\LaTeX~中有些字符(例如~\verb|# $ % ^ & _ { } ~ \|~等)被用作特殊的控制符,所以不能直接输入,多数需要在前面加个~\verb|\|。而~\verb|\|~本身则要用~\verb|\textbackslash|~命令来输入,因为~\verb|\\|~被用作了换行指令。很奇怪为什么不用~C~语言的~\verb|\n|,也许是因为~\TeX~的编程语言是~Pascal。

\begin{code}
\# \$ \% \^{} \& \_ \{ \} \~{} \textbackslash
\end{code}

\Fref{tab:symbol}~提供了一些符号的输入方法示例,完整的符号列表见~Scott Pakin的《The Comprehensive \LaTeX~ Symbol List》\citep{Pakin_2008}。

\begin{table}[htbp]
\centering
\caption{一些符号和预定义字符串}
\label{tab:symbol}
\begin{tabular}{llllll}
    \toprule
    \multicolumn{2}{c}{特殊符号} & \multicolumn{2}{c}{注音符号} & 
    \multicolumn{2}{c}{预定义字符串} \\
    \cmidrule(lr){1-2} \cmidrule(lr){3-4} \cmidrule(lr){5-6}
    \textcopyright  & \verb|\textcopyright|  & \aa & \verb|\aa| & 
        \today & \verb|\today| \\
    \textregistered & \verb|\textregistered| & \AA & \verb|\AA| & 
        \TeX & \verb|\TeX| \\
    $^\circ$C       & \verb|$^\circ$C|       & \ae & \verb|\ae| & 
        \LaTeX & \verb|\LaTeX| \\
    \textyen        & \verb|\textyen|        & \o  & \verb|\o| &
        \LaTeXe & \verb|\LaTeXe| \\
    \pounds         & \verb|\pounds|         & \"o & \verb|\"o| &
        \MF & \verb|\MF| \\
    \texteuro       & \verb|\texteuro|       & \^o & \verb|\^o| &
        \MP & \verb|\MP| \\
    \dots           & \verb|\dots|           & \~o & \verb|\~o| & \\
    \bottomrule
\end{tabular}
\end{table}

\subsection{换行、换页、断字}
通常~\LaTeX~会自动换行、换页。用户也可以用~\verb|\\|~或~\verb|\newline|~来强制换行;用~\verb|\newpage|~来强制换页。

一般情况下~\LaTeX~会尽量均匀地断字(Hyphenate),使得每一行的字间距分布整齐。但有时我们也需要显式指明断字位置,比如下例就指明~BASIC~这个词不能断开,而~blar-blar-blar~可以在-处断开。
\begin{code}
\hyphenation{BASIC blar-blar-blar}
\end{code}

\subsection{字样、字号}

\LaTeX~会自动调整正文、标题、章节、上下标、脚注等的字样\footnote{关于字样详见\ref{sec:typeface}节}、字号。我们也可以用\fref{tab:typeface_command}中的命令来设置字样;用\fref{tab:fontsize_command}中的命令来设置相对字号,比如正文字号是~10pt、11pt、12pt~时,tiny的字号就分别是~5pt、6pt、6pt。

\LaTeX~有一个特别的字样强调命令:\verb|\emph|,它在不同字样和装饰环境下有不同效果。比如周围文字是正体,它就是斜体;反之它就是正体。

\begin{table}[hbtp]
\centering
\caption{字样命令}
\label{tab:typeface_command}
\begin{tabular}{llll}
    \toprule
    \verb|\textrm{...}| & \textrm{roman} & 
    \verb|\textbf{...}| & \textbf{bold face} \\
    \verb|\textsf{...}| & \textsf{sans serif} & 
    \verb|\textit{...}| & \textit{italic} \\
    \verb|\texttt{...}| & \texttt{typewriter} & 
    \verb|\textsl{...}| & \textsl{slanted} \\
    \\
    \verb|\emph{...}|   & \emph{emphasized} & 
    \verb|\underline{...}|  & \underline{underline} \\
    \verb|\textsc{...}| & \textsc{Small Caps} & & \\
    \bottomrule
\end{tabular}
\end{table}

\begin{table}[htbp]
\centering
\caption{字号命令}
\label{tab:fontsize_command}
\begin{tabular}{llll}
    \toprule
    & \multicolumn{3}{c}{正文字号} \\
    \cmidrule(lr){2-4}
    命令 & 10pt & 11pt & 12pt \\
    \midrule
    \verb|\tiny|         & 5pt  & 6pt  & 6pt \\
    \verb|\scriptsize|   & 7pt  & 8pt  & 8pt \\
    \verb|\footnotesize| & 8pt  & 9pt  & 10pt \\
    \verb|\small|        & 9pt  & 10pt & 11pt \\
    \verb|\normalsize|   & 10pt & 11pt & 12pt \\
    \verb|\large|        & 12pt & 12pt & 14pt \\
    \verb|\Large|        & 14pt & 14pt & 17pt \\
    \verb|\LARGE|        & 17pt & 17pt & 20pt \\
    \verb|\huge|         & 20pt & 20pt & 25pt \\
    \verb|\Huge|         & 25pt & 25pt & 25pt \\
    \bottomrule
\end{tabular}
\end{table}

\section{常用命令环境}
\subsection{列表}

\LaTeX~中有三种列表环境:\verb|itemize、enumerate、description|,它们的一般用法如下:

\begin{demo}
\begin{itemize}
    \item C++
    \item Java
    \item HTML
\end{itemize}
\end{demo}

\begin{demo}
\begin{enumerate}
    \item C++
    \item Java
    \item HTML
\end{enumerate}
\end{demo}

\begin{demo}
\begin{description}
    \item{C++} 一种编程语言
    \item{Java} 另一种编程语言
    \item{HTML} 一种标记语言
\end{description}
\end{demo}

\subsection{对齐}
\LaTeX~中的段落缺省两端对齐(fully justified),我们也可以让段落居左、居右或居中对齐。

\begin{demo}
\begin{flushleft}
本段落\\
居左
\end{flushleft}
\end{demo}

\begin{demo}
\begin{flushright}
本段落\\
居右
\end{flushright}
\end{demo}

\begin{demo}
\begin{center}
本段落\\
居中
\end{center}
\end{demo}

\subsection{摘录}
\LaTeX~中有三种摘录环境:\verb|quote、quotation、verse|。\verb|quote|~两端都缩进,\verb|quotation|~在~\verb|quote|~的基础上增加了首行缩进,\verb|verse|~比~\verb|quote|~多了第二行起的缩进。

\begin{demo}
正文
\begin{quote}
引文两端都缩进。
\end{quote}
正文
\end{demo}

\begin{demo}
正文
\begin{quotation}
引文两端缩进,首行缩进。
\end{quotation}
正文
\end{demo}

\begin{demo}
正文
\begin{verse}
引文两端缩进,第二行起缩进。
\end{verse}
正文
\end{demo}

\subsection{原文照排}
一般文档中,命令和源代码通常使用等宽字样来表示,也就是原文照排。对此~\LaTeX~提供了~\verb|\verb|~命令(一般用于在正文中插入较短的命令)和~\verb|verbatim|~环境。后者有带~\verb|*|~的版本用来标明空格。

\begin{demo}
正文中插入\verb|command|
\begin{verbatim}
printf("Hello, world!");
\end{verbatim}
\begin{verbatim*}
printf("Hello, world!");
\end{verbatim*}
\end{demo}

\subsection{交叉引用}
我们常常需要引用文档中~\verb|section、subsection、figure、table|~等对象的编号,这种功能叫作交叉引用(cross referencing)。

\LaTeX~中可以用~\verb|\label{marker}|~命令来定义一个标记,标记名可以是任意字符串,但是在全文中须保持唯一。之后可以用~\verb|\ref{marker}|~命令来引用标记处章节或图表的编号,用~\verb|\pageref{marker}|~来引用标记处的页码。

\begin{demo}
被引用处\label{sec}\\
...\\
第\pageref{sec}页\ref{sec}节
\end{demo}

文档中新增交叉引用后,第一次执行~\verb|latex|~或~\verb|pdflatex|~编译命令时会得到类似下面的警告信息。因为第一次编译只会扫描出有交叉引用的地方,第二次编译才能得到正确结果。

\begin{code}
LaTeX Warning: There were undefined references.
...
LaTeX Warning: Label(s) may have changed. Rerun to get cross-
references right.
\end{code}

\subsection{脚注}
脚注(footnote)的一般用法如下:
\begin{demo}
这里是一段正文。\footnote{这里是一段脚注。}
\end{demo}

\section{长度单位}
\LaTeX~中的常用长度单位如\Fref{tab:unit}~所示。point~是个传统印刷业采用的单位,而~big point~是~Adobe~推出~PS~时新定义的单位。em~是个相对单位,比如当前字体是~11pt~时,1em~就是~11pt。
\begin{table}[htbp]
\caption{常用长度单位}
\label{tab:unit}
\centering
\begin{tabular}{llllll}
    \toprule
    in & 英寸 & pt & point, 1/72.27 in  & em & 当前字体中字母M的宽度 \\
    cm & 厘米 & bp & big point, 1/72 in & ex & 当前字体中字母x的高度 \\
    mm & 毫米 & pc & pica, 12 pt        & mu & math unit,1/18 em \\
    \bottomrule
\end{tabular}
\end{table}

\section{盒子}
\LaTeX~在排版时把每个对象(小到一个字母,大到一个段落)都视为一个矩形盒子(box),我们在~HTML~和~CSS~中也可以见到类似的模型。

\subsection{mbox~和~fbox}

\LaTeX~中最简单的盒子是~\verb|\mbox|~和~\verb|\fbox|。前者把一组对象组合起来,后者在此基础上加了个边框。
\begin{demo}
\mbox{010 6278 5001}
\fbox{010 6278 5001}
\end{demo}

\subsection{makebox~和~framebox}
稍复杂的~\verb|\makebox|~和~\verb|\framebox|~提供了宽度和对齐方式控制选项。这里用~l、r、s~分别代表居左、居右和分散对齐。
\begin{demo}
%语法:[宽度][对齐方式]{内容}
\makebox[100pt][l]{居左}
\framebox[100pt][r]{居右}
\end{demo}

\subsection{parbox~和~minipage}
大一些的对象比如整个段落可以用~\verb|\parbox|~命令和~\verb|\minipage|~环境,两者语法类似,也提供了对齐方式和宽度的选项。但是这里的对齐方式是指与周围内容的纵向关系,用~t、c、b~分别代表居顶、居中和居底对齐。

\begin{demo}
%语法:[对齐方式]{宽度}{内容}
\parbox[c]{90pt}{锦瑟无端五十弦,\\一弦一柱思华年。}李商隐
\end{demo}

细心的读者会发现~\verb|\parbox|~和~\verb|\minipage|~的选项排列顺序和~\verb|\makebox|~和~\verb~\framebox|~的不一致,可能出自不同的作者。

\bibliographystyle{unsrtnat}
\bibliography{reading}
\newpage