summaryrefslogtreecommitdiff
path: root/macros/xetex/latex/fontwrap/fontwrap.tex
blob: a3f9d9a4d9a13514c1bd77c66e2a8b2b1a842d0a (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
\documentclass[12pt]{article}

% Ruby markup renewal
\usepackage[overlap, CJK]{ruby}     
\renewcommand{\rubysep}{-0.3ex}
\renewcommand{\rubysize}{0.6}

% automatically wraps characters from specific unicode blocks with the relevant font tag
\usepackage{fontwrap}

% in this example, fontwrap is only allowed to process content for 'ruby' tags.
\setfontwrapallowedmacros{section,subsection,subsubsection,paragraph,subparagraph,emph}
\setfontwrapallowedenvironments{tabular}

% always good to have, in case a sentence is unmanageable and needs to be rewritten.
\overfullrule=5pt

% fontspec
\setmainfont{Palatino Linotype}

% floaty goodness
\usepackage{float}
\floatstyle{boxed}
\newfloat{block}{htbp}{blocks}

% document start
\begin{document}

  % frontmatter  
  \title{fontwrap}
  \author{Michiel Kamermans\\www.nihongoresources.com}
  \date{\today}
  \maketitle

  % set up fontwrap's default font.
  % not quite sure why I can't issue this before the document start
  \setfontwrapdefaultfont{Bitstream Cyberbit}

  % set specific unicode groups
  \setunicodegroupfont{Arabic}{Traditional Arabic}
  \setunicodegroupfont{Latin}{Palatino Linotype}
  \setunicodegroupfont{Japanese}{Ume Mincho}
  \setunicodegroupfont{Chinese}{SimHei}
  \setunicodegroupfont{Korean}{BatangChe}
  \setunicodegroupfont{Cyrillic}{Dotum}
  \setunicodegroupfont{Greek}{Arno Pro}
  
  % thai and hebrew have no group, just a block
  \setunicodeblockfont{Thai}{Cordia New}
  \setunicodeblockfont{Hebrew}{Times New Roman}


  % ----------------
  % START OF CONTENT
  % ----------------

  \section{What is fontwrap?}

  fontwrap is a Perl\TeX\ package for automatically adding font tags in multilingual
  documents. More specifically, it adds font tags between unicode block changes
  in documents that are encoded in UTF8 unicode (which is, thankfully these days,
  pretty much any new multilingual document).
  
  The whole reason most of us use \TeX\ or \LaTeX\ or the newer \LaTeXe\ or
  whichever flavour of \TeX\ you like to use, is because it lets you write your
  document with a minimal amount of placing control codes inside the actual text
  you're writing. Most of the time, your text will just be text, and you'll be
  damned if you have to add all kinds of special codes because that will make the
  source file less readable. However, when you're working in a multilingual \TeX\ document,
  you might find you're wrapping bits of "foreign" text in with macros that ensure
  the right font or other visual styling makes its way to the final document.
  fontwrap was designed to remove the need for that practice, so that your document
  stays readable.

  \begin{block}
  \fontwrap{
    \emph{Even though I am writing this on an English operating system in an English
    text editor, I can input quite a lot of different language. I can do this,
    because of the power of unicode: English, 日本語, 中國話, 한글, 조선글, الْعَرَبيّة
    , Русский язык, Ελληνικά, Tiếng Việt, ภาษาไทย , עִבְרִית and a whole scala of other
    languages all use different scripts, which all have their own place in the
    unicode 5.0 world.}
  }
  \caption{A paragraph using many different unicode blocks}
  \end{block}

  If you look closely at the example paragraph in block 1, you will see that all
  the different languages use a different font. The English font is \emph{Palatino
  Linotype}, the font for Japanese is \emph{Ume Mincho}, the font for Chinese is
  \emph{SimHei}, for Korean \emph{BatangChe}, for Arabic \emph{Traditional Arabic},
  Cyrillic uses \emph{Dotum}, Greek uses \emph{Arno Pro}, Thai uses \emph{Cordia New},
  and for Hebrew I used \emph{Times New Roman}. For those wondering, Vietnamese
  actually uses the Latin and Latin Extended Additional blocks, so it uses the same
  \emph{Palatino Linotype}\ font as the English text.
  
  In normal \TeX\ , getting all the languages marked with the right fonts, with all
  the commas and spaces using the same font as the English text, require a mad amount
  of font markup, but with fontwrap this requires no markup beyond the 'fontwrap' command:
  all I had to do to get the text to use all these different fonts is tell fontwrap which
  fonts to use for which blocks in my frontmatter, and wrap write the paragraph exactly as
  you see it in this pdf file into my .tex \textemdash\ wrapping it in the \textbackslash
  fontwrap\{\} macro then takes care of all my fonty needs.
  
  \section{Getting fontwrap working for your document}
  
  The basic procedure for getting fontwrap to work in your document is really
  quite straightforward. First, we must make sure to actually use it:
  
  \begin{verbatim}
    \usepackage{autfont}
  \end{verbatim}
  
  The rest of the code comes in the document body itself. Before we do anything
  with fontwrap, it is usually a good idea to tell it which fonts to use for
  which unicode blocks. There is one \emph{catch-all} command to do this, which
  sets the same font for every block, and several \textbackslash set commands for
  both single blocks, and informal multi-block groups. In this document, for
  instance, I use this:
  
  \begin{verbatim}
    % set up fontwrap's default font.
    \setfontwrapdefaultfont{Bitstream Cyberbit}

    % set specific unicode groups
    \setunicodegroupfont{Arabic}{Traditional Arabic}
    \setunicodegroupfont{Latin}{Palatino Linotype}
    \setunicodegroupfont{Japanese}{Ume Mincho}
    \setunicodegroupfont{Chinese}{SimHei}
    \setunicodegroupfont{Korean}{BatangChe}
    \setunicodegroupfont{Cyrillic}{Dotum}
    \setunicodegroupfont{Greek}{Arno Pro}
    
    % thai and hebrew have no group, just a block
    \setunicodeblockfont{Thai}{Cordia New}
    \setunicodeblockfont{Hebrew}{Times New Roman}
  \end{verbatim}
  
  Of course, you can set as few or as many as you like, or more importantly as
  is appropriate. If you're using a bilingual document, setting the catch-all
  binding and an extra font for the "foreign" bits is all you have to do. After
  having set up the font bindings in this way, all that's left is to type in
  whichever mix of languages you please, and surround your text with the
  \textbackslash fontwrap macro:
  
  \begin{verbatim}
    \fontwrap{
      the verbatim environment used to make this
      block of text only supports Latin, but you
      would be free to type whatever you like in
      this macro.
    }
  \end{verbatim}
  
  The only downside to this is that I cannot show the actual text from
  example paragraph 1, because the \{ verbatim\}\ environment cannot
  handle more than just Latin, and is one of the few blocks where
  fontwrap should not be used - adding font tags inside a verbatim
  block means you're going to get the \TeX\ commands in your final
  output, instead of having them processed, because that's what
  verbatim does!
  
  Moving on, \textbackslash fontwrap does not look into other macros
  and environments by default. If you want it to process text in macros
  such as \textbackslash emph or \textbackslash caption then you need
  to explicitly tell it that it is allowed to do this. This command,
  and the equivalent command for environments, goes in the preamble:
  
  \begin{verbatim}
    % allow processing of content for the following macros:
    \setfontwrapallowedmacros{section,subsection,
                              subsubsection,paragraph,
                              subparagraph,emph, caption,
                              ... }
    % allow processing of content for the following environments:
    \setfontwrapallowedenvironments{tabular, ... }
  \end{verbatim}
  
  whenever \textbackslash fontwrap is now used, it will process text
  in general document structure macros, as well as the tabular environment,
  which is useful if we use "foreign" text in any tables we're bound to
  end up using.
  
  And with that the basic use is pretty much covered.
  
  \section{Available commands}
  
  First off, \textbackslash fontwrap of course:
  
  \begin{verbatim}
    \fontwrap{ ... }
  \end{verbatim}

  and wrapped in the fontwrap verbatim environment in case whitespace really, really matters:
  
  \begin{verbatim}
    \begin{fontwrapverbatim}
      \fontwrap{ ... }
    \end{fontwrapverbatim}
  \end{verbatim}

  Secondly, the allowances:
  
  \begin{verbatim}
    \setfontwrapallowedmacros{comma delimited list}
    \setfontwrapallowedenvironments{comma delimited list}
  \end{verbatim}
  
  Thirdly, the font setup commands:
  
  \begin{verbatim}
    \setunicodegroupfont{block name}{font name}
    \setunicodeblockfont{block name}{font name}
  \end{verbatim}

  \begin{block}
    Arabic, Chinese, CJK (which combines all Chinese, Japanese
    and Korean blocks), Cyrillic, Diacritics, Greek (including some
    Coptic), Korean, Japanese, Latin, Mathematics, Phonetics, Punctuation,
    Symbols, Yi and finally, Other, which is just a lump category for everything
    else, really\dots
    \caption{All available informal group names}
  \end{block}
  
  There are several informal groups available, which are listed
  in block 2. Also not unimportant to note: these are all case
  sensitive. The "other" group is a bit of an eyesore, but for
  now it will have to do. Of course, Linear B and Ethiopian form
  informal groups too, but I just don't use them, so they will be
  given their own group when I'm done refining fontwrap, really.
  
  In addition to these groups, there are also the individual
  blocks, in case there is no group for what you want to set
  a font for, such as Hebrew, Thai, or really exotic things
  like Cuneiform or Byzantine musical symbols! There are a total
  of 158 blocks available for font binding, listed in block 3.

  \begin{block}  
    AegeanNumbers, AlphabeticPresentationForms, AncientGreekMusicalNotation,
    AncientGreekNumbers, Arabic, ArabicPresentationFormsA,
    ArabicPresentationFormsB, ArabicSupplement, Armenian, Arrows,
    Balinese, BasicLatin, Bengali, BlockElements, Bopomofo,
    BopomofoExtended, BoxDrawing, BraillePatterns, Buginese,
    Buhid, ByzantineMusicalSymbols, Cherokee, CJKCompatibility,
    CJKCompatibilityForms, CJKCompatibilityIdeographs,
    CJKCompatibilityIdeographsSupplement, CJKRadicalsSupplement,
    CJKStrokes, CJKSymbolsandPunctuation, CJKUnifiedIdeographs,
    CJKUnifiedIdeographsExtensionA, CJKUnifiedIdeographsExtensionB,
    CombiningDiacriticalMarks, CombiningDiacriticalMarksforSymbols,
    CombiningDiacriticalMarksSupplement, CombiningHalfMarks, ControlPictures,
    Coptic, CountingRodNumerals, Cuneiform, CuneiformNumbersandPunctuation,
    CurrencySymbols, CypriotSyllabary, Cyrillic, CyrillicExtendedA,
    CyrillicExtendedB, CyrillicSupplement, Deseret, Devanagari, Dingbats,
    DominoTiles, EnclosedAlphanumerics, EnclosedCJKLettersandMonths,
    Ethiopic, EthiopicExtended, EthiopicSupplement, GeneralPunctuation,
    GeometricShapes, Georgian, GeorgianSupplement, Glagolitic, Gothic,
    GreekandCoptic, GreekExtended, Gujarati, Gurmukhi, HalfwidthandFullwidthForms,
    HangulCompatibilityJamo, HangulJamo, HangulSyllables, Hanunoo, Hebrew,
    HighPrivateUseSurrogates, HighSurrogates, Hiragana, IdeographicDescriptionCharacters,
    IPAExtensions, Kanbun, KangxiRadicals, Kannada, Katakana, KatakanaPhoneticExtensions,
    Kharoshthi, Khmer, KhmerSymbols, Lao, LatinExtendedAdditional, LatinExtendedA,
    LatinExtendedB, LatinExtendedC, LatinExtendedD, LatinSupplement,
    LetterlikeSymbols, Limbu, LinearBIdeograms, LinearBSyllabary, LowSurrogates,
    MahjongTiles, Malayalam, MathematicalAlphanumericSymbols, MathematicalOperators,
    MiscellaneousMathematicalSymbolsA, MiscellaneousMathematicalSymbolsB,
    MiscellaneousSymbols, MiscellaneousSymbolsandArrows, MiscellaneousTechnical,
    ModifierToneLetters, Mongolian, MusicalSymbols, Myanmar, NewTaiLue, NKo,
    NumberForms, Ogham, OldItalic, OldPersian, OpticalCharacterRecognition,
    Oriya, Osmanya, PhagsPa, Phoenician, PhoneticExtensions, PhoneticExtensionsSupplement,
    PrivateUseArea, Runic, Shavian, Sinhala, SmallFormVariants,
    SpacingModifierLetters, Specials, SuperscriptsandSubscripts,
    SupplementalArrowsA, SupplementalArrowsB, SupplementalMathematicalOperators,
    SupplementalPunctuation, SupplementaryPrivateUseAreaA,
    SupplementaryPrivateUseAreaB, SylotiNagri, Syriac, Tagalog,
    Tagbanwa, Tags, TaiLe, TaiXuanJingSymbols, Tamil, Telugu,
    Thaana, Thai, Tibetan, Tifinagh, Ugaritic, UnifiedCanadianAboriginalSyllabics,
    VariationSelectors, VariationSelectorsSupplement, VerticalForms,
    YiRadicals, YiSyllables, and finally YijingHexagramSymbols.
    \caption{All 158 blocks available in unicode 5.0}
  \end{block}

  These, too, are case sensitive.

  \section{Running Perl\TeX\ and possible errors}
  
  Running \TeX\ files that use fontwrap means you have to use Perl\TeX\ to
  get it all to work. Luckily, Perl\TeX\ is just a \TeX\ wrapper, so you can
  tell it which \TeX\ engine to use and it will. Because fontwrap relies on
  the fontspec package, we have to use Xe\TeX :
  
  \begin{verbatim}
    perltex --latex=xelatex myfile.tex
  \end{verbatim}
  
  This should run fine, but there are three problems you might run into.
  
  \paragraph{No unicode mapping available}
  
  You get this error when \TeX\ uses a font that cannot represent the
  unicode glyphs you have written. For instance, using something other
  than Latin text in a verbatim block will cause this error. It's
  not fatal in any way, it just means that you will see empty blocks
  in your final document.

  \paragraph{Free to wrong pool}
  
  Perl\TeX\ uses Perl \emph{(fairly obviously)}\ but it does so sort
  of multithreaded. It also uses the Perl "safe" module, and that's
  where things go funky. The combination of multithread perl and "safe"
  can lead to perl trying to free the memory it used, but failing 
  at this because it tries to do so in entirely the wrong thread.
  This is completely inconsequential, other than that it can lead
  to memory leaks. Now, I made sure to unset all the perl variables
  I use once fontwrap is done, so you shouldn't run into any problems
  \emph{(unless maybe you were counting the bytes by hand)} .
  
  \paragraph{Overfull/underfull hbox}
  
  The boon of \TeX , this means that a particular sentence is
  made up of letters and spaces in such a way that \TeX\ cannot
  really get the glue stretched properly for it to look nice
  in your final document. You're going to have to go in, and
  fix the problem yourself by rephrasing the sentence... either
  that or leave it in and turn off whatever visual notification
  for problematic hboxes you use during draft generation.
  
  \section{The end\ldots}
  
  And\ldots\ I think that's it. I can't think of anything more
  to tell you with respects to using fontwrap. If you have any
  questions you can always check out the .sty file, or contact
  me through the contact page on my website, http://www.nihongoresources.com.
  
  \bigskip
  
  Enjoy!

  \bigskip
  \bigskip
  
  - Mike Kamermans
\end{document}