-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathchapitreA.tex
345 lines (267 loc) · 12.9 KB
/
chapitreA.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
\part{附录}
\appendix
\chapter{生成``PDF''}
本附录介绍一种生成PDF(portable document format)文档的新方法。这种格式由Adobe公司创造,优势是使一台计算机向另一台计算机传输文件的过程具有十足的便携性,以及能使不同操作系统间传输文件的通用性。因此,在今天能够才\LaTeX 源代码生成这种文件是十分有趣的。
\section{通用原则}
从\LaTeX 文档生成PDF文件至少有三种方法:
\begin{enumerate}
\item 借助\textsf{pdflatex}代替\textsf{latex}程序将\LaTeX 源代码翻译为PDF文件;
\item 借助\textsf{dvipdf}将DVI文件翻译为PDF文件;
\item 借助\textsf{ps2pdf}将PostScript格式的输出翻译为PDF文件。
\end{enumerate}
\begin{exclamation}
拥有关于上述第一条的一些经验的鄙人将专注于pdflatex。想要正确使用这个软件,有一些前提条件:
\begin{itemize}
\item 要么使用了包lmodern;
\item 要么安装了弗拉基米尔·沃洛维奇(Vladimir Volovich)的扩展``CM-Super font''。Debian的发行版Etch包含了开箱即用的包。我们同样可以在用于为Debian的一个发行版——Sarge借助te\TeX 安装该扩展的网站(\wz{http://sravier.free.fr/linux/\linebreak debian\_latex\_cm-super.html})上找到相关文档。
\end{itemize}
\end{exclamation}
\section{更改之处}
为了编译\LaTeX 源文件、生成PDF格式的文件,我们可以以如下方式使用软件\textsf{pdflatex}:
\dmh{pdflatex monfichier.tex}
如果源文档之中没有错误,该指令会创建名为\dm{monfichier.pdf}的文件。如下是几个需要注意的重点。
\begin{description}
\item[图形] 对于图片,应当以PNG或JPEG格式包含在文档中;对于绘制的图画,应当以PDF格式包含\jz{
软件\textsf{Xfig}的软件可以被转换为PDF。%TODO 啥?
}。
\item[链接] 在包含了包\textsf{hyperref}的情况下,PDF文档会在指令\verb|\ref|出现时、目录中、索引中等情况下自动包含链接。此外,适用于软件\textsf{Acrobat Reader}的可折叠目录也会生成。
\end{description}
\section{一些技巧}
考虑到我们经常使用同一个源文件生成DVI或PDF,且根据具体情况应当包含不同的图像文件,可以借助包\textsf{ifpdf}来实现这样的技巧:
\begin{dmd}
\begin{verbatim}
\ifpdf
% 针对输出PDF而特定的内容
\else
% 针对输出DVI而特定的内容
\fi \end{verbatim}
\end{dmd}
\subsection{处理图像}
我们可以编写如下的内容:
\begin{dmd}
\begin{verbatim}
\ifpdf
\graphicspath{{pngs/}{{pdfs/}}
\else
\graphicspath{{epss}}
\fi\end{verbatim}
\end{dmd}
这对应于我们将图像文件按\dm{pngs}、\dm{pdfs}、\dm{epss}等目录整理的情况。这个新的``if''语句也可以写成如下结构:
\begin{dmd}
\begin{verbatim}
\ifpdf
\includegraphics[pdftex]{graphicx}
\else
\includegraphics{graphicx}
\fi\end{verbatim}
\end{dmd}
在最新的\LaTeX 版本中,这样写不是必需的。
\subsection{缩略图}
\textsf{pdflatex}近期的版本支持了为包括但不仅限于\textsf{evince}、\textsf{Acrobat Reader}等浏览器创建缩略图(vignettes;英:\emph{thumbnail})。以前,则需要使用包\textsf{thumbpdf}:
\begin{dmd}
\verb+\usepackage{thumbpdf}+
\end{dmd}
并且执行:
\dmh{thumbpdf monfichier.pdf}
该指令会创建名为\dm{monfichier.tpt}的文件,会在接下来使用\textsf{pdflatex}编译时被包含。
\subsection{页码}
为了在浏览器\textsf{Acrobat Reader}中展示页码,需要在包含包\textsf{hyperref}(参见\S A.4)添加选项\dm{pdfpagelabels}。
\subsection{书签}
PDF浏览器中的书签(signet;英:\emph{bookmarks})是一种``目录浏览器'',可以直接跳转到某一指定级别的某一节。在生成目录上,需要绕过两个难点。
\begin{enumerate}
\item 将``收尾''的内容(参考文献、术语字典、索引)设置为该浏览器中各部分的同一级别。默认情况下,这些信息会``掩盖''在附录部分中,因为它们与各\verb|\chapter|处于同一深度。
\item 确保书签中指向索引的链接确实指向索引……
\end{enumerate}
对于第一个问题,你只需要使\LaTeX 相信``收尾''内容中的\emph{章}与目录、各\emph{部分}处于同一深度。这里的咒语是:
\begin{dmd}
\verb|\renewcommand{\toclevel@chapter}{-1}|
\end{dmd}
它需要放置在风格文件中的适当位置。我们重定义\verb|\backmatter|\celan{\S 10.4.4}的地方无疑是很好的选择。
\begin{qquestion}
作为\emph{书签}部分的结尾,为了让指向索引的书签实际指向索引(!),我们这次要念的是萨满教的咒语:
\begin{dmd}
\begin{verbatim}
\let\printindexORIG\printindex
\renewcommand{\printindex}{%
\cleardoublepage
\phantomsection% 创建一个假节
\addcontentsline{toc}{chapter}{Index}
\printindexORIG}\end{verbatim}
\end{dmd}
该咒语通过包hyperref提供的指令\verb|\phantomsection|为指令\verb|\printindex|添加了一个并不存在的节,使其过载。别问我更多了\dm{:-)}
\end{qquestion}
\section{超链接}
借助包\textsf{hyperref},可以在\dm{.dvi}或\dm{.pdf}文件中插入可以被浏览器(如\textsf{xdvi}和\textsf{Acrobat Reader}等)检测到的特殊指令。我们可以点击由\verb|\ref|等特殊指令生成的文本,从而自动定义到被引用的位置。在本文档的电子版中,存在以下我们可以点击的链接:
\begin{itemize}
\item 所有由\verb|\ref|、\verb|\pageref|、\verb|\vref|生成的引用;
\item 页脚的注释;
\item 由指令\verb|\url|生成的网址;
\item 对参考文献的引用;
\item 索引各入口中的页码。
\end{itemize}
我们可以编写如下内容来激活超链接系统:
\begin{dmd}
\begin{verbatim}
\ifpdf
\usepackage[pdftex=true,
hyperindex=true,
colorlinks=true]{hyperref}
\else
\usepackage[hypertex=true,
hyperindex=true,
colorlinks=false]{hyperref}
\fi\end{verbatim}
\end{dmd}
这样可以只在PDF版本中为链接设置颜色。PostScript版本中的链接会以黑色生成,以在文档以黑白模式打印时保持可读性。
\begin{qquestion}
我们在文档中包含不同包的允许会影响到扩展hyperref的正常功能,有时甚至包含包的位置都会造成编译错误。至于什么样的顺序是合适的,就交给你来探索了\dm{:-)}
\end{qquestion}
\section{和\textsf{psfrag}及\textsf{pstricks}互动}
\subsection{textsf{pstricks}}
该包可以用来``作弊''(tricher,英:\emph{trick})。简单来说,我们可以写下这样的代码:
\begin{mdframed}
\begin{dmd}
\begin{verbatim}
令:
\begin{pspicture}[](-1,-1)(1,1)
\parametricplot[linewidth=.5pt,plotstyle=ccurve]%
{0}{360}{4 t mul sin 3 t mul sin} \psgrid[gridlabels=0pt](-1,-1)(1,1)
\end{pspicture}
\quad $x=\sin(4t), y=\sin(3t)$的图像……\end{verbatim}\end{dmd}
\end{mdframed}
这样的效果如下:
\begin{mdframed}
令:
\begin{pspicture}[](-1,-1)(1,1)
\parametricplot[linewidth=.5pt,plotstyle=ccurve]%
{0}{360}{4 t mul sin 3 t mul sin} \psgrid[gridlabels=0pt](-1,-1)(1,1)
\end{pspicture}
\quad $x=\sin(4t), y=\sin(3t)$的图像……
\end{mdframed}
还挺奇怪的,对不?确实。扩展\verb|pstricks|的原则就是在\dm{.dvi}文件中插入PostScript代码,程序\textsf{dvips}同样可以绘制这些代码。我们想要在使用\textsf{pdflatex}时使用这些小块图时,问题就会变得复杂。实际上,\textsf{pdflatex}会直接用\dm{.tex}文件直接生成\dm{.pdf}文件,而在PDF格式的文件中插入PostScript片段毫无效果……然而,还是有能规避这个问题的可能:
\begin{enumerate}
\item 先生成一个包含\textsf{pstricks}中指令的最小\LaTeX 文件;
\item 使用\LaTeX 编译这个文档,生成\dm{.dvi}文件;
\item 使用选项\dm{-E},指示\textsf{dvips}以封装后的PostScript格式创建文件;
\item 将该文件转换为PDF格式;
\item 在使用\textsf{pdflatex}时包含该文件。
\end{enumerate}
这个解决方案有点``拧巴'',但我们可以借助Makefile、UNIX的小脚本、指令等实现自动化。
首先:
\begin{dmd}
\begin{verbatim}
\newcommand{\includepstricksgraphics}[1]{%
\ifpdf\includegraphics{#1}\else\input{#1}\fi}\end{verbatim}
\end{dmd}
这里的思路是将带有\textsf{pstricks}的指令的一部分代码抽取出来,存储在文件\dm{bidule.tex}中。接下来:
\begin{dmd}
\begin{verbatim}
\includepstricksgraphics{bidule}\end{verbatim}
\end{dmd}
我们编写这样的指令时,如果使用\textsf{pdflatex},就可以包含\dm{bidule.pdf};如果使用\LaTeX 就可以包含\dm{bidule.tex}。此外,对于UNIX的``小''脚本,我们可以根据需求来编写:
\begin{dmd}
\begin{verbatim}
#!/bin/sh
# 移除第一个参数的扩展名
FILE=${1%.*}
# 创建一个临时文件
psttemp.tex
cat > psttemp.tex <<EOF\end{verbatim}
\verb+\documentclass{manuel}+\quad$\leftarrow$\textsf{设定类型和适当的包}
\begin{verbatim}
\thispagestyle{empty}
\begin{document}
\input{$FILE}
\end{document}
EOF
# 创建DVI文件
latex psttemp
# 创建EPS文件
dvips -E $TMPFILE.dvi -o psttemp.eps
# 创建PDF文件
epstopdf psttemp.eps --debug --outfile=$FILE.pdf
# 清除临时文件
rm -f psttemp.*\end{verbatim}
\end{dmd}
这些内容存储在名为\dm{pstricks.sh}的文件中,可以通过如下方式使用:
\dmh{./pstricks.sh bidule.tex}
这样会创建文件\dm{bidule.pdf}。这次,\textsf{pdflatex}会乖乖包含我们想要的内容,这要归功于上文编写的指令\verb+\includepstricksgraphics+。对于Makefile,根据前面的脚本,不难定义出用于将\dm{.tex}文件转换为\dm{.pdf}文件的规则。借助GNU版本的\textsf{make},我们可以写出如下代码:
\begin{dmd}
\begin{verbatim}
%.pdf : %.tex
./pstricks.sh $<\end{verbatim}
\end{dmd}
\begin{qquestion}
程序dvips并不总能正确计算包裹被封装的PostScript的字盒。特别地,pstricks文档\jz{\wz{http://tug.org/PSTricks}}的41节指出,dvips无法考虑到生成出的PostScript代码,从而估计包裹它的字盒。在这种情况下,建议要么在图像的前后添加文本,来帮助dvips脱身,要么使用环境\dm{TeXtoEPS}。这样一来,前文脚本中的临时文档需要做出更新:
\begin{dmd}
\begin{verbatim}
cat > psttemp.tex <<EOF
\documentclass{manuel}
\usepackage{pst-eps}
\thispagestyle{empty}
\begin{document}\end{verbatim}
\verb+\begin{TeXtoEPS}+\quad$\leftarrow$\textsf{帮助PSTricks计算字盒}
\begin{verbatim}
\input{$FILE}
\end{TeXtoEPS}
\end{document}
EOF\end{verbatim}
\end{dmd}
\end{qquestion}
\subsection{\textsf{psfrag}}
\textsf{psfrag}的限制和原则与\textsf{pstricks}相同。对于搭配\textsf{pdflatex}使用\textsf{psfrag},需要如下的过程:
\begin{enumerate}
\item 先生成一个包含\textsf{psfrag}中指令的最小\LaTeX 文件;
\item 使用\LaTeX 编译这个文档,生成\dm{.dvi}文件;
\item 使用选项\dm{-E},指示\textsf{dvips}以封装后的PostScript格式创建文件;
\item 将该文件转换为PDF格式;
\item 在使用\textsf{pdflatex}时包含该文件。
\end{enumerate}
然而,这里有一个小``症结''——我们使用\textsf{dvips}计算的外围字盒所包裹的图包含了由\textsf{psfrag}生成的文本,也就指明了即将进行的替换。我们应当考虑到这一点。在shell脚本中,创建一个函数:
\begin{dmd}
\begin{verbatim}
function genere_eps
{
cat > $TMPFILE.tex <<EOF
\documentclass{manuel}\end{verbatim}
\verb+\documentclass{manuel}+\quad$\leftarrow$设定类型和适当的包
\begin{verbatim}
\thispagestyle{empty}
\begin{document}
\input{$1}
\end{document}
EOF
echo "生成DVI文件"
latex $TMPFILE > $LOGFILE
echo "生成$TMPFILE.eps文件"
dvips -E $TMPFILE.dvi -o $TMPFILE.eps >> $LOGFILE 2>&1
}
\end{verbatim}
\end{dmd}
接下来,在脚本中使用该函数两次,具体如下:
\begin{dmd}
\begin{verbatim}
FILE=${1%.*}
TMPFILE=truc
LOGFILE=truc.log
sanspsfrag=$TMPFILE-sanspsf.tex
# 删除包含指令\psfrag的行
# 并获取包裹EPS文件且不含psfrag的字盒
# sans les psfrag
grep -v \\\\psfrag $FILE.tex > $sanspsfrag
genere_eps $sanspsfrag
bonnebb=$(grep "^%%BoundingBox" $TMPFILE.eps | head -1)
# 获取包裹EPS文件且包含psfrag的字盒
genere_eps $FILE
mauvaisebb=$(grep "^%%BoundingBox" $TMPFILE.eps | head -1)
# 将包裹的字盒替换为效果正确的版本
sed -i "s/$mauvaisebb/$bonnebb/" $TMPFILE.eps
echo "创建PDF文件"
epstopdf $TMPFILE.eps --debug \
--outfile=pdfs/${FILE##*/}.pdf >> $LOGFILE 2>&1
# 做好清洁工作
rm -f $TMPFILE.* $LOGFILE $sanspsfrag\end{verbatim}
\end{dmd}
\begin{exclamation}
该脚本有许多缺陷。例如,在指令\verb+\psfrag+占据多行的情况下会失败。实际上,我们要求grep做的事情是删除包含\verb+\psfrag+的行,而不去验证该指令是否在几行之后才结束……
\end{exclamation}