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
|
How to make PDF files using CJK/LaTeX with embedded TrueType fonts
Hin-Tak Leung <htl10@users.sourceforge.net>
December 2003
Introduction
------------
Existing CJK/LaTeX instruction for high-quality print-out tends to suggest
permanently converting TrueType fonts (which had a better availability) to
postscript sub-fonts; this document covers how to use TrueType fonts
directly, and also preparing such PDF documents. Today, the PDF output
format is slightly more popular than PostScript; also, even on US English
systems, CJK font packs are available for font substitution in Adobe Acrobat
Reader (and similar mechanisms exist for xpdf and ghostscript), which allows
the generation of PDF files containing only important textual content but no
embedded fonts. Such files are small enough to be e-mailed while preserving
formatting, provided the recipient has the font packs installed. This
document also covers the issues with no-embedded-font PDF files at the very
end as well.
The following steps are discussed below in greater detail:
1. Finding the fonts.
2. Getting and building some software: ttf2tfm, dvipdfmx.
Some other nice optional software: oto, the other freetype/freetype2
demo tools, ttfm, ttx.
3. Using ttf2tfm, generating *.tfm and *.enc files for each font.
4. Putting the fonts, the *.tfm files, and the *.enc files into the right
place in your system.
5. Configuring dvipdfmx to use the new fonts.
6. (optional) Configuring pdflatex to use the new fonts also.
7. Configuring CJK/LaTeX to use those fonts.
8. Testing.
9. Problems and tips.
I can read both traditional and simplified Chinese, and a substantial amount
of Japanese, but there isn't any Korean-specific info here. Hopefully this
is useful enough as a starting point at least for Korean-related
experiments.
The two most important references during this venture was the FreeBSD
(Taiwan) Chinese HOWTO (it is substantially better and more up-to-date than
the GNU/Linux one), and Edward G. J. Lee's various treatises on the net,
particularly his `mycjk' notes. Unfortunately both are available in Chinese
only, I believe.
1. Fonts
========
Chinese
-------
Arphic donated 4 high-quality Chinese fonts to the open-source community:
two for traditional and two for simplified Chinese, respectively. They are
shipped with Redhat 9 (which I used for most of this work) and Debian 3
and possibly also other GNU/Linux distributions; they can be downloaded
from Arphic's home site and, probably more convenient, from
ftp://ftp.gnu.org/gnu/non-gnu/chinese-fonts-truetype/
and its mirrors. Tip: Use `unzip -L' to convert file names to lowercase.
Redhat 9 also ships zysong, a simplified Chinese font. This font seems to
be licensed to Redhat only since it isn't found in other GNU/Linux
distributions. It is part of the package "ttfonts-zh_CN-2.12-1.noarch.rpm",
together with the two Arphic simplified Chinese fonts, on the 3rd CD
of the Redhat 9 CD set.
The Ministry of Education in Taiwan released a few fonts for
standardization: Currently two are available from the ministry's home page
(http://www.edu.tw/mandr/index.htm), but there are old versions with
different type faces floating around in the net.
CwTeX (a Chinese-enabled LaTeX implementation in Taiwan) ships 5 fonts.
(http://ccms.ntu.edu.tw/~ntut019/cwtex/cwtex.html)
Still available is the set of 8 TrueType fonts from NTU which were widely
used previously for CJK/LaTeX documents (http://input.cpatch.org/font/ntu/).
There is also a set of 10 quite fancy and unusual fonts for traditional
Chinese, developed by Dr Hann-Tzong Wang
(http://140.135.64.77/teacher/htwang/htwang.htm). It is distributed as
one of the standard font sets for FreeBSD Taiwan.
(http://www.freebsd.org/cgi/pds.cgi?ports/chinese/wangttf).
Japanese
--------
Redhat 9 and SuSE both ship the Kochi Gothic and Mincho fonts; Debian
ships Watanabe Mincho and Wadalab Gothic as part of the XTT TrueType font
server. The packages are: "ttfonts-ja-1.2-21.noarch.rpm" on the 3rd disc
of the Redhat 9 CD set, "ttf-kochi-mincho-0.2.20020727-81.noarch.rpm" and
"ttf-kochi-gothic-0.2.20030118-17.noarch.rpm" on SuSe 8.2,
"xtt-fonts" for Debian systems.
Other source of fonts (e.g. Win2k/WinXP/Win2k3 ships a few as standard,
and also localized version of MS Office, etc.) are mostly proprietary.
These instructions are known to work on those also, but I don't want to
go into specific details...
2. ttf2tfm and dvipdfmx
=======================
The specific details about compiler switches, include paths, are for
the Redhat 9 distribution. You may have to adapt them.
ttf2tfm
-------
ttf2tfm is part of ttf2pk package which is itself part of
freetype-contrib, a suite of programs depending on the FreeType 1 library.
Most GNU/Linux systems ship both FreeType 2 and FreeType 1 (that's the
case for RH9, in fact), which are *not* compatible. So I decided to build
the latest FreeType 1 static version and made freetype-contrib depend on
that to avoid using the out-dated library shipped with my system. The
mentioned packages can be downloaded from ftp.freetype.org.
Unpack freetype-current (adapt the `/home/hleung' part to suit yourself),
then do
cd /home/hleung/freetype-current
./configure --enable-static --disable-shared --prefix=/home/hleung
make
Now unpack freetype-contrib-current inside the freetype-current tree, then
do
cd freetype-contrib-current/ttf2pk
CFLAGS=-I../../lib/ LDFLAGS=-L../../lib/.libs ./configure \
--with-kpathsea-lib=/usr/lib --with-kpathsea-include=/usr/include
make
make install
Important: At the end, you need to manually copy the data/*.sfd files into
${TEXMF}/ttf2tfm and also ${TEXMF}/ttf2pk (a soft link from
${TEXMF}/ttf2tfm to ${TEXMF}/ttf2pk will do also).
[The recent TeX directory structure (TDS), version 1.1, comes with a new
subdirectory fonts/sfd, to be accessed with the kpathsea variable
$SFDFONTS. ttf2tfm and other programs available in the TeXLive
distribution have already been updated to use it.]
The man pages of ttf2tfm and ttf2pk give detailed explanation of all
command line arguments.
Tip: I find a utility called "checkinstall" quite useful. Instead of `make
install' one calls `checkinstall' which does the same as `make install'
but also integrates the data nicely into the package management system for
Redhat/Debian/Slackware; this gives cleaner upgrades and uninstalls.
dvipdfmx
--------
http://project.ktug.or.kr/dvipdfmx/
For dvipdfmx I use
CFLAGS='-I/usr/kerberos/include -O2 -march=i386 -mcpu=i686' ./configure
make
make install
The include path is due to dependency on the kerberos library for PDF
encryption. Important: The 10 Wang fonts have some peculiarities; I
submitted a preliminary patch which the author has much refined and
incoporated into a new release. You need a version newer than 2003-08-11
if you want to use this set of fonts. From the ChangLog of dvipdfmx:
2003-08-11 Jin-Hwan Cho <chofchof@ktug.or.kr>
* A faked font name was used for TrueType fonts without any PS
font name as suggested by Hin-Tak Leung.
[The recent TeX directory structure (TDS), version 1.1, comes with a new
subdirectory fonts/sfd, to be accessed with the kpathsea variable
$SFDFONTS. dvipdfmx and other programs available in the TeXLive
distribution have already been updated to use it.]
3. Generating ttf and enc files
===============================
OpenType Organizer (oto) : http://sourceforge.net/projects/oto/
True Type Font Manager (ttfm):
- part of Chinese GNU/Linux Extention http://cle.linux.org.tw/
You need to know what cmap (character map) the TrueType font (*.ttf or
*.ttc) contains. The utility programs oto, ftdump (two versions! --
FreeType 1 and FreeType 2 both have this demo program, showing quite
different information), and ttfinfo (part of ttfm) can show this info, and
some other information about your font as well. Only ftdump works on
TrueType collections (*.ttc), but the other two have their strengths also
(ttfinfo gives the most straightforward info, while oto gives some details
that ftdump doesn't show).
For detailed information on cmaps in a font you can use ttx, a tool to
assemble and disassemble OpenType fonts. It is available from
http://fonttools.sf.net.
If there is a Unicode cmap you can use ttf2tfm's `U*.sfd' files (see the
`@...@' argument for ttf2tfm); the command line for ttf2tfm is simpler
also. Otherwise you need to specify the platform (-P) and encoding (-E)
IDs.
Here is what works for me for the fonts I mentioned. Important: The font
stem name needs to be unique. Additionally, dvipdfmx doesn't like numbers
in the font stem name. I use a 4-letter combination. By LaTeX convention
it shouldn't be longer than 5 letters.
ttf2tfm bkai00mp.ttf -q -w bkai@UBig5@
ttf2tfm bsmi00lp.ttf -q -w bsmi@UBig5@
ttf2tfm gbsn00lp.ttf -q -w gbsn@UGB@
ttf2tfm gkai00mp.ttf -q -w gkai@UGB@
ttf2tfm zysong.ttf -q -w zysg@UGB@
ttf2tfm kai-linux.ttf -P 3 -E 4 -q -w mekl@Big5@
ttf2tfm edustd-15.ttf -P 3 -E 4 -q -w mest@Big5@
ttf2tfm moe_kai.ttf -P 3 -E 4 -q -w meko@Big5@
ttf2tfm moe_sung.ttf -P 3 -E 4 -q -w meso@Big5@
ttf2tfm ntu_li_m.ttf -P 3 -E 4 -q -w ntli@Big5@
ttf2tfm ntu_br.ttf -P 3 -E 4 -q -w ntbr@Big5@
ttf2tfm ntu_fs_m.ttf -P 3 -E 4 -q -w ntfs@Big5@
ttf2tfm ntu_kai.ttf -P 3 -E 4 -q -w ntka@Big5@
ttf2tfm ntu_mb.ttf -P 3 -E 4 -q -w ntmb@Big5@
ttf2tfm ntu_mm.ttf -P 3 -E 4 -q -w ntmm@Big5@
ttf2tfm ntu_mr.ttf -P 3 -E 4 -q -w ntmr@Big5@
ttf2tfm ntu_tw.ttf -P 3 -E 4 -q -w nttw@Big5@
ttf2tfm mttf.ttf -q -w cwtm@UBig5@
ttf2tfm kttf.ttf -q -w cwtk@UBig5@
ttf2tfm fttf.ttf -q -w cwtf@UBig5@
ttf2tfm bbttf.ttf -q -w cwtb@UBig5@
ttf2tfm rttf.ttf -q -w cwtr@UBig5@
ttf2tfm kochi-gothic.ttf -w kcgt@UJIS@
ttf2tfm kochi-mincho.ttf -w kcmc@UJIS@
ttf2tfm wadalab-gothic.ttf -P 3 -E 2 -w wdgt@SJIS@
ttf2tfm watanabe-mincho.ttf -P 3 -E 2 -w wnmc@SJIS@
The Wang's font set has some unusual properties, and need either
a new version of freetype 1 (after 2003-10 from CVS), or a slightly
modified "Big5.sfd", called "wcl.sfd" here:
ttf2tfm wcl-01.ttf -P 3 -E 4 -q -w wclj@wcl@
ttf2tfm wcl-02.ttf -P 3 -E 4 -q -w wclk@wcl@
ttf2tfm wcl-03.ttf -P 3 -E 4 -q -w wcll@wcl@
ttf2tfm wcl-04.ttf -P 3 -E 4 -q -w wclm@wcl@
ttf2tfm wcl-05.ttf -P 3 -E 4 -q -w wcln@wcl@
ttf2tfm wcl-06.ttf -P 3 -E 4 -q -w wclp@wcl@
ttf2tfm wcl-07.ttf -P 3 -E 4 -q -w wclq@wcl@
ttf2tfm wcl-08.ttf -P 3 -E 4 -q -w wclr@wcl@
ttf2tfm wcl-09.ttf -P 3 -E 4 -q -w wcls@wcl@
ttf2tfm wcl-10.ttf -P 3 -E 4 -q -w wclt@wcl@
As an example, here is what I do for a well-known proprietary simplified
Chinese font which has only a cmap for simplified Chinese:
ttf2tfm gkai00m.ttf -P 3 -E 3 -q -w gkaim@EUC@
Here an example for a TrueType collection:
ttf2tfm dcai5.ttc -q -w dcaiq@UJIS@
4. Putting the files where they should be
=========================================
This is somewhat related to how kpathsea works and how latex (the program)
find its files. It is possible to set individual environment variables for
each of these items, but it is easier to set one: $TEXMF to a list of
locations, with a tree parallel to the system tree. Then do the following:
. Put the *.tfm files into a subdirectory of ${TEXMF}/fonts/tfm.
. Put the *.enc files into a subdirectory of ${TEXMF}/dvips.
. Put the *.ttf (or *.ttc) files into a subdirectory of
${TEXMF}/fonts/truetype.
. Put the *.sfd files into ${TEXMF}/ttf2tfm or a subdirectory of it.
Don't forget to either copy them into ${TEXMF}/ttf2pk also or to set up
a link from ${TEXMF}/ttf2pk to ${TEXMF}/ttf2tfm.
Reason: dvipdfmx searches SFD files (which it needs for reassembling)
under ${TEXMF}/ttf2pk although we don't use ttf2pk anywhere. ttf2tfm
looks for them under its own name, of course.
[The recent TeX directory structure (TDS), version 1.1, comes with a new
subdirectory fonts/sfd, to be accessed with the kpathsea variable
$SFDFONTS. dvipdfmx and other programs available in the TeXLive
distribution have already been updated to use it.]
Important: Run texhash (mktexlsr) to rebuild the kpathsea database,
otherwise files won't be found. You have been warned!
5., 6. Configuring dvipdfmx and (optionally) pdflatex
=====================================================
cid-x.map, dvipdfmx.cfg, *.map
See for example, my own "cid-x.map" for the main font config file of
dvipdfmx -- all my own customization is at the very end after the line
"Hin-Tak Leung's custom setup below:". For each font xxxx, one needs
to add a line "f xxxx.map" into "dvipdfmx.cfg", and a fontmap
file "xxxx.map" into the dvipdfmx config directory --
${TEXMF}/dvipdfm/config/ on my system (the missing
"x" is not a typo, as dvipdfmx originally derived from dvipdfm).
I have included cwbt.map, for one of the CwTeX fonts, as an example,
and my dvipdfmx.cfg as well.
Because I have a fair number of fonts I like to add, I wrote a little
perl script "gen-map.pl", which generates all the *.map files plus
a file called "map.list" which I can simply append to dvipdfmx.cfg,
from an internal table at the very top of the script.
pdflatex needs the same fontmap files for each new font - copy them into
${TEXMF}/dvips/config/. Modify the updmap script which is used for
updating both pdflatex.cfg and dvips.cfg, and run the updmap script.
On teTeX 1.0.x, one needs to add to the "extra_modules=" entry the
*.map files for each font. My modified updmap is included as an
example "updmap.my", found as "/usr/share/texmf/dvips/config/updmap" on
a RH 9 system. On teTeX 2.0.x, updmap has a separate config file
updmap.cfg located in ${TEXMF}/web2c/.
7. Configuring CJK/LaTeX
========================
Copy the whole `texinput' directory of the CJK package into a directory
which is in your $TEXINPUTS path. Also create some new *.fd files there.
My "c00cwtb.fd" is included as an example; again, since I have quite
a few font files, I have created some template fd files as c*tmpl.fd,
and duplicating and change every "tmpl" string to "cwtb" inside
as needed like this:
cp c00tmpl.fd c00cxtb.fd
perl -pi -e "s/tmpl/cwtb/;" c00cwtb.fd
If you use Big5 or Shift-JIS encoding, compile the bg5conv and
sjisconv utilities; under Unix-like systems you can use the bg5pdflatex
and sjispdflatex scripts to access them conveniently.
8. Testing
==========
Just pick the relevant files in the CJK/examples directory and change the
font name to match. Either call pdflatex or call latex followed by
dvipdfmx. In general, I found that dvipdfmx generates much smaller files
(1/3 to 1/2 size).
9. Problems
===========
a. files can't be found
This is the most frequent problem. Setting the environment variable
KPATHSEA_DEBUG to -1 activates full debugging; you can then check
how latex/dvipdfmx/pdflatex tries to find those files. See the
kpathsea info pages for more details on debugging output.
For latex (the program) you only need the new custom-made *.fd files,
the files from CJK/texinput, and the tfm files. The *.fd files could be
broken -- check their contents. latex (the program) neither needs the
*.enc files nor the font files themselves.
If latex (the program) works, but dvipdfmx doesn't, then your dvipdfmx
configuration probably needs some tuning. Alternatively, the map files
or the font files are not found, etc. Note that dvipdfmx neither needs
the tfm files, nor the CJK/LaTeX input files, but it does need the
enc files.
pdflatex does everything in one step, so everything needs to be in the
right place.
b. Acrobat on GNU/Linux doesn't print PDF files generated with dvipdfmx
The problem is probably caused by ghostscript version 7.x which chokes
on the intermediate postscript file under some command options.
Upgrading to ghostscript 8.x should fix this printfilter problem. It is
*strongly* recommended to use ghostscript 8.11 or newer due to severe
problems with earlier versions.
c. no-font-embedded PDF files
This is quite simple to do with dvipdfmx: Just put an extra `!'
(exclamation mark) in the dvipdfmx configuration file in front of the
font which shouldn't be embedded.
A problem can arise if the PDF reader is not able to find a proper
substitution font if the font specified in the document isn't available.
I did some investigation and had a long discussion with the author of
dvipdfmx about this. Basically, it seems that win32 Acrobat Reader 6.x
will substitute any missing fonts with fonts from the Adobe CJK font
packs or from the system. Acrobat reader 5.x for GNU/Linux will only do
so -- and only with fonts from the CJK packs, not from the X server --
if the font name is one of the well-known ones for that region:
SimHei, SimSun (found on most MS Windows boxes), and some fonts of Arphic
and Dynafont which are very popular in the far east. Otherwise,
it aborts with an error message.
Besides the proprietary fonts mentioned in the last paragraph, only
Wang's fonts can be configured currently to be not embedded so that
acroread on GNU/Linux accepts them. I have spent much time looking
into this issue and apparently Acroread on GNU/Linux seems to do
font substitutions by looking at the capital letters in the font name.
Due to the missing PS name of the Wang's fonts (and our dvipdfmx
work-around on 2003-08-11 using the file name -- happened to be all
lowercase -- as the missing font name), they work by luck.
Both xpdf and ghostscript will substitute any missing fonts with a
specific font per language, if suitably configured. On Redhat 9, the
heavily adapted ghostscript will substitute automatically if some named
fonts from the CD are installed (without any extra effort); for xpdf it
is an extra few lines of configuration in ${HOME}/.xpdfrc to tell it
what font to use from the X server for substituting a missing font for a
particular language. So ghostscript works out of the box for a full RH
installation, whereas xpdf doesn't, but xpdf is more configurable and
the setting of what fall-back font to use can differ per user.
--- end ---
|