diff options
Diffstat (limited to 'Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex')
-rw-r--r-- | Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex | 1899 |
1 files changed, 1899 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex new file mode 100644 index 00000000000..429f8646e08 --- /dev/null +++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload-main.tex @@ -0,0 +1,1899 @@ +%% Copyright (C) 2009-2018 +%% +%% by Elie Roux <elie.roux@telecom-bretagne.eu> +%% and Khaled Hosny <khaledhosny@eglug.org> +%% and Philipp Gesang <phg@phi-gamma.net> +%% +%% This file is part of Luaotfload. +%% +%% Home: https://github.com/lualatex/luaotfload +%% Support: <lualatex-dev@tug.org>. +%% +%% Luaotfload is under the GPL v2.0 (exactly) license. +%% +%% ---------------------------------------------------------------------------- +%% +%% Luaotfload is free software; you can redistribute it and/or +%% modify it under the terms of the GNU General Public License +%% as published by the Free Software Foundation; version 2 +%% of the License. +%% +%% Luaotfload is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%% GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with Luaotfload; if not, see <http://www.gnu.org/licenses/>. +%% +%% ---------------------------------------------------------------------------- +%% + +\beginfrontmatter + + \setdocumenttitle {The \identifier{luaotfload} package} + \setdocumentdate {2018/09/24 v2.9} + \setdocumentauthor {Elie Roux · Khaled Hosny · Philipp Gesang · Ulrike Fischer\\ + Home: \hyperlink {https://github.com/lualatex/luaotfload}\\ + New Home: \hyperlink {https://github.com/u-fischer/luaotfload}\\ + Support: \email {lualatex-dev@tug.org}} + + \typesetdocumenttitle + + \beginabstractcontent + This package is an adaptation of the \CONTEXT font loading system. + It allows for loading \OpenType fonts with an extended syntax and adds + support for a variety of font features. + + After discussion of the font loading API, this manual gives an + overview of the core components of \identifier{Luaotfload}: The + packaged font loader code, the names database, configuration, and + helper functions on the \LUA\ end. + \endabstractcontent + +\endfrontmatter + +\typesetcontent + +\beginsection {New in version 2.9 (by Ulrike Fischer)} + +On the one side there is not very much new in this version: The native components of \identifier{Luaotfload} are nearly unchanged. A few bugs have been corrected, the various files lists which loads the components of the font loader have been cleaned up. + +On the other side there is a lot new: + +\begindescriptions + + \beginaltitem {Fontloader} The fontloader files imported from \CONTEXT\ have been updated to the current version. + This was necessary to make \identifier{Luaotfload} compatible with the comimg \LUATEX 1.08. Compared to the previous version from february 2017 quite a number of things have changed. Most importantly the handling of arabic fonts has greatly improved. But this also means that changes in the output are possible. + \endaltitem + + \beginaltitem {Lualibs} The update of the fontloader files also required an update of the \identifier{Lualibs} package. This \identifier{Luaotfload} versions needs version 2.6 of \identifier{Lualibs}. + \endaltitem + + \beginaltitem {Maintenance} As the current maintainer wasn't available and it was urgent to get a \identifier{Luaotfload} compatible with \LUATEX 1.08 maintenance has been transfered to Ulrike Fischer and Marcel Krüger. The package is currently maintained and developed at \hyperlink{https://github.com/u-fischer/luaotfload.git}. Issues should be reported there. + \endaltitem + + \beginaltitem {Documentation} + The core of documentation is nearly unchanged. I added this introduction. I recreated with the help of @marmot the graphic. I updated the file lists. I imported as appendix pdf versions of the two man files which are part of the \identifier{Luaotfload} documentation. + \endaltitem + +\enddescriptions + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Introduction} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Font management and installation has always been painful with \TEX. A +lot of files are needed for one font (\abbrev{tfm}, \abbrev{pfb}, +\abbrev{map}, \abbrev{fd}, \abbrev{vf}), and due to the 8-Bit encoding +each font is limited to 256 characters. + +But the font world has evolved since the original \TEX, and new +typographic systems have appeared, most notably the so called +\emphasis{smart font} technologies like \OpenType fonts (\abbrev{otf}). + +These fonts can contain many more characters than \TEX fonts, as well +as additional functionality like ligatures, old-style numbers, small +capitals, etc., and support more complex writing systems like Arabic +and Indic\footnote{% + Unfortunately, \identifier{luaotfload} doesn‘t support many Indic + scripts right now. + Assistance in implementing the prerequisites is greatly + appreciated. +} +scripts. + +\OpenType fonts are widely deployed and available for all modern +operating systems. + +As of 2013 they have become the de facto standard for advanced text +layout. + +However, until recently the only way to use them directly in the \TEX +world was with the \XETEX engine. + +Unlike \XETEX, \LUATEX has no built-in support for \OpenType or +technologies other than the original \TEX fonts. + +Instead, it provides hooks for executing \LUA code during the \TEX run +that allow implementing extensions for loading fonts and manipulating +how input text is processed without modifying the underlying engine. + +This is where \identifier{luaotfload} comes into play: +Based on code from \CONTEXT, it extends \LUATEX with functionality necessary +for handling \OpenType fonts. + +Additionally, it provides means for accessing fonts known to the operating +system conveniently by indexing the metadata. + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Thanks} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\identifier{Luaotfload} is part of \LUALATEX, the community-driven +project to provide a foundation for using the \LATEX format with the +full capabilites of the \LUATEX engine. +% +As such, the distinction between end users, contributors, and project +maintainers is intentionally kept less strict, lest we unduly +personalize the common effort. + +Nevertheless, the current maintainers would like to express their +gratitude to Khaled Hosny, Akira Kakuto, Hironori Kitagawa and Dohyun +Kim. +% +Their contributions -- be it patches, advice, or systematic +testing -- made the switch from version 1.x to 2.2 possible. +% +Also, Hans Hagen, the author of the font loader, made porting the +code to \LATEX a breeze due to the extra effort he invested into +isolating it from the rest of \CONTEXT, not to mention his assistance +in the task and willingness to respond to our suggestions. + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Loading Fonts} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\identifier{luaotfload} supports an extended font request syntax: + +\beginnarrower + \nonproportional{\string\font\string\foo\space= \string{}% + \meta{prefix}\nonproportional{:}% + \meta{font name}\nonproportional{:}% + \meta{font features}\nonproportional{\string}}% + \meta{\TEX font features} +\endnarrower + +\noindent +The curly brackets are optional and escape the spaces in the enclosed +font name. +% +Alternatively, double quotes serve the same purpose. +% +A selection of individual parts of the syntax are discussed below; +for a more formal description see figure \ref{font-syntax}. + +\beginsyntaxfloat + {font-syntax} + {Font request syntax. + Braces or double quotes around the + \emphasis{specification} rule will + preserve whitespace in file names. + In addition to the font style modifiers + (\emphasis{slash-notation}) given above, there + are others that are recognized but will be silently + ignored: \nonproportional{aat}, + \nonproportional{icu}, and + \nonproportional{gr}. + The special terminals are: + \smallcaps {feature\textunderscore id} for a valid font + feature name and + \smallcaps {feature\textunderscore value} for the corresponding + value. + \smallcaps {tfmname} is the name of a \abbrev{tfm} file. + \smallcaps {digit} again refers to bytes 48--57, and + \smallcaps {all\textunderscore characters} to all byte values. + \smallcaps {csname} and \smallcaps {dimension} are the \TEX concepts.} +% + <definition> ::= `\\font', {\sc csname}, `=', <font request>, [ <size> ] ; + + <size> ::= `at', {\sc dimension} ; + + <font request> ::= `"', <unquoted font request> `"' + \alt `{', <unquoted font request> `}' + \alt <unquoted font request> ; + + <unquoted font request> ::= <specification>, [`:', <feature list> ] + \alt <path lookup>, [ [`:'], <feature list> ] ; + + <specification> ::= <prefixed spec>, [ <subfont no> ], \{ <modifier> \} + \alt <anon lookup>, \{ <modifier> \} ; + + <prefixed spec> ::= `combo:', <combo list> + \alt `file:', <file lookup> + \alt `name:', <name lookup> ; + + <combo list> ::= <combo def 1>, \{ `;', <combo def> \} ; + + <combo def 1> ::= <combo id>, `->', <combo id> ; + + <combo def> ::= <combo id>, `->', <combo id chars> ; + + <combo id> ::= (`(', \{ {\sc digit} \}, `)' | \{ {\sc digit} \} ) ; + + <combo id chars> ::= (`(', \{ {\sc digit} \}, `,', <combo chars>, `)' + \alt \{ {\sc digit} \} ) ; + + <combo chars> ::= `fallback' + \alt \{ <combo range>, \{ `*', <combo range> \} \} ; + + <combo range> ::= <combo num>, [ `-', <combo num> ] ; + + <combo num> ::= `0x', \{ {\sc hexdigit} \} + \alt `U+', \{ {\sc digit} \} + \alt \{ {\sc digit} \} ; + + <file lookup> ::= \{ <name character> \} ; + + <name lookup> ::= \{ <name character> \} ; + + <anon lookup> ::= {\sc tfmname} | <name lookup> ; + + <path lookup> ::= `[', \{ <path content> \}, `]', [ <subfont no> ] ; + + <path content> ::= <path balanced> + \alt `\\', {\sc all_characters} + \alt {\sc all_characters} - `]' + + <path balanced> ::= `[', [ <path content> ], `]' + + <modifier> ::= `/', (`I' | `B' | `BI' | `IB' | `S=', \{ {\sc digit} \} ) ; + + <subfont no> ::= `(', \{ {\sc digit} \}, `)' ; + + <feature list> ::= <feature expr>, \{ `;', <feature expr> \} ; + + <feature expr> ::= {\sc feature_id}, `=', {\sc feature_value} + \alt <feature switch>, {\sc feature_id} ; + + <feature switch> ::= `+' | `-' ; + + <name character> ::= {\sc all_characters} - ( `(' | `/' | `:' ) ; +\endsyntaxfloat + +%% Below guarded space gets borked in index; why‽ +\beginsubsection{Prefix -- the \identifier{luaotfload}{ }Way} + +In \identifier{luaotfload}, the canonical syntax for font requests +requires a \emphasis{prefix}: +% +\beginnarrower + \nonproportional{\string\font\string\fontname\space= }% + \meta{prefix}% + \nonproportional{:}% + \meta{fontname}% + \dots +\endnarrower +% +where \meta{prefix} is either \inlinecode{file:} or \inlinecode {name:}.\footnote{% + \identifier{Luaotfload} also knows two further prefixes, \inlinecode {kpse:} + and \inlinecode {my:}. + % + A \inlinecode {kpse} lookup is restricted to files that can be found by + \identifier{kpathsea} and will not attempt to locate system fonts. + % + This behavior can be of value when an extra degree of encapsulation is + needed, for instance when supplying a customized tex distribution. + + The \inlinecode {my} lookup takes this a step further: it lets you define + a custom resolver function and hook it into the \luaident{resolve_font} + callback. + % + This ensures full control over how a file is located. + % + For a working example see the + \hyperlink [test repo]{https://bitbucket.org/phg/lua-la-tex-tests/src/5f6a535d/pln-lookup-callback-1.tex}. +} +% +It determines whether the font loader should interpret the request as +a \emphasis{file name} or + \emphasis{font name}, respectively, +which again influences how it will attempt to locate the font. +% +Examples for font names are + “Latin Modern Italic”, + “GFS Bodoni Rg”, and + “PT Serif Caption” +-- they are the human readable identifiers +usually listed in drop-down menus and the like.\footnote{% + Font names may appear like a great choice at first because they + offer seemingly more intuitive identifiers in comparison to arguably + cryptic file names: + % + “PT Sans Bold” is a lot more descriptive than \fileent{PTS75F.ttf}. + On the other hand, font names are quite arbitrary and there is no + universal method to determine their meaning. + % + While \identifier{luaotfload} provides fairly sophisticated heuristic + to figure out a matching font style, weight, and optical size, it + cannot be relied upon to work satisfactorily for all font files. + % + For an in-depth analysis of the situation and how broken font names + are, please refer to + \hyperlink [this post]{http://www.ntg.nl/pipermail/ntg-context/2013/073889.html} + by Hans Hagen, the author of the font loader. + % + If in doubt, use filenames. + % + \fileent{luaotfload-tool} can perform the matching for you with the + option \inlinecode {--find=<name>}, and you can use the file name it returns + in your font definition. +} +% +In order for fonts installed both in system locations and in your +\fileent{texmf} to be accessible by font name, \identifier{luaotfload} must +first collect the metadata included in the files. +% +Please refer to section~\ref{sec:fontdb} below for instructions on how to +create the database. + +File names are whatever your file system allows them to be, except +that that they may not contain the characters + \inlinecode {(}, + \inlinecode {:}, and + \inlinecode {/}. +% +As is obvious from the last exception, the \inlinecode {file:} lookup will +not process paths to the font location -- only those +files found when generating the database are addressable this way. +% +Continue below in the \XETEX section if you need to load your fonts +by path. +% +The file names corresponding to the example font names above are + \fileent{lmroman12-italic.otf}, + \fileent{GFSBodoni.otf}, and + \fileent{PTZ56F.ttf}. + +\endsubsection + +\beginsubsection {Bracketed Lookups} +\label{sec:bracket} +Bracketed lookups allow for arbitrary character content to be used in a +definition. +% +A simple bracketed request looks follows the scheme + +\beginnarrower + \nonproportional{\string\font\string\fontname\space = [}% + \meta{/path/to/file}% + \nonproportional{]} +\endnarrower + +\noindent +Inside the square brackets, every character except for a closing bracket is +permitted, allowing for arbitrary paths to a font file -- including Windows +style paths with UNC or drive letter prepended -- to be specified. +% +The \identifier{Luaotfload} syntax differs from \XETEX in that the subfont +selector goes \emphasis{after} the closing bracket: + +\beginnarrower + \nonproportional{\string\font\string\fontname\space = [}% + \meta{/path/to/file}% + \nonproportional{]} + \nonproportional{(}n\nonproportional{)} +\endnarrower + +Naturally, path-less file names are equally valid and processed the +same way as an ordinary \inlinecode {file:} lookup. + +\beginsubsection {Compatibility} + +In addition to the regular prefixed requests, \identifier{luaotfload} +accepts loading fonts the \XETEX way. +% +There are again two modes: bracketed and unbracketed. +For the bracketed variety, see above, \ref{sec:bracket}. + +Unbracketed (or, for lack of a better word: \emphasis{anonymous}) +font requests resemble the conventional \TEX syntax. + +\beginnarrower + \nonproportional{\string\font\string\fontname\space= }% + \meta{font name} + \dots +\endnarrower +\endsubsection + +However, they have a broader spectrum of possible interpretations: +before anything else, \identifier{luaotfload} attempts to load a +traditional \TEX Font Metric (\abbrev{tfm} or \abbrev{ofm}). +% +If this fails, it performs a \inlinecode {path:} lookup, which itself will +fall back to a \inlinecode {file:} lookup. +% +Lastly, if none of the above succeeded, attempt to resolve the request as a +\inlinecode {name:} lookup by searching the font index for \meta{font name}. +% +The behavior of this “anonymous” lookup is configurable, see the configuation +manpage for details. + +Furthermore, \identifier{luaotfload} supports the slashed (shorthand) +font style notation from \XETEX. + +\beginnarrower + \nonproportional{\string\font\string\fontname\space= }% + \meta{font name}% + \nonproportional{/}% + \meta{modifier} + \dots +\endnarrower + +\noindent +Currently, four style modifiers are supported: + \inlinecode {I} for italic shape, + \inlinecode {B} for bold weight, + \inlinecode {BI} or \inlinecode {IB} for the combination of both. +% +Other “slashed” modifiers are too specific to the \XETEX engine and +have no meaning in \LUATEX. + +\endsubsection + +\beginsubsection{Examples} + +\beginsubsubsection{Loading by File Name} + +For example, conventional \TeX\ font can be loaded with a +\inlinecode {file:} request like so: + +\beginlisting + \font \lmromanten = {file:ec-lmr10} at 10pt +\endlisting + +The \OpenType version of Janusz Nowacki’s font \emphasis{Antykwa +Półtawskiego}\footnote{% + \hyperlink {http://jmn.pl/antykwa-poltawskiego/}, also available in + in \TEX Live. +} +in its condensed variant can be loaded as follows: + +\beginlisting + \font \apcregular = file:antpoltltcond-regular.otf at 42pt +\endlisting + +The next example shows how to load the \emphasis{Porson} font digitized by +the Greek Font Society using \XETEX-style syntax and an absolute path from a +non-standard directory: + +\beginlisting + \font \gfsporson = "[/tmp/GFSPorson.otf]" at 12pt +\endlisting + +\identifier{TrueType} collection files (the extension is usually +\inlinecode{.ttc}) contain more than a single font. In order to refer to these +subfonts, the respective index may be added in parentheses after the file +name.\footnote{% + Incidentally, this syntactical detail also prevents one from loading files + that end in balanced parentheses. +} + +\beginlisting + \font \cambriamain = "file:cambria.ttc(0)" at 10pt + \font \cambriamath = "file:cambria.ttc(1)" at 10pt +\endlisting + +and likewise, requesting subfont inside a TTC container by path: + +\beginlisting + \font \asanamain = "[/home/typesetter/.fonts/math/asana.ttc](0):mode=node;+tlig" at 10pt + \font \asanamath = "[/home/typesetter/.fonts/math/asana.ttc](1):mode=base" at 10pt +\endlisting + +\endsubsubsection + +\beginsubsubsection{Loading by Font Name} + +The \inlinecode {name:} lookup does not depend on cryptic filenames: + +\beginlisting + \font \pagellaregular = {name:TeX Gyre Pagella} at 9pt +\endlisting + +A bit more specific but essentially the same lookup would be: + +\beginlisting + \font \pagellaregular = {name:TeX Gyre Pagella Regular} at 9pt +\endlisting + +\noindent +Which fits nicely with the whole set: + +\beginlisting + \font\pagellaregular = {name:TeX Gyre Pagella Regular} at 9pt + \font\pagellaitalic = {name:TeX Gyre Pagella Italic} at 9pt + \font\pagellabold = {name:TeX Gyre Pagella Bold} at 9pt + \font\pagellabolditalic = {name:TeX Gyre Pagella Bolditalic} at 9pt + + {\pagellaregular foo bar baz\endgraf} + {\pagellaitalic foo bar baz\endgraf} + {\pagellabold foo bar baz\endgraf} + {\pagellabolditalic foo bar baz\endgraf} + + ... +\endlisting + +\endsubsubsection + +\beginsubsubsection{Modifiers} + +If the entire \emphasis{Iwona} family\footnote{% + \hyperlink {http://jmn.pl/kurier-i-iwona/}, + also in \TEX Live. +} +is installed in some location accessible by \identifier{luaotfload}, +the regular shape can be loaded as follows: + +\beginlisting + \font \iwona = Iwona at 20pt +\endlisting + +\noindent +To load the most common of the other styles, the slash notation can +be employed as shorthand: + +\beginlisting + \font \iwonaitalic = Iwona/I at 20pt + \font \iwonabold = Iwona/B at 20pt + \font \iwonabolditalic = Iwona/BI at 20pt +\endlisting + +\noindent +which is equivalent to these full names: + +\beginlisting + \font \iwonaitalic = "Iwona Italic" at 20pt + \font \iwonabold = "Iwona Bold" at 20pt + \font \iwonabolditalic = "Iwona BoldItalic" at 20pt +\endlisting + +\endsubsubsection +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Font features} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\emphasis{Font features} are the second to last component in the +general scheme for font requests: + +\beginnarrower + \nonproportional{\string\font\string\foo\space= "}% + \meta{prefix}% + \nonproportional{:}% + \meta{font name}% + \nonproportional{:}% + \meta{font features}% + \meta{\TEX font features}% + \nonproportional{"} +\endnarrower + +\noindent +If style modifiers are present (\XETEX style), they must precede +\meta{font features}. + +The element \meta{font features} is a semicolon-separated list of feature +tags\footnote{% + Cf. \hyperlink {http://www.microsoft.com/typography/otspec/featurelist.htm}. +} +and font options. +% +Prepending a font feature with a \inlinecode{+} (plus sign) enables it, +whereas a \inlinecode{-} (minus) disables it. For instance, the request + +\beginlisting + \font \test = LatinModernRoman:+clig;-kern +\endlisting + +\noindent activates contextual ligatures (\inlinecode{clig}) and +disables kerning (\inlinecode{kern}). +% +Alternatively the options \inlinecode{true} or \inlinecode{false} can +be passed to the feature in a key/value expression. +% +The following request has the same meaning as the last one: + +\beginlisting + \font \test = LatinModernRoman:clig=true;kern=false +\endlisting + +\noindent +Furthermore, this second syntax is required should a font feature +accept other options besides a true/false switch. +% +For example, \emphasis{stylistic alternates} (\inlinecode{salt}) are +variants of given glyphs. +% +They can be selected either explicitly by supplying the variant +index (starting from one), or randomly by setting the value to, +obviously, \inlinecode{random}. + +%% TODO verify that this actually works with a font that supports +%% the salt/random feature!\fi +\beginlisting + \font \librmsaltfirst = LatinModernRoman:salt=1 +\endlisting + +\beginsubsection {Basic font features} + +\begindescriptions + + \beginaltitem {mode} + \identifier{luaotfload} has two \OpenType processing + \emphasis{modes}: + \identifier{base} and \identifier{node}. + + \identifier{base} mode works by mapping \OpenType + features to traditional \TEX ligature and kerning mechanisms. + % + Supporting only non-contextual substitutions and kerning + pairs, it is the slightly faster, albeit somewhat limited, variant. + % + \identifier{node} mode works by processing \TeX’s internal + node list directly at the \LUA end and supports + a wider range of \OpenType features. + % + The downside is that the intricate operations required for + \identifier{node} mode may slow down typesetting especially + with complex fonts and it does not work in math mode. + + By default \identifier{luaotfload} is in \identifier{node} + mode, and \identifier{base} mode has to be requested where needed, + e.~g. for math fonts. + \endaltitem + + \beginaltitem {script} \label{script-tag} + An \OpenType script tag;\footnote{% + See \hyperlink {http://www.microsoft.com/typography/otspec/scripttags.htm} + for a list of valid values. + % + For scripts derived from the Latin alphabet the value + \inlinecode{latn} is good choice. + } + the default value is \inlinecode{dflt}. + % + Some fonts, including very popular ones by foundries like Adobe, + do not assign features to the \inlinecode{dflt} script, in + which case the script needs to be set explicitly. + \endaltitem + + \beginaltitem {language} + An \OpenType language system identifier,\footnote{% + Cf. \hyperlink {http://www.microsoft.com/typography/otspec/languagetags.htm}. + } + defaulting to \inlinecode{dflt}. + \endaltitem + + \beginaltitem {color} + A font color, defined as a triplet of two-digit hexadecimal + \abbrev{rgb} values, with an optional fourth value for + transparency + (where \inlinecode{00} is completely transparent and + \inlinecode{FF} is opaque). + + For example, in order to set text in semitransparent red: + + \beginlisting + \font \test = "Latin Modern Roman:color=FF0000BB" + \endlisting + \endaltitem + + \beginaltitem {kernfactor \& letterspace} + Define a font with letterspacing (tracking) enabled. + % + In \identifier{luaotfload}, letterspacing is implemented by + inserting additional kerning between glyphs. + + This approach is derived from and still quite similar to the + \emphasis{character kerning} (\texmacro{setcharacterkerning} / + \texmacro{definecharacterkerning} \& al.) functionality of + Context, see the file \fileent{typo-krn.lua} there. + % + The main difference is that \identifier{luaotfload} does not + use \LUATEX attributes to assign letterspacing to regions, + but defines virtual letterspaced versions of a font. + + The option \identifier{kernfactor} accepts a numeric value that + determines the letterspacing factor to be applied to the font + size. + % + E.~g. a kern factor of $0.42$ applied to a $10$ pt font + results in $4.2$ pt of additional kerning applied to each + pair of glyphs. + % + Ligatures are split into their component glyphs unless + explicitly ignored (see below). + + For compatibility with \XETEX an alternative + \identifier{letterspace} option is supplied that interprets the + supplied value as a \emphasis{percentage} of the font size but + is otherwise identical to \identifier{kernfactor}. + % + Consequently, both definitions in below snippet yield the same + letterspacing width: + + \beginlisting + \font \iwonakernedA = "file:Iwona-Regular.otf:kernfactor=0.125" + \font \iwonakernedB = "file:Iwona-Regular.otf:letterspace=12.5" + \endlisting + + Specific pairs of letters and ligatures may be exempt from + letterspacing by defining the \LUA functions + \luaident{keeptogether} and \luaident{keepligature}, + respectively, inside the namespace \inlinecode {luaotfload.letterspace}. + % + Both functions are called whenever the letterspacing callback + encounters an appropriate node or set of nodes. + % + If they return a true-ish value, no extra kern is inserted at + the current position. + % + \luaident{keeptogether} receives a pair of consecutive + glyph nodes in order of their appearance in the node list. + % + \luaident{keepligature} receives a single node which can be + analyzed into components. + % + (For details refer to the \emphasis{glyph nodes} section in the + \LUATEX reference manual.) + % + The implementation of both functions is left entirely to the + user. + \endaltitem + +\iffalse + \startbuffer [printvectors] + \directlua{inspect(fonts.protrusions.setups.default) + inspect(fonts.expansions.setups.default)} + \stopbuffer +\fi + + \beginaltitem {protrusion \& expansion} + These keys control microtypographic features of the font, + namely \emphasis{character protrusion} and \emphasis{font + expansion}. + % + Their arguments are names of \LUA tables that contain + values for the respective features.\footnote{% + For examples of the table layout please refer to the + section of the file \fileent{luaotfload-fonts-ext.lua} where the + default values are defined. + % + Alternatively and with loss of information, you can dump + those tables into your terminal by issuing + \unless \iffalse + \beginlisting + \directlua{inspect(fonts.protrusions.setups.default) + inspect(fonts.expansions.setups.default)} + \endlisting + \else + \typebuffer [printvectors] + \fi + at some point after loading \fileent{luaotfload.sty}. + } + % + For both, only the set \identifier{default} is predefined. + + For example, to define a font with the default + protrusion vector applied\footnote{% + You also need to set + \inlinecode {pdfprotrudechars=2} and + \inlinecode {pdfadjustspacing=2} + to activate protrusion and expansion, respectively. + See the + \hyperlink [\PDFTEX manual]{http://mirrors.ctan.org/systems/pdftex/manual/pdftex-a.pdf}% + for details. + }: + + \beginlisting + \font \test = LatinModernRoman:protrusion=default + \endlisting + \endaltitem +\enddescriptions + +\endsubsection + +\beginsubsection {Non-standard font features} +\identifier{luaotfload} adds a number of features that are not defined +in the original \OpenType specification, most of them +aiming at emulating the behavior familiar from other \TEX engines. +% +Currently (2014) there are three of them: + +\begindescriptions + + \beginaltitem {anum} + Substitutes the glyphs in the \abbrev{ascii} number range + with their counterparts from eastern Arabic or Persian, + depending on the value of \identifier{language}. + \endaltitem + + \beginaltitem {tlig} + Applies legacy \TEX ligatures\footnote{% + These contain the feature set \inlinecode {trep} of earlier + versions of \identifier{luaotfload}. + + Note to \XETEX users: this is the equivalent of the + assignment \inlinecode {mapping=text-tex} using \XETEX's input + remapping feature. + }: + + \unless \iffalse + %% Using braced arg syntax with inline code appears to be + %% impossible within Latex tables -- just ignore the weird + %% exclamation points below. + \begintabulate [rlrl] + \beginrow `` \newcell {\inlinecode !``! } \newcell '' \newcell {\inlinecode !''!} \endrow + \beginrow ` \newcell {\inlinecode !`! } \newcell ' \newcell {\inlinecode !'! } \endrow + \beginrow " \newcell {\inlinecode !"! } \newcell -- \newcell {\inlinecode !--!} \endrow + \beginrow --- \newcell {\inlinecode !---!} \newcell !` \newcell {\inlinecode ?!`?} \endrow + \beginrow ?` \newcell {\inlinecode !?`! } \newcell \newcell \endrow + \endtabulate + \else + %% XXX find a way to wrap these in the tabulate environment + \startframed [frame=off,width=broad,align=middle] + \startframed [frame=off,width=\dimexpr(\textwidth/2)] + \startxtable [align=middle] + \startxrow \startxcell `` \stopxcell \startxcell \inlinecode {``} \stopxcell \startxcell '' \stopxcell \startxcell \inlinecode {''} \stopxcell \stopxrow + \startxrow \startxcell ` \stopxcell \startxcell \inlinecode {`} \stopxcell \startxcell ' \stopxcell \startxcell \inlinecode {'} \stopxcell \stopxrow + \startxrow \startxcell " \stopxcell \startxcell \inlinecode {"} \stopxcell \startxcell -- \stopxcell \startxcell \inlinecode {--} \stopxcell \stopxrow + \startxrow \startxcell --- \stopxcell \startxcell \inlinecode {---} \stopxcell \startxcell !` \stopxcell \startxcell \inlinecode {!`} \stopxcell \stopxrow + \startxrow \startxcell ?` \stopxcell \startxcell \inlinecode {?`} \stopxcell \startxcell \stopxcell \startxcell \stopxcell \stopxrow + \stopxtable + \stopframed + \stopframed + \fi + \endaltitem + + \beginaltitem {itlc} + Computes italic correction values (active by default). + \endaltitem + +\enddescriptions + +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Combining fonts} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Version 2.7 and later support combining characters from multiple fonts into a +single virtualized one. This requires that the affected fonts be loaded in +advance as well as a special \emphasis{request syntax}. Furthermore, this +allows to define \emphasis{fallback fonts} to supplement fonts that may lack +certain required glyphs. + +Combinations are created by defining a font using the \luaident{combo:} prefix. + +\beginsubsection {Fallbacks} + +For example, the \identifier{Latin Modern} family of fonts does, as indicated +in the name, not provide Cyrillic glyphs. If Latin script dominates in the copy +with interspersed Cyrillic, a fallback can be created from a similiar looking +font like \identifier{Computer Modern Unicode}, taking advantage of the fact +that it too derives from Knuth’s original \identifier{Computer Modern} series: + +\beginlisting + \input luaotfload.sty + \font \lm = file:lmroman10-regular.otf:mode=base + \font \cmu = file:cmunrm.otf:mode=base + \font \lmu = "combo: 1->\fontid\lm; 2->\fontid\cmu,fallback" + \lmu Eh bien, mon prince. Gênes et Lueques ne sont plus que des + apanages, des поместья, de la famille Buonaparte. + \bye +\endlisting + +As simple as this may look on the first glance, this approach is entirely +inappropriate if more than a couple letters are required from a different font. +Because the combination pulls nothing except the glyph data, all of the +important other information that constitute a proper font -- kerning, styles, +features, and suchlike -- will be missing. + +\endsubsection %% Fallbacks + +\beginsubsection {Combinations} + +Generalizing the idea of a \emphasis{fallback font}, it is also possible to +pick definite sets of glyphs from multiple fonts. On a bad day, for instance, +it may be the sanest choice to start out with \identifier{EB Garamond} italics, +typeset all decimal digits in the bold italics of \identifier{GNU Freefont}, +and tone down the punctuation with extra thin glyphs from \identifier{Source +Sans}: + +\beginlisting + \def \feats {-tlig;-liga;mode=base;-kern} + \def \fileone {EBGaramond12-Italic.otf} + \def \filetwo {FreeMonoBoldOblique.otf} + \def \filethree {SourceSansPro-ExtraLight.otf} + + \input luaotfload.sty + + \font \one = file:\fileone :\feats + \font \two = file:\filetwo :\feats + \font \three = file:\filethree:\feats + + \font \onetwothree = "combo: 1 -> \fontid\one; + 2 -> \fontid\two, 0x30-0x39; + 3 -> \fontid\three, 0x21*0x3f; " + + {\onetwothree \TeX—0123456789—?!} + \bye +\endlisting + +\noindent Despite the atrocious result, the example demonstrates well the +syntax that is used to specify ranges and fonts. Fonts are being referred to by +their internal index which can be obtained by passing the font command into the +\texmacro{fontid} macro, e. g. \inlinecode{\fontid\one}, after a font has been +defined. The first component of the combination is the base font which will be +extended by the others. It is specified by the index alone. + +All further fonts require either the literal \inlinecode{fallback} or a list of +codepoint definitions to be appended after a comma. The elements of this list +again denote either single codepoints like \inlinecode{0x21} (referring to the +exclamation point character) or ranges of codepoints (\inlinecode{0x30-0x39}). +Elements are separated by the \identifier{ASCII} asterisk character +(\inlinecode{*}). The characters referenced in the list will be imported from +the respective font, if available. + +\endsubsection %% Combinations + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Font names database} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\label{sec:fontdb} + +As mentioned above, \identifier{luaotfload} keeps track of which +fonts are available to \LUATEX by means of a \emphasis{database}. +% +This allows referring to fonts not only by explicit filenames but +also by the proper names contained in the metadata which is often +more accessible to humans.\footnote{% + The tool \hyperlink[\fileent{otfinfo}]{http://www.lcdf.org/type/} + (comes with \TEX Live), when invoked on a font file with the + \inlinecode {-i} option, lists the variety of name fields defined for + it. +} + +When \identifier{luaotfload} is asked to load a font by a font name, +it will check if the database exists and load it, or else generate a +fresh one. +% +Should it then fail to locate the font, an update to the database is +performed in case the font has been added to the system only +recently. +% +As soon as the database is updated, the resolver will try +and look up the font again, all without user intervention. +% +The goal is for \identifier{luaotfload} to act in the background and +behave as unobtrusively as possible, while providing a convenient +interface to the fonts installed on the system. + +Generating the database for the first time may take a while since it +inspects every font file on your computer. +% +This is particularly noticeable if it occurs during a typesetting run. +In any case, subsequent updates to the database will be quite fast. + +\beginsubsection[luaotfload-tool] + {\fileent{luaotfload-tool}} + +It can still be desirable at times to do some of these steps +manually, and without having to compile a document. +% +To this end, \identifier{luaotfload} comes with the utility +\fileent{luaotfload-tool} that offers an interface to the database +functionality. +% +Being a \LUA script, there are two ways to run it: +either make it executable (\inlinecode {chmod +x} on unixoid systems) or +pass it as an argument to \fileent{texlua}.\footnote{% + Tests by the maintainer show only marginal performance gain by + running with Luigi Scarso’s + \hyperlink [\identifier{Luajit\kern-.25ex\TEX}]{https://foundry.supelec.fr/projects/luajittex/}, + which is probably due to the fact that most of the time is spent + on file system operations. + + \emphasis{Note}: + On \abbrev{MS} \identifier{Windows} systems, the script can be run + either by calling the wrapper application + \fileent{luaotfload-tool.exe} or as + \inlinecode {texlua.exe luaotfload-tool.lua}. +} +% +Invoked with the argument \inlinecode {--update} it will perform a database +update, scanning for fonts not indexed. + +\beginlisting + luaotfload-tool --update +\endlisting + +Adding the \inlinecode {--force} switch will initiate a complete +rebuild of the database. + +\beginlisting + luaotfload-tool --update --force +\endlisting + +\endsubsection + +\beginsubsection{Search Paths} + +\identifier{luaotfload} scans those directories where fonts are +expected to be located on a given system. +% +On a Linux machine it follows the paths listed in the +\identifier{Fontconfig} configuration files; +consult \inlinecode {man 5 fonts.conf} for further information. +% +On \identifier{Windows} systems, the standard location is +\inlinecode {Windows\\Fonts}, +% +while \identifier{Mac OS~X} requires a multitude of paths to +be examined. +% +The complete list is is given in table \ref{table-searchpaths}. +Other paths can be specified by setting the environment variable +\inlinecode {OSFONTDIR}. +% +If it is non-empty, then search will be extended to the included +directories. + +\tablefloat {table-searchpaths} + {List of paths searched for each supported operating system.} + {% + \unless \iffalse + \begincentered + \begintabulate [lp{.5\textwidth}] + \beginrow + Windows \newcell \inlinecode !\% WINDIR\%\\ Fonts! + \endrow + \beginrow + Linux \newcell \fileent{/usr/local/etc/fonts/fonts.conf} and\hfill\break + \fileent{/etc/fonts/fonts.conf} + \endrow + \beginrow + Mac \newcell \fileent{\textasciitilde/Library/Fonts},\break + \fileent{/Library/Fonts},\break + \fileent{/System/Library/Fonts}, and\hfill\break + \fileent{/Network/Library/Fonts} + \endrow + \endtabulate + \endcentered + \else + \setuplocalinterlinespace [14pt] + \starttabulate [|l|p(.5\textwidth)|] + \NC Windows \NC \inlinecode {\% WINDIR\%\\ Fonts} \NC \NR + \NC Linux \NC \fileent{/usr/local/etc/fonts/fonts.conf} and\crlf + \fileent{/etc/fonts/fonts.conf} \NC \NR + \NC + Mac \NC \fileent{\textasciitilde/Library/Fonts},\crlf + \fileent{/Library/Fonts},\break + \fileent{/System/Library/Fonts}, and\crlf + \fileent{/Network/Library/Fonts} \NC \NR + \stoptabulate + \fi% + } + +\endsubsection + +\beginsubsection{Querying from Outside} + +\fileent{luaotfload-tool} also provides rudimentary means of +accessing the information collected in the font database. +% +If the option \inlinecode {--find=}\emphasis{name} is given, the script will +try and search the fonts indexed by \identifier{luaotfload} for a +matching name. +% +For instance, the invocation + +\beginlisting + luaotfload-tool --find="Iwona Regular" +\endlisting + +\noindent +will verify if “Iwona Regular” is found in the database and can be +readily requested in a document. + +If you are unsure about the actual font name, then add the +\inlinecode {-F} (or \inlinecode {--fuzzy}) switch to the command line to enable +approximate matching. +% +Suppose you cannot precisely remember if the variant of +\identifier{Iwona} you are looking for was “Bright” or “Light”. +The query + +\beginlisting + luaotfload-tool -F --find="Iwona Bright" +\endlisting + +\noindent +will tell you that indeed the latter name is correct. + +Basic information about fonts in the database can be displayed +using the \inlinecode {-i} option (\inlinecode {--info}). +% +\beginlisting + luaotfload-tool -i --find="Iwona Light Italic" +\endlisting +% +\noindent +The meaning of the printed values is described in section 4.4 of the +\LUATEX reference manual.\footnote{% + In \TEX Live: \fileent{texmf-dist/doc/luatex/base/luatexref-t.pdf}. +} + +For a much more detailed report about a given font try the +\inlinecode {-I} option instead (\inlinecode {--inspect}). +\beginlisting + luaotfload-tool -I --find="Iwona Light Italic" +\endlisting + +\inlinecode {luaotfload-tool --help} will list the available command line +switches, including some not discussed in detail here. +% +For a full documentation of \identifier{luaotfload-tool} and its +capabilities refer to the manpage +(\inlinecode {man 1 luaotfload-tool}).\footnote{% + Or see \inlinecode {luaotfload-tool.rst} in the source directory. +} + +\endsubsection + +\beginsubsection {Blacklisting Fonts} +\label{font-blacklist} + +Some fonts are problematic in general, or just in \LUATEX. +% +If you find that compiling your document takes far too long or eats +away all your system’s memory, you can track down the culprit by +running \inlinecode {luaotfload-tool -v} to increase verbosity. +% +Take a note of the \emphasis{filename} of the font that database +creation fails with and append it to the file +\fileent{luaotfload-blacklist.cnf}. + +A blacklist file is a list of font filenames, one per line. +Specifying the full path to where the file is located is optional, the +plain filename should suffice. +% +File extensions (\fileent{.otf}, \fileent{.ttf}, etc.) may be omitted. +% +Anything after a percent (\inlinecode {\%}) character until the end of the line +is ignored, so use this to add comments. +% +Place this file to some location where the \identifier{kpse} +library can find it, e.~g. +\fileent{texmf-local/tex/luatex/luaotfload} if you are running +\identifier{\TEX Live},\footnote{% + You may have to run \inlinecode {mktexlsr} if you created a new file in + your \fileent{texmf} tree. +} +or just leave it in the working directory of your document. +% +\identifier{luaotfload} reads all files named +\fileent{luaotfload-blacklist.cnf} it finds, so the fonts in +\fileent{./luaotfload-blacklist.cnf} extend the global blacklist. + +Furthermore, a filename prepended with a dash character (\inlinecode{-}) is +removed from the blacklist, causing it to be temporarily whitelisted +without modifying the global file. +% +An example with explicit paths: + +\beginlisting +% example otf-blacklist.cnf +/Library/Fonts/GillSans.ttc % Luaotfload ignores this font. +-/Library/Fonts/Optima.ttc % This one is usable again, even if + % blacklisted somewhere else. +\endlisting + +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {The Fontloader} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\beginsubsection {Overview} + +To a large extent, \identifier{luaotfload} relies on code originally +written by Hans Hagen for the +\hyperlink[\identifier{\CONTEXT}]{http://wiki.contextgarden.net} +format. +% +It integrates the font loader, written entirely in \LUA, as distributed +in the \identifier{\LUATEX-Fonts} package. +% +The original \LUA source files have been combined using the \CONTEXT +packaging library into a single, self-contained blob. In +this form the font loader depends only on the \identifier{lualibs} +package and requires only minor adaptions to integrate into +\identifier{luaotfload}. + +The guiding principle is to let \CONTEXT/\LUATEX-Fonts take care of the +implementation, and update the imported code as frequently as +necessary. +% +As maintainers, we aim at importing files from upstream essentially +\emphasis{unmodified}, except for renaming them to prevent name +clashes. +% +This job has been greatly alleviated since the advent of +\LUATEX-Fonts, prior to which the individual dependencies had to be +manually spotted and extracted from the \CONTEXT source code in a +complicated and error-prone fashion. + +\endsubsection + +\beginsubsection {Contents and Dependencies} + +Below is a commented list of the files distributed with +\identifier{luaotfload} in one way or the other. +% +See see the figure on page \pageref{file-graph} for a +graphical representation of the dependencies. +% +\label{package}% +Through the script \fileent{mkimport} a \CONTEXT library +is invoked to create the \identifier{luaotfload} fontloader as a merged +(amalgamated) source file.\footnote{% + In \CONTEXT, this facility can be accessed by means of a + \hyperlink[script]{https://bitbucket.org/phg/context-mirror/src/beta/scripts/context/lua/mtx-package.lua?at=beta} + which is integrated into \fileent{mtxrun} as a subcommand. + Run \inlinecode {mtxrun --script package --help} to display further + information. + For the actual merging code see the file + \fileent{util-mrg.lua} that is part of \CONTEXT. +} +% +This file constitutes the “default fontloader” and is part of the +\identifier{luaotfload} package as \fileent{fontloader-YY-MM-DD.lua}, +where the uppercase letters are placeholders for the build date. +% +A companion to it, \fileent{luatex-basics-gen.lua} (renamed to \fileent{fontloader-basics-gen.lua} in \identifier{luaotfload}) +must be loaded beforehand to set up parts of the environment required by the \CONTEXT +libraries. +% +During a \TEX\ run, the fontloader initialization and injection happens +in the module \fileent{luaotfload-init.lua}. +% +Additionally, the “reference fontloader” as imported from \LUATEX-Fonts +is provided as the file \fileent{fontloader-reference.lua}. +% +This file is self-contained in that it packages all the auxiliary \LUA +libraries too, as Luaotfload did up to the 2.5 series; since that job +has been offloaded to the \identifier{Lualibs} package, loading this +fontloader introduces a certain code duplication. + +A number of \emphasis{\LUA utility libraries} are not part of the +\identifier{luaotfload} fontloader, contrary to its equivalent in +\LUATEX-Fonts. These are already provided by the \identifier{lualibs} +and have thus been omitted from the merge.\footnote{% + Faithful listeners will remember the pre-2.6 era when the fontloader + used to be integrated as-is which caused all kinds of code + duplication with the pervasive \identifier{lualibs} package. + This conceptual glitch has since been amended by tightening the + coupling with the excellent \CONTEXT\ toolchain. +} + +\begindoublecolumns + \begindefinitions + \directlua{ printctxlibslist ()} + \enddefinitions +\enddoublecolumns + +The reference fontloader is home to several \LUA files that can be +grouped twofold as below: + +\begindefinitions + \beginnormalitem + The \emphasis{font loader} itself. + These files have been written for \LUATEX-Fonts and they are + distributed along with \identifier{luaotfload} so as to resemble + the state of the code when it was imported. Their purpose is either + to give a slightly aged version of a file if upstream considers + latest developments for not yet ready for use outside Context; or, + to install placeholders or minimalist versions of APIs relied upon + but usually provided by parts of Context not included in the + fontloader. + \begindoublecolumns + \begindefinitions + \directlua{printctxallgenericlist ()} + \enddefinitions + \enddoublecolumns + \endnormalitem + + \beginnormalitem + Code related to \emphasis{font handling and node processing}, taken + directly from \CONTEXT. + \begindoublecolumns + \begindefinitions + \directlua{printctxfontlist ()} + \enddefinitions + \enddoublecolumns + \endnormalitem +\enddefinitions + +As an alternative to the merged file, \identifier {Luaotfload} may load +individual unpackaged \LUA libraries that come with the source, or even +use the files from Context directly. +% +Thus if you prefer running bleeding edge code from the \CONTEXT beta, +choose the \inlinecode {context} fontloader via the configuration file +(see sections \ref{sec:conf} and \ref{sec:pkg} below). + +Also, the merged file at some point loads the Adobe Glyph List from a +\LUA table that is contained in \fileent{luaotfload-glyphlist.lua}, +which is automatically generated by the script +\fileent{mkglyphlist}.\footnote{% + See \fileent{luaotfload-font-enc.lua}. + The hard-coded file name is why we have to replace the procedure + that loads the file in \fileent{luaotfload-init.lua}. +} +% +There is a make target \identifier{glyphs} that will create a fresh +glyph list so we don’t need to import it from \CONTEXT any longer. + +In addition to these, \identifier{luaotfload} requires a number of +files not contained in the merge. Some of these have no equivalent in +\LUATEX-Fonts or \CONTEXT, some were taken unmodified from the latter. + + +\beginfilelist + \beginaltitem {luaotfload-features.lua} + font feature handling; incorporates some of the code from + \fileent{font-otc} from \CONTEXT; + \endaltitem + \beginaltitem {luaotfload-configuration.lua} + handling of \fileent{luaotfload.conf(5)}. + \endaltitem + \beginaltitem {luaotfload-log.lua} + overrides the \CONTEXT logging functionality. + \endaltitem + \beginaltitem {luaotfload-loaders.lua} + registers readers in the fontloader for various kinds of + font formats + \endaltitem + \beginaltitem {luaotfload-parsers.lua} + various \abbrev{lpeg}-based parsers. + \endaltitem + \beginaltitem {luaotfload-database.lua} + font names database. + \endaltitem + \beginaltitem {luaotfload-resolvers.lua} + file name resolvers. + \endaltitem + \beginaltitem {luaotfload-colors.lua} + color handling. + \endaltitem + \beginaltitem {luaotfload-auxiliary.lua} + access to internal functionality for package authors (proposals + for additions welcome). + \endaltitem + \beginaltitem {luaotfload-letterspace.lua} + font-based letterspacing. + \endaltitem + \beginaltitem {luaotfload-filelist.lua} + data about the files in the package. + \endaltitem +\endfilelist + +%\figurefloat +% {file-graph} +% {Schematic of the files in \identifier{Luaotfload}} +% {filegraph.pdf} + +\endsubsection + +\beginsubsection {Packaging} + +\label{sec:pkg}% +The fontloader code is integrated as an isolated component that can be +switched out on demand. +% +To specify the fontloader you wish to use, the configuration file +(described in section \ref{sec:conf}) provides the option +\inlinecode{fontloader}. +% +Its value can be one of the identifiers \inlinecode{default} or +\inlinecode{reference} (see above, section \ref{package}) or the name +of a file somewhere in the search path of \LUATEX. +% +This will make \identifier {Luaotfload} locate the \CONTEXT source by +means of \identifier{kpathsea} lookups and use those instead of the +merged package. +% +The parameter may be extended with a path to the \CONTEXT +\fileent{texmf}, separated with a colon: + +\beginlisting +[run] + fontloader = context:~/context/tex/texmf-context +\endlisting + +\noindent This setting allows accessing an installation -- e. g. the +standalone distribution or a source repository -- outside the current +\TEX distribution. + +Like the \identifier{Lualibs} package, the fontloader is deployed as a +\emphasis{merged package} containing a series of \LUA files joined +together in their expected order and stripped of non-significant parts. +% +The \fileent{mkimport} utility assists in pulling the files from a +\CONTEXT tree and packaging them for use with \identifier{Luaotfload}.% +% +The state of the files currently in \identifier{Luaotfload}’s +repository can be queried: +\beginlisting +./scripts/mkimport news +\endlisting +% +The subcommand for importing takes the prefix of the desired \CONTEXT +\identifier{texmf} as an optional argument: +\beginlisting +./scripts/mkimport import ~/context/tex/texmf-context +\endlisting +% +Whereas the command for packaging requires a path to the +\emphasis{package description file} and the output name to be passed. +\beginlisting +./scripts/mkimport package fontloader-custom.lua +\endlisting + +From the toplevel makefile, the targets \inlinecode{import} and +\inlinecode{package} provide easy access to the commands as invoked during +the \identifier{Luaotfload} build process.\footnote{% + \emphasis{Hint for those interested in the packaging process}: issue + \inlinecode{make show} for a list of available build routines. +} +These will call \inlinecode{mkimport} script with the correct +parameters to generate a datestamped package. +% +Whether files have been updated in the upstream distribution can be +queried by \inlinecode{./scripts/mkimport news}. +% +This will compare the imported files with their counterparts in the +\CONTEXT distribution and report changes. + +\endsubsection + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Configuration Files} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\beginnarrower + \emphasis{Caution}: For the authoritative documentation, consult the + manpage for \fileent{luaotfload.conf(5)}. +\endnarrower + +\label{sec:conf} +The runtime behavior of \identifier{Luaotfload} can be customized by +means of a configuration file. +% location +At startup, it attempts to locate a file called \fileent +{luaotfload.conf} or \fileent {luaotfloadrc} at a number of candidate +locations: + +\begincentered + \begindefinitions + \beginnormalitem \fileent{./luaotfload.conf} \endnormalitem + \beginnormalitem \fileent{./luaotfloadrc} \endnormalitem + \beginnormalitem \fileent{\$XDG_CONFIG_HOME/luaotfload/luaotfload.conf} \endnormalitem + \beginnormalitem \fileent{\$XDG_CONFIG_HOME/luaotfload/luaotfload.rc} \endnormalitem + \beginnormalitem \fileent{~/.luaotfloadrc} \endnormalitem + \enddefinitions +\endcentered + +\beginnarrower + \emphasis{Caution}: The configuration potentially modifies the final + document. A project-local file belongs under version control along + with the rest of the document. This is to ensure that everybody who + builds the project also receives the same customizations as the + author. +\endnarrower + +% syntax +The syntax is fairly close to the format used by +\fileent{git-config(1)} which in turn was derived from the popular +\identifier{.INI} format: Lines of key-value pairs are grouped under +different configuration “sections”.\footnote{% + The configuration parser in \fileent {luoatfload-parsers.lua} might + be employed by other packages for similar purposes. +} +% example settings +An example for customization via \fileent {luaotfload.conf} might look +as below: + +\beginlisting +; Example luaotfload.conf containing a rudimentary configuration +[db] + update-live = false +[run] + color-callback = pre_linebreak_filter + definer = info_patch + log-level = 5 +[default-features] + global = mode=base +\endlisting + +This specifies that for the given project, \identifier{Luaotfload} +shall not attempt to automatically scan for fonts if it can’t resolve a +request. The font-based colorization will happen during \LUATEX’s +pre-linebreak filter. The fontloader will output verbose information +about the fonts at definition time along with globally increased +verbosity. Lastly, the fontloader defaults to the less expensive +\luaident{base} mode like it does in \CONTEXT. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Auxiliary Functions} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +With release version 2.2, \identifier{Luaotfload} received +additional functions for package authors to call from outside +(see the file \fileent{luaotfload-auxiliary.lua} for details). +% +The purpose of this addition twofold. +% +Firstly, \identifier{luaotfload} failed to provide a stable interface +to internals in the past which resulted in an unmanageable situation +of different packages abusing the raw access to font objects by means +of the \luaident{patch_font} callback. +% +When the structure of the font object changed due to an update, all +of these imploded and several packages had to be fixed while +simultaneously providing fallbacks for earlier versions. +% +Now the patching is done on the \identifier{luaotfload} side and can +be adapted with future modifications to font objects without touching +the packages that depend on it. +% +Second, some the capabilities of the font loader and the names +database are not immediately relevant in \identifier{luaotfload} +itself but might nevertheless be of great value to package authors or +end users. + +Note that the current interface is not yet set in stone and the +development team is open to suggestions for improvements or +additions. + +\beginsubsection {Callback Functions} + +The \luaident{patch_font} callback is inserted in the wrapper +\identifier{luaotfload} provides for the font definition callback. +% +At this place it allows manipulating the font object immediately after +the font loader is done creating it. +% +For a short demonstration of its usefulness, here is a snippet that +writes an entire font object to the file \fileent{fontdump.lua}: + +\beginlisting + \input luaotfload.sty + \directlua{ + local dumpfile = "fontdump.lua" + local dump_font = function (tfmdata) + local data = table.serialize(tfmdata) + io.savedata(dumpfile, data) + end + + luatexbase.add_to_callback( + "luaotfload.patch_font", + dump_font, + "my_private_callbacks.dump_font" + ) + } + \font \dumpme = name:Iwona + \bye +\endlisting + +\emphasis{Beware}: this creates a Lua file of around 150,000 lines of +code, taking up 3~\abbrev{mb} of disk space. +% +By inspecting the output you can get a first impression of how a font +is structured in \LUATEX’s memory, what elements it is composed of, +and in what ways it can be rearranged. + +\beginsubsubsection {Compatibility with Earlier Versions} + +As has been touched on in the preface to this section, the structure +of the object as returned by the fontloader underwent rather drastic +changes during different stages of its development, and not all +packages that made use of font patching have kept up with every one +of it. +% +To ensure compatibility with these as well as older versions of +some packages, \identifier{luaotfload} sets up copies of or references +to data in the font table where it used to be located. +% +For instance, important parameters like the requested point size, the +units factor, and the font name have again been made accessible from +the toplevel of the table even though they were migrated to different +subtables in the meantime. + +\endsubsubsection + +\beginsubsubsection{Patches} + +These are mostly concerned with establishing compatibility with \XETEX. + +\beginfunctionlist + + \beginaltitem {set_sscale_dimens} + Calculate \texmacro{fontdimen}s 10 and 11 to emulate \XETEX. + \endaltitem + + \beginaltitem {set_capheight} + Calculates \texmacro{fontdimen} 8 like \XETEX. + \endaltitem + + \beginaltitem {patch_cambria_domh} + Correct some values of the font \emphasis{Cambria Math}. + \endaltitem + +\endfunctionlist + +\endsubsection + +\beginsubsection {Package Author’s Interface} + +As \LUATEX release 1.0 is nearing, the demand for a reliable interface +for package authors increases. + +\endsubsubsection + +\beginsubsubsection{Font Properties} + +Below functions mostly concern querying the different components of a +font like for instance the glyphs it contains, or what font features +are defined for which scripts. + +\beginfunctionlist + + \beginaltitem {aux.font_has_glyph (id : int, index : int)} + Predicate that returns true if the font \luaident{id} + has glyph \luaident{index}. + \endaltitem + + \beginaltitem {aux.slot_of_name(name : string)} + Translates an Adobe Glyph name to the corresponding glyph + slot. + \endaltitem + + \beginaltitem {aux.name_of_slot(slot : int)} + The inverse of \luaident{slot_of_name}; note that this + might be incomplete as multiple glyph names may map to the + same codepoint, only one of which is returned by + \luaident{name_of_slot}. + \endaltitem + + \beginaltitem {aux.provides_script(id : int, script : string)} + Test if a font supports \luaident{script}. + \endaltitem + + \beginaltitem {aux.provides_language(id : int, script : string, language : string)} + Test if a font defines \luaident{language} for a given + \luaident{script}. + \endaltitem + + \beginaltitem {aux.provides_feature(id : int, script : string, + language : string, feature : string)} + Test if a font defines \luaident{feature} for + \luaident{language} for a given \luaident{script}. + \endaltitem + + \beginaltitem {aux.get_math_dimension(id : int, dimension : string)} + Get the dimension \luaident{dimension} of font \luaident{id}. + \endaltitem + + \beginaltitem {aux.sprint_math_dimension(id : int, dimension : string)} + Same as \luaident{get_math_dimension()}, but output the value + in scaled points at the \TEX end. + \endaltitem + +\endfunctionlist + +\endsubsubsection + +\beginsubsubsection{Database} + +%% not implemented, may come back later +\beginfunctionlist +% \beginaltitem {aux.scan_external_dir(dir : string)} +% Include fonts in directory \luaident{dir} in font lookups without +% adding them to the database. +% + \beginaltitem {aux.read_font_index (void)} + Read the index file from the appropriate location (usually + the bytecode file \fileent{luaotfload-names.luc} somewhere + in the \fileent{texmf-var} tree) and return the result as a + table. The file is processed with each call so it is up to + the user to store the result for later access. + \endaltitem + + \beginaltitem {aux.font_index (void)} + Return a reference of the font names table used internally + by \identifier{luaotfload}. The index will be read if it + has not been loaded up to this point. Also a font scan that + overwrites the current index file might be triggered. Since + the return value points to the actual index, any + modifications to the table might influence runtime behavior + of \identifier{luaotfload}. + \endaltitem + +\endfunctionlist + +\endsubsubsection + +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Troubleshooting} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\beginsubsection {Database Generation} + +If you encounter problems with some fonts, please first update to the +latest version of this package before reporting a bug, as +\identifier{luaotfload} is under active development and still a moving +target. +% +The development takes place on \identifier{github} at +\hyperlink {https://github.com/lualatex/luaotfload} where there is an issue +tracker for submitting bug reports, feature requests and the likes. + +Bug reports are more likely to be addressed if they contain the output +of + +\beginlisting + luaotfload-tool --diagnose=environment,files,permissions +\endlisting + +\noindent Consult the man page for a description of these options. + +Errors during database generation can be traced by increasing the +verbosity level and redirecting log output to \fileent{stdout}: + +\beginlisting + luaotfload-tool -fuvvv --log=stdout +\endlisting + +\noindent or to a file in \fileent{/tmp}: + +\beginlisting + luaotfload-tool -fuvvv --log=file +\endlisting + +\noindent In the latter case, invoke the \inlinecode {tail(1)} utility on the +file for live monitoring of the progress. + +If database generation fails, the font last printed to the terminal or +log file is likely to be the culprit. +% +Please specify it when reporting a bug, and blacklist it for the time +being (see above, page \pageref{font-blacklist}). + +\endsubsection + +\beginsubsection {Font Features} + +A common problem is the lack of features for some +\OpenType fonts even when specified. +% +This can be related to the fact that some fonts do not provide features +for the \inlinecode {dflt} script (see above on page \pageref{script-tag}), +which is the default one in this package. +% +If this happens, assigning a noth script when the font is defined should +fix it. +% +For example with \inlinecode {latn}: + +\beginlisting + \font \test = file:MyFont.otf:script=latn;+liga; +\endlisting + +You can get a list of features that a font defines for scripts and +languages by querying it in \fileent{luaotfload-tool}: + +\beginlisting + luaotfload-tool --find="Iwona" --inspect +\endlisting + +\endsubsection + +\beginsubsection {\LUATEX Programming} + +Another strategy that helps avoiding problems is to not access raw +\LUATEX internals directly. +% +Some of them, even though they are dangerous to access, have not been +overridden or disabled. +% +Thus, whenever possible prefer the functions in the \luaident{aux} +namespace over direct manipulation of font objects. For example, raw +access to the \luaident{font.fonts} table like: + +\beginlisting + local somefont = font.fonts[2] +\endlisting + +\noindent can render already defined fonts unusable. +% +Instead, the function \luaident{font.getfont()} should be used +because it has been replaced by a safe variant. + +However, \luaident{font.getfont()} only covers fonts handled by the +font loader, e.~g. \identifier{OpenType} and \identifier{TrueType} +fonts, but not \abbrev{tfm} or \abbrev{ofm}. +% +Should you absolutely require access to all fonts known to \LUATEX, +including the virtual and autogenerated ones, then you need to query +both \luaident{font.getfont()} and \luaident{font.fonts}. +% +In this case, best define you own accessor: + +\beginlisting + local unsafe_getfont = function (id) + local tfmdata = font.getfont (id) + if not tfmdata then + tfmdata = font.fonts[id] + end + return tfmdata + end + + --- use like getfont() + local somefont = unsafe_getfont (2) +\endlisting + +\endsubsection +\endsection + +\beginsection {License} + +\identifier {luaotfload} is licensed under the terms of the +\hyperlink [GNU General Public License version 2.0]% + {https://www.gnu.org/licenses/old-licenses/gpl-2.0.html}. +Following the underlying fontloader code \identifier {luaotfload} +recognizes only that exact version as its license. +The „any later version” clause of the original license text as +copyrighted by the \hyperlink [Free Software Foundation]{http://www.fsf.org/} +\emphasis {does not apply} to either \identifier {luaotfload} or the +code imported from \CONTEXT. + +The complete text of the license is given as a separate file \fileent +{COPYING} in the toplevel directory of the +\hyperlink [\fileent {Luaotfload} Git repository]{https://github.com/lualatex/luaotfload/blob/master/COPYING}. +Distributions probably package it as \fileent +{doc/luatex/luaotfload/COPYING} in the relevant \fileent {texmf} tree. + +\endsection + +\endinput + +% vim:ft=tex:tw=79:et:sw=2 |