-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathchapitre5.tex
585 lines (448 loc) · 22.6 KB
/
chapitre5.tex
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
\chapter{图像}
\begin{epigraphe}{《圣经·申命记》5:8}
不可为自己雕刻偶像,\\也不可作什么形像……\\不可跪拜那些像,也不可事奉它。
\end{epigraphe}
今天,在文档中插入画、照片或其他类型的图像看起来稀松平常,这是由于印刷技术的性能日渐强大、运行日渐稳定。但我们需要在20世纪80年代,也就是\TeX 仍在发展的背景下去看问题。在那个年代,打印机刚刚出现,个体无法接触到具有高质量打印能力的设备。然而,很多打印的解决方案将会诞生,其中的大部分都会基于PostScript语言,因为使用PostScript已经成为了\emph{事实上的}标准做法。
围绕\LaTeX ,有很多在文档中插入图像的解决方案。我们会注意到,其中的一些使用了\textsf{metafont}(管理\LaTeX 字体的实用工具),一些编写了环境\dm{picture},还有一些使用了PIC\TeX 的代码。此处不会介绍这些解决方案,因为我们认为它们有些难以上手。即便如此,你还是需要知道这些解决方案的存在。本书采纳的操作图像的方式是:在\LaTeX 源码中插入封装了相关内容的PostScript格式文件。这种文件可以使用\textsf{xfig}、\textsf{gnuplot}、\textsf{gimp}等绘图软件生成。
\section{开胃小菜}
了解一下用于画线的指令\verb|\rule|多少有些用处:
\begin{dmd}
\backslash rule[\codereplace{纵向位置}]\{\codereplace{长度}\}\{\codereplace{宽度}\}
\end{dmd}
其中\codereplace{纵向位置}可以根据需要在竖直方向上平移线,另外两个参数足以描述线的形态:
\begin{codelist}[5.1]{
这些都是``线'':
\begin{center}
\rule[1ex]{1mm}{5mm}
\quad\rule{1in}{0.4pt}
\quad\rule[-0.5em]{1em}{1em}
\end{center}
}
\begin{verbatim}
这些都是``线'':
\begin{center}
\rule[1ex]{1mm}{5mm}
\quad\rule{1in}{0.4pt}
\quad\rule[-0.5em]{1em}{1em}
\end{center}\end{verbatim}
\end{codelist}
\section{图像文件的格式}
为了在文档中包含图像,需要插入\emph{文件}。\LaTeX 的配置允许其夹带PS(即PostScript)和EPS(即Encapsuled PostScript)类型的文件,至于要插入的文件是由什么软件生成的,\LaTeX 并不关心。你如果认为PostScript格式有诸多限制,那么需要认识到以下事实。
\begin{itemize}
\item 所有\emph{合格}的``矢量''绘图软件都具有将图表导出为EPS格式文件的功能。对于印刷设备,这种格式已经成为标准。
\item 所有图片都可以转换为EPS格式。在UNIX系统中,可以借助程序\textsf{convert}完成这一操作\jz{
如果你的系统中没有这个程序,请查找``ImageMagick''套件来获取它。
}。我们也可以使用软件\textsf{gimp}(一款自由软件,可以用于修图和创建数字图片)完成这一操作,它也适用于其他操作系统。
\end{itemize}
\section{包\textsf{graphicx}}
\LaTeX ,或者说\TeX ,在最初的设想中并不以操作图像(图片、图画等)为目的。基于此,大量扩展被提出,但它们都不是必需的,也不能真正独立于操作系统。
\subsection{标准}
目前,\LaTeX 设计师似乎同意将\emph{图像的}扩展统一起来。1994年年末,两个扩展走入了人们的视野:
\begin{itemize}
\item \textsf{graphics},作为``标准''扩展;
\item \textsf{graphicx},作为``升级版''扩展。
\end{itemize}
此处选择介绍\textsf{graphicx}。需要理解,即使该扩展单界面独立于操作系统,用于管理不同种类图像文件的那部分代码也依赖底层系统。这样一来,就需要指明包的\emph{驱动(driver)}。在不同平台上\jz{
其中可以注意到:对于UNIX,有\textsf{xdvi}和\textsf{dvips};对于macOS,有\textsf{texture}和Oz\TeX ;对于Windows,有em\TeX 和\textsf{dviwin}。
},已有的驱动对应\TeX 识别到的实现。在UNIX中,通常使用\textsf{dvips}。它在\TeX 的发布版中默认选用,如此一来,以下指令足以调用扩展\textsf{graphicx}:
\begin{dmd}
\backslash usepackage\{graphicx\}
\end{dmd}
此时,使用以下指令就能在文档中包含图画或图片:
\begin{dmd}
\backslash includegraphics[\codereplace{选项}]\{\codereplace{文件}\}
\end{dmd}
其中,\codereplace{文件}即包含图片的文件,\codereplace{选项}可以是以逗号隔开的一系列配置。\verb|\includegraphics|不会创建特殊的版式,只会在文本中插入一个包含图像的字盒:
\begin{codelist}[5.2]{
前前
\includegraphics{img/punch_small}
后后。
}
\begin{verbatim}
前前
\includegraphics{punch}
后后。\end{verbatim}
\end{codelist}
\begin{exclamation}
为了确保源代码的便携性、确保代码能够再不同格式下插入图像文件,有必要\emph{在指令}\dm{\backslash includegraphics}\emph{中不指定文件的扩展名}
\end{exclamation}
通常来说,我们会将\verb|\includegraphics|与环境\dm{figure}\celan{\S 2.7}结合使用。例如,图\ref{fig:5.1}依靠以下代码生成:
\begin{figure}
\centering\includegraphics[width=5cm]{img/punch}
\caption{罗伯特(酒后版)}
\label{fig:5.1}
\end{figure}
\begin{dmd}
\begin{verbatim}
\begin{figure}
\centering\includegraphics[width=5cm]{punch}
\caption{罗伯特(酒后版)}
\label{fig-exemple}
\end{figure}\end{verbatim}
\end{dmd}
\begin{exclamation}
注意,环境\dm{figure}可以使图像在页面中``浮动'',而指令\verb|\includegraphics|无法做到这一点。为了防止有人漏掉这一点,再重复一遍:
\begin{center}
\bfseries
环境\dm{figure}可以确保\\
图像在页面中``浮动''。\\
这不是由指令\dm{\backslash includegraphics}\\
来确保的。
\end{center}
\end{exclamation}
\subsection{选项}
包\textsf{graphicx}中含有若干选项,可以用于控制图像的插入过程。此处介绍其中一组最实用的选项。
\subsubsection{更改比例}
有三种调整图像尺寸的方式:
\begin{itemize}
\item \dm{scale=}\codereplace{比例},其中\codereplace{比例}用于整体调整图片的大小,可以为正值或负值。
\item \dm{width=}\codereplace{尺寸},可以指定图片的宽度;
\item \dm{height=}\codereplace{尺寸},可以指定图片的高度。
\end{itemize}
\begin{codelist}[]{
\begin{center}
\includegraphics[scale=0.2]{img/magma}\\
\includegraphics[width=8.5mm]{img/magma}\\
\includegraphics[width=2cm,
height=3mm]{img/magma}
\end{center}
}
\begin{verbatim}
\begin{center}
\includegraphics[scale=0.2]{magma}\\
\includegraphics[width=8.5mm]{magma}\\
\includegraphics[width=2cm,
height=3mm]{magma}
\end{center}\end{verbatim}
\end{codelist}
\subsubsection{旋转}
如果你希望,可以使用选项\dm{option}来让旋转图片。语法如下:
\begin{dmd}
angle=\codereplace{角}
\end{dmd}
其中\codereplace{角}以角度为单位,以逆时针方向为正方向。
\begin{codelist}[5.4]{
\includegraphics[angle=45,
scale=0.2]{img/magma}
}
\begin{verbatim}
\includegraphics[angle=45,
scale=0.2]{magma}\end{verbatim}
\end{codelist}
我们可以在文件\dm{grfguide.pdf}\jz{
可以使用\dm{locate}或\dm{find}在你的系统中找到。
}中找到有关此扩展的详细描述,也可以参阅文档\dm{fepslatex.pdf}\jz{
\wz{http://tug.ctan.org/tex-archive/info/epslatex/french/fepslatex.pdf}。
}。
\subsubsection{草稿模式}
选项\dm{draft}可以将图片生成为\emph{草稿}模式,即在最终文档中仅生成带有被包含文件文件名的方框。
\begin{codelist}[5.5]{
前前
\includegraphics[draft,scale=.2]{punch}
后后。
}
\begin{verbatim}
前前
\includegraphics[draft,scale=.2]{punch}
后后。\end{verbatim}
\end{codelist}
模式\dm{draft}默认在文档选项\dm{draft}指定时启用。如果想要阻止文档选项的转中效果\jz{
例如,你希望同时看到图像和``字盒Overfull标记''。
},可以在使用指令\verb|\includegraphics|或通过\verb|\usepackage|包含扩展时使用选项\dm{final}。
\section{几个实用扩展}
接下来介绍三个可以生成带有图像文档的实用扩展。
\subsection{\textsf{subfig}}
该扩展可以管理带有若干分图的图片,分图会自动编号并能单独引用。例如:
\begin{dmd}
\begin{verbatim}
\begin{figure}[htbp]
\begin{center}
\leavevmode \subfloat[Magma]{%
\label{fig-uniweria-magma}
\includegraphics[width=2cm]{magma}}
\hspace{2cm} \subfloat[UZMK]{%
\label{fig-uniweria-uzmk}
\includegraphics[height=2cm]{uzmk}}
\caption{Uniweria Zëkt}
\label{fig-uniweria}
\end{center}
\end{figure}\end{verbatim}
\end{dmd}
\begin{figure}[htbp]
\begin{center}
\leavevmode \subfloat[Magma]{%
\label{fig-uniweria-magma}
\includegraphics[width=2cm]{img/magma}}
\hspace{2cm} \subfloat[UZMK]{%
\label{fig-uniweria-uzmk}
\includegraphics[height=2cm]{img/uzmk}}
\caption{Uniweria Zëkt}
\label{fig-uniweria}
\end{center}
\end{figure}
在需要引用时,可以通过\verb|\ref{fig-uniweria}|整体引用该图,结果会展示为\ref{fig-uniweria},也可以通过对应的标签来引用分图,如使用\verb+\ref{fig-uniweria-magma}+和\verb|\ref{fig-uniweria-uzmk}|的结果分别为\ref{fig-uniweria-magma}和\ref{fig-uniweria-uzmk}。
%注意,分图没有括号。疑似这也是相关标准的来源。
\begin{ii}
有一种优雅的分图管理方法,即将每个分图打包为一个\dm{minipage}。发行版%TODO
附带的文件\dm{subfig.pdf}中说明了如何自定义环境\dm{subfigure},尤其是处理图题间的空白。
\end{ii}
\subsection{包\textsf{wrapfig}}
包\textsf{wrapfig}提供了环境\dm{wrapfigure},可以让图片在段落中浮动。此处浮动的含义不同于描述\LaTeX 的环境\dm{figure}时所用的浮动,因为此处的环境可以穿插在段落内。语法如下:
\begin{dmd}
\verb|\begin{wrapfigure}{|\codereplace{位置}\}\{\codereplace{宽度}\}\\
...\\
\verb|\end{wrapfigure}|
\end{dmd}
其中\codereplace{位置}即图片的位置(\dm{l}或\dm{r}),\codereplace{宽度}即要插入的图片宽度:
\begin{dmd}
\begin{verbatim}
\begin{wrapfigure}{r}{1.5cm}
\includegraphics[width=1cm]{img/polygons}
\end{wrapfigure}
据我所知,包\textsf{wrapfig}并未
以提供\dm{dvi}文件的形式给出文档。
相反,可以在……\end{verbatim}
\end{dmd}
\begin{wrapfigure}{r}{1.5cm}
\includegraphics[width=1cm]{img/polygons}
\end{wrapfigure}
据我所知,包\textsf{wrapfig}并未以提供\dm{dvi}文件的形式给出文档。相反,可以在位于\dm{[...]/misc/wrapfig.stys}的\dm{.sty}文件自身中找到十分详细的信息。为了展示图片在段落中浮动带来的文字环绕效果,这段篇幅需要长一些,所以这里我多说一点:我们可以顺便注意到,借助一个著名的扩展——\textsf{docstrip},所有的包文档都可以``自动归纳''。这些扩展(extension),或者英文的\emph{package},包含其文档所需的代码,在安装过程中,会陆续被提取出来。\textsf{wrapfig}的作者八成没有遵循这个规则,可惜了……
\subsection{包\textsf{psfrag}}
另一个有趣的扩展是\textsf{psfrag}。它的目的是结合PostScript文件的强大和\LaTeX 方程的美观。我们想要在图片中集成数学式时,往往会遇到一个问题:大多数此类软件都不将支持数学方程作为预设。\textsf{psfrag}作者给出的解决方案中,可以使用指令\verb|\psfrag|在图中出现字符串的位置插入数学式。这样一来,使用以下方法即可生成图\ref{fig:5.3b}而非\ref{fig:5.3a}。
%此处源代码替换有问题,采用的解决方案来自https://zhidao.baidu.com/question/695901494124304244.html,即代码:
% \documentclass[border=2mm]{standalone}
% \usepackage{graphicx}
% \usepackage{psfrag}
% \begin{document}
% \psfrag{abc}{$\sin{a}$}%
% \includegraphics[width=5cm]{example.eps}
% \end{document}
% 然后执行 latex example; dvips example.dvi; epspdf example.ps
% 生成 example.pdf,在你的主文件中使用 \includegraphics{example.pdf} 导入。
\begin{figure}[ht]
\begin{center}
\leavevmode \subfloat[替换前]{%
\label{fig:5.3a}
\includegraphics[width=0.4\linewidth]{img/courbe-sans-psfrag}}
\hspace{2cm} \subfloat[替换后]{%
\label{fig:5.3b}
\includegraphics[width=0.4\linewidth]{img/courbe-avec-psfrag-replace}}
\caption{\textsf{psfrag}的使用,右图中的\LaTeX 方程替换了左图的对应部分。}%TODO 分图引用不规范
\label{fig:5.3}
\end{center}
\end{figure}
\begin{enumerate}
\item 在\verb+\includegraphics{courbe}+前添加一行代码:
\begin{dmd}
\verb+\psfrag{exp(-x)*sin(10*x)}[r][r]{$e^{-x}\sin(10x)$}+
\end{dmd}
该代码可以将图例中的字符串替换为漂亮的方程。
\item 结果在\dm{.dvi}文件中不可见。相反,\textsf{dvips}会负责使用前面的指令来修改生成的PostScript文件。
\end{enumerate}
为公式确定位置的方法即为两个参考点确定位置,其中一个参考点来自方程,另一个来自需要替换的字符串。参考点的位置由用户通过指定指令\verb|\psfrag|中间的两个可选参数确定。假设我们像这样定义了参考点:
\begin{dmd}
\backslash psfrag\{字符串\}[l][c]\{\codereplace{数学方程}\}
\end{dmd}
这样的指令对应如下对其方式:
\newlength{\tempdimdemobox}
\newcommand{\chaine}{\dm{字符串}}
\newcommand{\ekouation}{\codereplace{数学方程}}
\newcommand{\contenu}[1]{%
\ifthenelse{\equal{#1}{b}}{\raisebox{-5pt}[0pt]}{\raisebox{5pt}[0pt]}}
\newcommand{\point}[2]{% #1 (r ou l) #2 ($\bullet$ par ex.)
\ifthenelse{\equal{#1}{r}}{%
\setlength{\tempdimdemobox}{\fboxsep+.5\fboxrule}}{%
\setlength{\tempdimdemobox}{-\fboxsep-.5\fboxrule}}%
\makebox[0pt][l]{%
\hspace{\tempdimdemobox}\makebox[0pt]{#2}}}
\newcommand{\boxdemo}[6][-5pt]{%
\fbox{%
\rule[#1]{0pt}{#2}%
\ifthenelse{\equal{#3}{r}}{% point droite
\contenu{#5}{\footnotesize#6}%
\point{r}{#4}}{% sinon
\ifthenelse{\equal{#3}{l}}{% point gauche
\point{l}{#4}%
\contenu{#5}{\footnotesize#6}}{% sinon
\settowidth{\tempdimdemobox}{\footnotesize#6}%
\makebox[0pt][l]{%
\hspace{.5\tempdimdemobox}\makebox[0pt]{#4}}%
\contenu{#5}{\footnotesize#6}}}}}%大括号随意转行会造成空格计入方框宽度
\begin{center}
\newlength{\zob}
\settowidth{\zob}{\boxdemo{14pt}{c}{$\bullet$}{t}{\chaine}}
\boxdemo{14pt}{c}{$\bullet$}{t}{\chaine}\quad 和\quad
\boxdemo[-7pt]{18pt}{l}{$\odot$}{b}{\ekouation} \quad 叠加的结果为 \quad
\boxdemo{14pt}{c}{$\bullet$}{t}{\chaine}\kern-.5\zob\kern-.5\fboxrule%此行对比原书有改动
\boxdemo[-7pt]{18pt}{l}{$\odot$}{b}{\ekouation}
\end{center}
同样地,如果使用如下指令:
\begin{dmd}
\backslash psfrag\{字符串\}[r][l]\{\codereplace{数学方程}\}
\end{dmd}
则有如下结果:
\begin{center}
\boxdemo{14pt}{l}{$\bullet$}{t}{\chaine}\quad 和\quad
\boxdemo[-7pt]{18pt}{r}{$\odot$}{b}{\ekouation} \quad 叠加的结果为 \quad
\boxdemo[-7pt]{18pt}{r}{$\odot$}{b}{\ekouation}\kern-\fboxrule%
\boxdemo{14pt}{l}{$\bullet$}{t}{\chaine}
\end{center}
在图\ref{fig:5.3b}中,我们使方程的右侧(第一个可选参数为\dm{r})与原字符串的右侧(第二个可选参数为\dm{r})对齐。该包的文档十分具有参考价值……
\begin{exclamation}
注意,如果我们使用\LaTeX 源码生成PDF文件,则只能以使用一些扭曲的操作(参见\S A%TODO
)为代价来使用包\textsf{psfrag}。
\end{exclamation}
\subsection{包\textsf{xcolor}}
扩展\textsf{xcolor}由包\textsf{graphicx}的开发团队开发,在生成彩色文本时可能会很有趣——例如,生成带有透明度的颜色。包\textsf{xcolor}可以生成以下结构:
\begin{codelist}[5.6]{
{一些\color{red}红色}和\textcolor{cyan}{青色}的文本。
一个\colorbox{green}{绿色}字盒。
另一个\fcolorbox{blue}{yellow}{字盒}。
}
\begin{verbatim}
{一些\color{red}红色}和\textcolor{cyan}{青色}的文本。
一个\colorbox{green}{绿色}字盒。
另一个\fcolorbox{blue}{yellow}{字盒}。\end{verbatim}
\end{codelist}
在这里,我们可以理解指定颜色的方法。
\begin{itemize}
\item 使用声明:
\begin{dmd}
\backslash color\{\codereplace{颜色}\}
\end{dmd}
\item 使用指令:
\begin{dmd}
\backslash textcolor\{\codereplace{颜色}\}\{\codereplace{文本}\}
\end{dmd}
\end{itemize}
类似地,对于字盒,有以下方法指定颜色。
\begin{itemize}
\item 无边框:
\begin{dmd}
\backslash colorbox\{\codereplace{填充颜色}\}\{\codereplace{内容}\}
\end{dmd}
\item 有边框:
\begin{dmd}
\backslash fcolorbox\{\codereplace{边框颜色}\}\{\codereplace{填充颜色}\}\{\codereplace{内容}\}
\end{dmd}
\end{itemize}
以上两个指令生成的彩色字盒对于长度\verb|\fboxsep|比较敏感。``如果颜色没有名字\emph{怎么办}?''我听到你在\emph{嘟囔}什么了……对于这个问题,我可以马上回答:
\begin{codelist}[5.7]{
这是
{\color[rgb]{.2,.4,.5}\bfseries
蓝灰色}……
}
\begin{verbatim}
这是
{\color[rgb]{.2,.4,.5}\bfseries
蓝灰色}……\end{verbatim}
\end{codelist}
也可以为上例中的颜色起一个``小名'':
\begin{codelist}[5.8]{
\definecolor{bleugris}{rgb}{.2,.4,.5}
这是
{\color{bleugris}\bfseries 蓝灰色}……
}
\begin{verbatim}
\definecolor{bleugris}{rgb}{.2,.4,.5}
这是
{\color{bleugris}\bfseries 蓝灰色}……\end{verbatim}
\end{codelist}
\begin{ii}
可以注意到,除了使用``\dm{rgb}''色彩模型,也可以使用定义灰度的\dm{gray}模型。同样地,如果使用\dm{html}模型,则可以使用HTML语法来指定颜色。
\end{ii}
\begin{figure}
\centering TODO缺图%TODO
\caption{推荐使用的储存图像文件树状结构:图像存储在一个目录中,矢量图存储在一个目录中,EPS格式的文件存储在另外的目录中}
\label{fig:5.4}
\end{figure}
\section{使用\textsf{make}}
\begin{exclamation}
本节面向使用部署了GNU Make(更多有关信息,请参阅相关必读资料[11])的操作系统的用户准备的。其他人可以跳过这段学习路径……
\end{exclamation}
makefile使生成过程自动化的思路有:
\begin{itemize}
\item 使用``位图''图像文件生成EPS格式的文件;
\item 使用带有矢量绘图软件内置格式的文件生成EPS格式的文件。
\end{itemize}
为了实现以上思路,我们需要树立一个目标,可以用以下命令行表示:
\dmh{make figs}
假设图片和图像文件分别存储在主文件所在目录下的子目录\dm{Imgs}和\dm{Figs}中,生成的EPS文件同样存储在子目录\dm{Epss}中(如图\ref{fig:5.4}所示)。此时,就可以开始定义一系列变量,来指明需要用到的不同目录:
\begin{mdframed}
\begin{verbatim}
FIGSDIR=Figs
EPSSDIR=Epss
IMGSDIR=Imgs\end{verbatim}
\end{mdframed}
\subsection{图像转码}
首先,(作为示例)我们列出JPEG和PNG格式文件的列表,使用如下两个变量来储存列表:
\begin{mdframed}
\begin{verbatim}
PNGS=$(notdir $(wildcard $(IMGSDIR)/*.png))
JPGS=$(notdir $(wildcard $(IMGSDIR)/*.jpg))\end{verbatim}
\end{mdframed}
使用函数\dm{wildcard}可以获得文件夹\verb|$(IMGSDIR)|中文件的列表,而对于每个文件,函数\dm{notdir}可以删除其``目录''的部分。最终,变量\dm{PNGS}包含:
\begin{dmd}
i.png j.png
\end{dmd}
变量\dm{JPGS}包含:
\begin{dmd}
k.jpg
\end{dmd}
接下来,我们可以从这两个变量除法,创建即将生成的EPS文件的列表(再提醒一次,EPS文件应当单独存放在一个目录中):
\begin{mdframed}
\begin{verbatim}
IMGS2EPSS=$(patsubst %,$(EPSSDIR)/%,\
$(PNGS:.png=.eps) $(JPGS:.jpg=.eps))\end{verbatim}
\end{mdframed}
赋值符号右侧的表达式可以将前文中两个列表中文件的扩展名改为\dm{eps},并且文件名前加上存储EPS文件的目录作为前缀。因此,\dm{IMG2EPSS}包含:
\begin{dmd}
Epss/i.eps Epss/j.eps Epss/k.eps
\end{dmd}
该列表构成了(\textsf{make}意义上)生成图像的``先决''条件。因此,按以下方式定义目标:
\begin{mdframed}
\begin{verbatim}
figs : $(IMGS2EPSS)\end{verbatim}
\end{mdframed}
此外,也需要向\textsf{make}解释我们如何将图像文件转换为封装好的PostScript格式。可以通过如下规则描述:
\begin{mdframed}
\begin{tabbing}
\verb|abcd|\=\kill
\verb+$(EPSSDIR)/%.eps : $(IMGSDIR)/%.png+\\
$\longmapsto$\>\verb+convert $< EPS:$@ +\\
\verb+$(EPSSDIR)/%.eps : $(IMGSDIR)/%.jpg+\\
$\longmapsto$\>\verb+convert $< EPS:$@+
\end{tabbing}
\end{mdframed}
这样的规则详细描述道:我们将会用到工具\textsf{convert}\jz{
其属于包ImageMagick,可以在\wz{http://www.imagemagick.org}获取。该工具几乎可以转换所有格式的图片。
}来将JPEG和PNG文件转换为EPS格式。
\subsubsection{转换图像文件}
图像文件的转码严格遵循同一原则。假设我们指明了一个由\textsf{xfig}生成的fig格式源文件和一个由\textsf{Inkscape}生成的svg格式源文件,则\dm{makefile}有:
\begin{mdframed}
\begin{verbatim}
FIGS=$(notdir $(wildcard $(FIGSDIR)/*.fig))
SVGS=$(notdir $(wildcard $(FIGSDIR)/*.svg))
FIGS2EPSS=$(patsubst %,$(EPSSDIR)/%,\
$(FIGS:.fig=.eps) $(SVGS:.svg=.eps))\end{verbatim}
\end{mdframed}
当然,两条转换规则是不同的,因为它们分别会调用\textsf{fig2dev}(\textsf{xfig}的相关工具)和\textsf{Inkscape}本身:
\begin{mdframed}
\begin{tabbing}
\verb|abcd|\=\kill
\verb+$(EPSSDIR)/%.eps : $(FIGSDIR)/%.fig+\\
$\longmapsto$\>\verb+fig2dev -L eps $< > $@+\\
\verb+$(EPSSDIR)/%.eps : $(FIGSDIR)/%.svg+\\
$\longmapsto$\>\verb+inkscape -E $@ $<+
\end{tabbing}
\end{mdframed}
最终,用于输出图像文件和图片的目标如下:
\begin{mdframed}
\begin{verbatim}
figs : $(IMGS2EPSS) $(FIGS2EPSS)\end{verbatim}
\end{mdframed}
\section{除此之外……}
针对特殊的需求,我们可以找到大量可以生成能满足需要的图像(电路图、直方图、树形图……)的扩展。实际上,你可能在某天需要使用一个指令自动生成若干图像,这时请看看可用的不同扩展(\textsf{pstricks}、\MP……)、环境\dm{picture}及其扩展\textsf{epic}和\textsf{eepic}。加油!
\begin{ii}
目前,包TikZ的发展顺风顺水。该包可以为其优秀的用户提供使用一种依赖\LaTeX 的语言创作图画的可能。如果文档中的图以等价的形式出现多次,这种解决方案会非常有趣。该包会在本书的未来版本中介绍。
\end{ii}