diff options
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/Makefile | 47 | ||||
| -rw-r--r-- | doc/filegraph.dot | 287 | ||||
| -rw-r--r-- | doc/luaotfload-tool.rst | 263 | ||||
| -rw-r--r-- | doc/luaotfload.dtx | 1994 | 
4 files changed, 2591 insertions, 0 deletions
diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..2040f5a --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,47 @@ +NAME		= luaotfload +DOCPDF		= $(NAME).pdf +DOCDTX		= $(NAME).dtx + +SCRIPTNAME	= luaotfload-tool +MANSOURCE	= $(SCRIPTNAME).rst +MANPAGE		= $(SCRIPTNAME).1 + +GRAPH		= filegraph +DOTPDF		= $(GRAPH).pdf +DOT		= $(GRAPH).dot + +DOCS		= $(DOTPDF) $(DOCPDF) $(MANPAGE) + +DO_LATEXMK	= @latexmk -e '$$max_repeat = 5' -pdf -lualatex -silent $< >/dev/null +# latexmk does only one run on my machine, so we’re not going to rely on it +DO_LATEX	= @lualatex -interaction=batchmode $< >/dev/null +DO_GRAPHVIZ	= @dot -Tpdf -o $@ $< > /dev/null +DO_DOCUTILS	= @rst2man $< >$@ 2>/dev/null + +doc: graph $(DOCPDF) +all: manual doc +graph: $(DOTPDF) +manual: $(MANPAGE) + +$(DOCPDF): $(DOCDTX) +	@echo "creating PDF documentation ($(DOCPDF))" +	$(DO_LATEX) +	$(DO_LATEX) + +$(MANPAGE): $(MANSOURCE) +	@echo "creating man page ($(MANPAGE))" +	$(DO_DOCUTILS) + +$(DOTPDF): $(DOT) +	@echo "creating file graph ($(DOTPDF))" +	$(DO_GRAPHVIZ) + +.PHONY: clean mrproper + +clean: +	@$(RM) -- *.log *.aux *.toc *.idx *.ind *.ilg *.out + +mrproper: clean +	@$(RM) -- $(DOCS) + +# vim:set noexpandtab:tabstop=8:shiftwidth=2 diff --git a/doc/filegraph.dot b/doc/filegraph.dot new file mode 100644 index 0000000..47db9ea --- /dev/null +++ b/doc/filegraph.dot @@ -0,0 +1,287 @@ +strict digraph luaotfload_files { //looks weird with circo ... +    compound       = true; + +//  label          = "Schematic of the files included in Luaotfload."; +//  labelloc       = "b"; + +    fontsize       = "14.4"; +    labelfontname  = "Iwona Medium Regular"; +    fontname       = "Iwona Light Regular"; +    size           = "21cm"; + +    rankdir        = LR; +    ranksep  = 0.618; +    nodesep  = 1.618; + +    edge [ +        arrowhead = onormal, +        fontname  = "Iwona Cond Regular", +        penwidth  = 1.0, +    ]; +    node [ +        //penwidth = 0.7, +        fontname = "Liberation Mono", +        fontsize = 12, +    ]; + +/* ···································································· + * file structure + * ································································· */ +    fontdbutil  -> font_names   [label="--update", +                                 style=dashed] + +    luaotfload -> otfl_fonts_merged   [label="merged"] +    luaotfload -> merged_lua_libs     [label="unmerged", style=solid] +    luaotfload -> merged_luatex_fonts [label="unmerged", style=solid] +    luaotfload -> merged_context_libs [label="unmerged", style=solid] + +    luaotfload -> luaotfload_libs +    luaotfload -> otfl_blacklist_cnf + +    otfl_fonts_merged -> merged_lua_libs     [label="merged", +                                              style=dotted, +                                              lhead=cluster_merged] +    otfl_fonts_merged -> merged_luatex_fonts [label="merged", +                                              style=dotted, +                                              lhead=cluster_merged] +    otfl_fonts_merged -> merged_context_libs [label="merged", +                                              style=dotted, +                                              lhead=cluster_merged] + +    merged_luatex_fonts -> font_age [label="luatex-fonts-enc.lua", +                                     ltail=cluster_merged] + +    fontdbutil -> fontdbutil_diagnostics [label="--diagnose"] + +    fontdbutil -> status [label="version information"] + +    fontdbutil_diagnostics -> status [constraint=no, label="hash files"] + +    merged_luatex_fonts -> characters [label="luaotfload-auxiliary.lua", +                                       ltail=cluster_merged] + +    luaotfload_libs -> font_names [label="luaotfload-database.lua"] + +    mkstatus    -> status     [label="generates from distribution files", +                               style=dashed] + +    mkglyphlist -> font_age     [label="generates from glyphlist.txt", +                                 style=dashed] + +    mkcharacters -> characters     [label="generates from Context’s char-def.lua", +                                    style=dashed] + +    subgraph { rank = same; +               mkcharacters; +               mkglyphlist; +               mkstatus; +               fontdbutil; +               luaotfload } + +/* ···································································· + * main files + * ································································· */ + +    fontdbutil        [label  = "luaotfload-tool.lua", +                       shape  = rect, +                       width  = "3.2cm", +                       height = "1.2cm", +                       color  = "#01012222", +                       style  = "filled,rounded", +                       penwidth=2] + +    fontdbutil_diagnostics [label  = "luaotfload-diagnostics.lua", +                            shape  = rect, +                            width  = "3.2cm", +                            height = "1.2cm", +                            color  = "#01012222", +                            style  = "filled,rounded", +                            penwidth=2] + +    mkstatus          [label  = "mkstatus", +                       shape  = rect, +                       width  = "3.2cm", +                       height = "1.2cm", +                       color  = "#01012222", +                       style  = "filled,rounded", +                       penwidth=2] + +    mkglyphlist       [label  = "mkglyphlist", +                       shape  = rect, +                       width  = "3.2cm", +                       height = "1.2cm", +                       color  = "#01012222", +                       style  = "filled,rounded", +                       penwidth=2] + +    mkcharacters      [label  = "mkcharacters", +                       shape  = rect, +                       width  = "3.2cm", +                       height = "1.2cm", +                       color  = "#01012222", +                       style  = "filled,rounded", +                       penwidth=2] + +    luaotfload        [label  = "luaotfload-main.lua", +                       shape  = rect, +                       width  = "3.2cm", +                       height = "1.2cm", +                       color  = "#01012222", +                       style  = "filled,rounded", +                       penwidth=2] +    /* +     *otfl_fonts        [label = "luaotfload-fonts.lua", +     *                   shape = rect, +     *                   width  = "3.2cm", +     *                   height = "1.2cm", +     *                   color  = "#01012222", +     *                   style  = "filled,rounded", +     *                   penwidth=2] +     */ +    otfl_fonts_merged [label = "luaotfload-fontloader.lua", +                       shape = rect, +                       width  = "3.2cm", +                       height = "1.2cm", +                       color  = "#01012222", +                       style  = "filled,rounded", +                       penwidth=2] + +/* ···································································· + * luaotfload files + * ································································· */ + +    characters [style      = "filled,dashed", +                shape      = rect, +                width      = "3.2cm", +                fillcolor  = "#01012222", +                color      = grey40, +                style      = "filled,dotted,rounded", +                label      = "luaotfload-characters.lua"] + +    font_age [style      = "filled,dashed", +              shape      = rect, +              width      = "3.2cm", +              fillcolor  = "#01012222", +              color      = grey40, +              style      = "filled,dotted,rounded", +              label      = "luaotfload-glyphlist.lua"] + +    font_names [style      = "filled,dashed", +                shape      = rect, +                width      = "3.2cm", +                fillcolor  = "#01012222", +                color      = grey40, +                style      = "filled,dotted,rounded", +                label      = "luaotfload-names.lua.gz\nluaotfload-names.luc"] + +    status [style      = "filled,dashed", +            shape      = rect, +            width      = "3.2cm", +            fillcolor  = "#01012222", +            color      = grey40, +            style      = "filled,dotted,rounded", +            label      = "luaotfload-status.lua"] + +    otfl_blacklist_cnf [style      = "filled,dashed", +                        shape      = rect, +                        width      = "3.2cm", +                        fillcolor  = "#01012222", +                        color      = grey40, +                        style      = "filled,dotted,rounded", +                        label      = "luaotfload-blacklist.cnf"] + +    luaotfload_libs [ +        shape      = box, +        style      = "filled,rounded", +        color      = "grey90:goldenrod4", +        fontsize   = 10, +        label      = < +            <table cellborder="0" bgcolor="#FFFFFFAA"> +                <th> <td colspan="2"> <font point-size="12" face="Iwona Italic">Luaotfload Libraries</font> </td> </th> +                <tr> <td>luaotfload-auxiliary.lua</td>    <td>luaotfload-features.lua</td>    </tr> +                <tr> <td>luaotfload-override.lua</td>     <td>luaotfload-loaders.lua</td>     </tr> +                <tr> <td>luaotfload-log.lua</td>          <td>luaotfload-letterspace.lua</td> </tr> +                <tr> <td>luaotfload-parsers.lua</td>      <td>luaotfload-database.lua</td>    </tr> +                <tr> <td>luaotfload-color.lua</td>                                            </tr> +            </table> +        >, +    ] + +/* ···································································· + * merged files + * ································································· */ + +   subgraph cluster_merged { +       node [style=filled, color=white]; +       style     = "filled,rounded"; +       color     = "grey90:dodgerblue4"; +       //nodesep   = "3.0"; +       rank      = same; +       label     = "Merged Libraries"; +       gradientangle=0; +       merged_lua_libs; +       merged_luatex_fonts; +       merged_context_libs; +   } + +    otfl_fonts_merged -> merged_lua_libs +    otfl_fonts_merged -> merged_luatex_fonts +    otfl_fonts_merged -> merged_context_libs + +    merged_lua_libs [ +        shape      = box, +        style      = "filled,rounded", +        color      = "#FFFFFFAA", +        fontsize   = 10, +        label      = < +            <table border="0"> +                <th> <td colspan="3"> <font point-size="12" face="Iwona Italic">Lua Libraries from Context</font> </td> </th> +                <tr> <td>l-lua.lua</td>     <td>l-lpeg.lua</td>    <td>l-function.lua</td>  </tr> +                <tr> <td>l-string.lua</td>  <td>l-table.lua</td>   <td>l-io.lua</td>        </tr> +                <tr> <td>l-file.lua</td>    <td>l-boolean.lua</td> <td>l-math.lua</td>      </tr> +                <tr> <td>util-str.lua</td>                                                  </tr> +            </table> +        >, +    ] + +    merged_luatex_fonts [ +        shape      = box, +        style      = "filled,rounded", +        color      = "#FFFFFFAA", +        fontsize   = 10, +        label      = < +            <table border="0"> +                <th> <td colspan="2"> <font point-size="12" face="Iwona Italic">Font Loader (LuaTeX-Fonts)</font> </td> </th> +                <tr> <td>luatex-basics-gen.lua</td> <td>luatex-basics-nod.lua</td> </tr> +                <tr> <td>luatex-fonts-enc.lua</td>  <td>luatex-fonts-syn.lua</td>  </tr> +                <tr> <td>luatex-font-tfm.lua</td>   <td>luatex-font-afm.lua</td>   </tr> +                <tr> <td>luatex-font-afk.lua</td>   <td>luatex-fonts-tfm.lua</td>  </tr> +                <tr> <td>luatex-fonts-chr.lua</td>  <td>luatex-fonts-lua.lua</td>  </tr> +                <tr> <td>luatex-fonts-inj.lua</td>  <td>luatex-fonts-otn.lua</td>  </tr> +                <tr> <td>luatex-fonts-def.lua</td>  <td>luatex-fonts-ext.lua</td>  </tr> +                <tr> <td>luatex-fonts-cbk.lua</td>                                 </tr> +  +  +  +            </table> +        >, +    ] + +    merged_context_libs [ +        shape      = box, +        style      = "filled,rounded", +        color      = "#FFFFFFAA", +        fontsize   = 10, +        label      = < +            <table border="0"> +                <th> <td colspan="3"> <font point-size="12" face="Iwona Italic"> Font and Node Libraries from Context </font> </td> </th> +                <tr> <td>data-con.lua</td> <td>font-ini.lua</td> <td>font-con.lua</td> </tr> +                <tr> <td>font-cid.lua</td> <td>font-map.lua</td> <td>font-oti.lua</td> </tr> +                <tr> <td>font-otf.lua</td> <td>font-otb.lua</td> <td>font-ota.lua</td> </tr> +                <tr> <td>font-def.lua</td> </tr> +            </table> +        >, +    ] +} + +// vim:ft=dot:sw=4:ts=4:expandtab diff --git a/doc/luaotfload-tool.rst b/doc/luaotfload-tool.rst new file mode 100644 index 0000000..6863918 --- /dev/null +++ b/doc/luaotfload-tool.rst @@ -0,0 +1,263 @@ +======================================================================= +                            luaotfload-tool +======================================================================= + +----------------------------------------------------------------------- +         generate and query the Luaotfload font names database +----------------------------------------------------------------------- + +:Date:      2014-01-02 +:Copyright: GPL v2.0 +:Version:   2.5 +:Manual section: 1 +:Manual group: text processing + +SYNOPSIS +======================================================================= + +**luaotfload-tool** [ -bDfFiIlnpquvVhw ] + +**luaotfload-tool** --update [ --force ] [ --quiet ] [ --verbose ] +                             [ --prefer-texmf ] [ --dry-run ] +                             [ --formats=[+|-]EXTENSIONS ] +                             [ --no-compress ] [ --no-strip ] + +**luaotfload-tool** --find=FONTNAME [ --fuzzy ] [ --info ] [ --inspect ] +                                    [ --no-reload ] + +**luaotfload-tool** --flush-lookups + +**luaotfload-tool** --cache=DIRECTIVE + +**luaotfload-tool** --list=CRITERION[:VALUE] [ --fields=F1,F2,...,Fn ] + +**luaotfload-tool** --help + +**luaotfload-tool** --version + +**luaotfload-tool** --show-blacklist + +**luaotfload-tool** --diagnose=CHECK + +DESCRIPTION +======================================================================= + +luaotfload-tool accesses the font names database that is required by +the *Luaotfload* package. There are two general modes: **update** and +**query**. + ++ **update**:  update the database or rebuild it entirely; ++ **query**:   resolve a font name or display close matches. + +OPTIONS +======================================================================= + +update mode +----------------------------------------------------------------------- +--update, -u            Update the database; indexes new fonts. +--force, -f             Force rebuilding of the database; re-indexes +                        all fonts. +--no-reload, -n         Suppress auto-updates to the database (e.g. +                        when ``--find`` is passed an unknown name). +--no-strip              Do not strip redundant information after +                        building the database. Warning: this will +                        inflate the index to about two to three times +                        the normal size. +--no-compress, -c       Do not filter the plain text version of the +                        font index through gzip. Useful for debugging +                        if your editor is built without zlib. + +--prefer-texmf, -p      Organize the file name database in a way so +                        that it prefer fonts in the *TEXMF* tree over +                        system fonts if they are installed in both. +--max-fonts=N           Process at most *N* font files, including fonts +                        already indexed in the count. +--formats=EXTENSIONS    Extensions of the font files to index. +                        Where *EXTENSIONS* is a comma-separated list of +                        supported file extensions (otf, ttf, ttc, +                        dfont, pfa, and pfb).  If the list is prefixed +                        with a ``+`` sign, the given list is added to +                        the currently active one; ``-`` subtracts. +                        Default: *otf,ttf,ttc,dfont*. +                        Examples: + +                        1) ``--formats=-ttc,ttf`` would skip +                           TrueType fonts and font collections; +                        2) ``--formats=otf`` would scan only OpenType +                           files; +                        3) ``--formats=+pfb`` includes binary +                           Postscript files. **Warning**: with a +                           standard TeX Live installation this will +                           grow the database considerably and slow down +                           font indexing. + +--dry-run, -D           Don’t load fonts, scan directories only. +                        (For debugging file system related issues.) + +query mode +----------------------------------------------------------------------- +--find=NAME             Resolve a font name; this looks up <name> in +                        the database and prints the file name it is +                        mapped to. +                        ``--find`` also understands request syntax, +                        i.e. ``--find=file:foo.otf`` checks whether +                        ``foo.otf`` is indexed. +--fuzzy, -F             Show approximate matches to the file name if +                        the lookup was unsuccessful (requires +                        ``--find``). + +--info, -i              Display basic information to a resolved font +                        file (requires ``--find``). +--inspect, -I           Display detailed information by loading the +                        font and analyzing the font table; very slow! +                        For the meaning of the returned fields see +                        the LuaTeX documentation. +                        (requires ``--find``). +--warnings, -w          Print the warnings generated by the fontloader +                        library (assumes ``-I``). Automatically enabled +                        if the verbosity level exceeds 2. + +--show-blacklist, -b    Show blacklisted files (not directories). +--list=CRITERION        Show entries, where *CRITERION* is one of the +                        following: + +                        1) the character ``*``, selecting all entries; +                        2) a field of a database entry, for instance +                           *version* or *format**, according to which +                           the output will be sorted. +                           Information in an unstripped database (see +                           the option ``--no-strip`` above) is nested: +                           Subfields of a record can be addressed using +                           the ``->`` separator, e. g. +                           ``file->location``, ``style->units_per_em``, +                           or +                           ``names->sanitized->english->prefmodifiers``. +                           NB: shell syntax requires that arguments +                           containing ``->`` be properly quoted! +                        3) an expression of the form ``field:value`` to +                           limit the output to entries whose ``field`` +                           matches ``value``. + +                        For example, in order to output file names and +                        corresponding versions, sorted by the font +                        format:: + +                            ./luaotfload-tool.lua --list="format" --fields="file->base,version" + +                        This prints:: + +                            otf latinmodern-math.otf  Version 1.958 +                            otf lmromancaps10-oblique.otf 2.004 +                            otf lmmono8-regular.otf 2.004 +                            otf lmmonoproplt10-bold.otf 2.004 +                            otf lmsans10-oblique.otf  2.004 +                            otf lmromanslant8-regular.otf 2.004 +                            otf lmroman12-italic.otf  2.004 +                            otf lmsansdemicond10-oblique.otf  2.004 +                            ... + +--fields=FIELDS         Comma-separated list of fields that should be +                        printed. +                        Information in an unstripped database (see the +                        option ``--no-strip`` above) is nested: +                        Subfields of a record can be addressed using +                        the ``->`` separator, e. g. +                        ``file->location``, ``style->units_per_em``, +                        or ``names->sanitized->english->subfamily``. +                        The default is plainname,version*. +                        (Only meaningful with ``--list``.) + +font and lookup caches +----------------------------------------------------------------------- +--flush-lookups         Clear font name lookup cache (experimental). + +--cache=DIRECTIVE       Cache control, where *DIRECTIVE* is one of the +                        following: + +                        1) ``purge`` -> delete Lua files from cache; +                        2) ``erase`` -> delete Lua and Luc files from +                           cache; +                        3) ``show``  -> print stats. + +miscellaneous +----------------------------------------------------------------------- +--verbose=N, -v         Set verbosity level to *n* or the number of +                        repetitions of ``-v``. +--quiet                 No verbose output (log level set to zero). +--log=CHANNEL           Redirect log output (for database +                        troubleshooting), where *CHANNEL* can be + +                        1) ``stdout`` -> all output will be +                           dumped to the terminal (default); or +                        2) ``file`` -> write to a file to the temporary +                           directory (the name will be chosen +                           automatically. + +--version, -V           Show version numbers of components as well as +                        some basic information and exit. +--help, -h              Show help message and exit. + +--diagnose=CHECK        Run the diagnostic procedure *CHECK*. Available +                        procedures are: + +                        1) ``files`` -> check *Luaotfload* files for +                           modifications; +                        2) ``permissions`` -> check permissions of +                           cache directories and files; +                        3) ``environment`` -> print relevant +                            environment and kpse variables; +                        4) ``repository`` -> check the git repository +                           for new releases, +                        5) ``index`` -> check database, display +                           information about it. + +                        Procedures can be chained by concatenating with +                        commas, e.g. ``--diagnose=files,permissions``. +                        Specify ``thorough`` to run all checks. + +FILES +======================================================================= + +The font name database is usually located in the directory +``texmf-var/luatex-cache/generic/names/`` (``$TEXMFCACHE`` as set in +``texmf.cnf``) of your *TeX Live* distribution as a zlib-compressed +file ``luaotfload-names.lua.gz``. +The experimental lookup cache will be created as +``luaotfload-lookup-cache.lua`` in the same directory. +These Lua tables are not used directly by Luaotfload, though. +Instead, they are compiled to Lua bytecode which is written to +corresponding files with the extension ``.luc`` in the same directory. +When modifying the files by hand keep in mind that only if the bytecode +files are missing will Luaotfload use the plain version instead. +Both kinds of files are safe to delete, at the cost of regenerating +them with the next run of *LuaTeX*. + +SEE ALSO +======================================================================= + +**luatex** (1), **lua** (1) + +* ``texdoc luaotfload`` to display the manual for the *Luaotfload* +  package +* Luaotfload development `<https://github.com/lualatex/luaotfload>`_ +* LuaLaTeX mailing list  `<http://tug.org/pipermail/lualatex-dev/>`_ +* LuaTeX                 `<http://luatex.org/>`_ +* ConTeXt                `<http://wiki.contextgarden.net>`_ +* Luaotfload on CTAN     `<http://ctan.org/pkg/luaotfload>`_ + +BUGS +======================================================================= + +Tons, probably. + +AUTHORS +======================================================================= + +*Luaotfload* is maintained by the LuaLaTeX dev team +(`<https://github.com/lualatex/>`__). +The fontloader code is provided by Hans Hagen of Pragma ADE, Hasselt +NL (`<http://pragma-ade.com/>`__). + +This manual page was written by Philipp Gesang +<philipp.gesang@alumni.uni-heidelberg.de>. + diff --git a/doc/luaotfload.dtx b/doc/luaotfload.dtx new file mode 100644 index 0000000..e0311a4 --- /dev/null +++ b/doc/luaotfload.dtx @@ -0,0 +1,1994 @@ +% \iffalse meta-comment +% +% Copyright (C) 2009-2014 +%      by  Elie Roux      <elie.roux@telecom-bretagne.eu> +%      and Khaled Hosny   <khaledhosny@eglug.org> +%      and Philipp Gesang <philipp.gesang@alumni.uni-heidelberg.de> +% +%      Home:      https://github.com/lualatex/luaotfload +%      Support:   <lualatex-dev@tug.org>. +% +% This work is under the GPL v2.0 license. +% +% This work consists of the main source file luaotfload.dtx +% and the derived files +%    luaotfload.sty +% +% Unpacking: +%    tex luaotfload.dtx +% +% Documentation: +%    lualatex luaotfload.dtx +% +%    The class ltxdoc loads the configuration file ltxdoc.cfg +%    if available. Here you can specify further options, e.g. +%    use A4 as paper format: +%       \PassOptionsToClass{a4paper}{article} +% +% +% +%<*ignore> +\begingroup +  \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase 0\ifx\install y1\fi\expandafter +         \ifx\csname processbatchFile\endcsname\relax\else1\fi +         \ifx\fmtname\x\else 1\fi\relax +\else\csname fi\endcsname +%</ignore> +%<*install> +\input docstrip.tex +\Msg{************************************************************************} +\Msg{* Installation} +\Msg{* Package: luaotfload v2.5 OpenType layout system} +\Msg{************************************************************************} + +\keepsilent +\askforoverwritefalse + +\let\MetaPrefix\relax + +\preamble +This is a generated file. + +Copyright (C) 2009-2014 +     by  Elie Roux      <elie.roux@telecom-bretagne.eu> +     and Khaled Hosny   <khaledhosny@eglug.org> +     and Philipp Gesang <philipp.gesang@alumni.uni-heidelberg.de> + +     Home:      https://github.com/lualatex/luaotfload +     Support:   <lualatex-dev@tug.org>. + +This work is under the GPL v2.0 license. + +This work consists of the main source file luaotfload.dtx +and the derived files +    luaotfload.sty + +\endpreamble + +\obeyspaces +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{*     luaotfload.sty} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\ProvidesFile{luaotfload.drv}% +[2014/**/** v2.5 OpenType layout system]% +\documentclass{ltxdoc} +\usepackage{metalogo,multicol,mdwlist,fancyvrb,xspace} +\usepackage[x11names]{xcolor} +% +\def\primarycolor{DodgerBlue4}  %%-> rgb  16  78 139 | #104e8b +\def\secondarycolor{Goldenrod4} %%-> rgb 139 105 200 | #8b6914 +% +\usepackage[ +    bookmarks=true, +   colorlinks=true, +    linkcolor=\primarycolor, +     urlcolor=\secondarycolor, +    citecolor=\primarycolor, +     pdftitle={The luaotfload package}, +   pdfsubject={OpenType layout system for Plain TeX and LaTeX}, +    pdfauthor={Elie Roux & Khaled Hosny & Philipp Gesang}, +  pdfkeywords={luatex, lualatex, unicode, opentype} +]{hyperref} +\usepackage{fontspec} +\usepackage{unicode-math} +\setmainfont[ +% Numbers     = OldStyle, %% buggy with font cache +  Ligatures   = TeX, +  BoldFont    = {Linux Libertine O Bold}, +  ItalicFont  = {Linux Libertine O Italic}, +  SlantedFont = {Linux Libertine O Italic}, +]{Linux Libertine O} +\setmonofont[Ligatures=TeX,Scale=MatchLowercase]{Liberation Mono} +%setsansfont[Ligatures=TeX]{Linux Biolinum O} +\setsansfont[Ligatures=TeX,Scale=MatchLowercase]{Iwona Medium} +%setmathfont{XITS Math} + +\usepackage{hologo} + +\newcommand\TEX      {\TeX\xspace} +\newcommand\LUA      {Lua\xspace} +\newcommand\PDFTEX   {pdf\TeX\xspace} +\newcommand\LUATEX   {Lua\TeX\xspace} +\newcommand\XETEX    {\XeTeX\xspace} +\newcommand\LATEX    {\LaTeX\xspace} +\newcommand\LUALATEX {Lua\LaTeX\xspace} +\newcommand\CONTEXT  {Con\TeX t\xspace} +\newcommand\OpenType {\identifier{Open\kern-.25ex Type}\xspace} + +\def\definehighlight[#1][#2]% + {\ifcsname #1\endcsname\else +    \expandafter\def\csname #1\endcsname% +      {\bgroup#2\csname #1_indeed\endcsname} +    \expandafter\def\csname #1_indeed\endcsname##1% +      {##1\egroup}% +  \fi} + +\def\restoreunderscore{\catcode`\_=12\relax} + +\definehighlight    [fileent][\ttfamily\restoreunderscore]         %% files, dirs +\definehighlight   [texmacro][\sffamily\itshape\textbackslash]     %% cs +\definehighlight[luafunction][\sffamily\itshape\restoreunderscore] %% lua identifiers +\definehighlight [identifier][\sffamily]                           %% names +\definehighlight     [abbrev][\rmfamily\scshape]                   %% acronyms +\definehighlight   [emphasis][\rmfamily\slshape]                   %% level 1 emph + +\newcommand*\email[1]{\href{mailto:#1}{#1}} + +\renewcommand\partname{Part}%% gets rid of the stupid “file” heading + +\usepackage{syntax}%% bnf for font request syntax + +\usepackage{titlesec} + +\def\movecountertomargin#1{\llap{\rmfamily\upshape#1\hskip2em}} +\def\zeropoint{0pt} +\titleformat \part +             {\normalsize\rmfamily\bfseries} +             {\movecountertomargin\thepart} \zeropoint {} +\titleformat \section +             {\normalsize\rmfamily\scshape} +             {\movecountertomargin\thesection} \zeropoint {} +\titleformat \subsection +             {\small\rmfamily\itshape} +             {\movecountertomargin\thesubsection} \zeropoint {} +\titleformat \subsubsection +             {\normalsize\rmfamily\upshape} +             {\movecountertomargin\thesubsubsection} \zeropoint {} + +\usepackage{tocloft} +\renewcommand \cftpartfont   {\rmfamily\upshape} +\renewcommand \cftsecfont    {\rmfamily\upshape} +\renewcommand \cftsubsecfont {\rmfamily\upshape} +\setlength \cftbeforepartskip {1ex} +\setlength \cftbeforesecskip  {1ex} + +\VerbatimFootnotes +\begin{document} +  \DocInput{luaotfload.dtx}% +\end{document} +%</driver> +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%   Digits        \0\1\2\3\4\5\6\7\8\9 +%   Exclamation   \!     Double quote  \"     Hash (number) \# +%   Dollar        \$     Percent       \%     Ampersand     \& +%   Acute accent  \'     Left paren    \(     Right paren   \) +%   Asterisk      \*     Plus          \+     Comma         \, +%   Minus         \-     Point         \.     Solidus       \/ +%   Colon         \:     Semicolon     \;     Less than     \< +%   Equals        \=     Greater than  \>     Question mark \? +%   Commercial at \@     Left bracket  \[     Backslash     \\ +%   Right bracket \]     Circumflex    \^     Underscore    \_ +%   Grave accent  \`     Left brace    \{     Vertical bar  \| +%   Right brace   \}     Tilde         \~} +% +% \GetFileInfo{luaotfload.drv} +% +% \title{The \identifier{luaotfload} package} +% \date{2014/**/** v2.5} +% \author{Elie Roux · Khaled Hosny · Philipp Gesang\\ +%         Home:      \url{https://github.com/lualatex/luaotfload}\\ +%         Support:   \email{lualatex-dev@tug.org}} +% +% \maketitle +% +% \begin{abstract} +% 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. +% \end{abstract} +% +% \tableofcontents +% +% \part{Package Description} +% +% \section{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. +% +% +% \section{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. +% +% +% \section{Loading Fonts} +% +% \identifier{luaotfload} supports an extended font request syntax: +% +% \begin{quote} +%       |\font\foo={|% +%       \meta{prefix}|:|% +%       \meta{font name}|:|% +%       \meta{font features}|}|% +%       \meta{\TEX font features} +% \end{quote} +% +% \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}. +% +% \begin{figure}[b] +%   \setlength\grammarparsep{12pt plus 2pt minus 2pt} +%   \setlength\grammarindent{5cm} +%   \begingroup +%     \small +%     \begin{grammar} +%       <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>    ::= `file:', <file lookup> +%       \alt                   `name:', <name lookup> ; +% +%       <file lookup>      ::= \{ <name character> \} ; +% +%       <name lookup>      ::= \{ <name character> \} ; +% +%       <anon lookup>      ::= {\sc tfmname} | <name lookup> ; +% +%       <path lookup>      ::= \{ {\sc all_characters} - `]' \} ; +% +%       <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} - ( `(' | `/' | `:' ) ; +%     \end{grammar} +%   \endgroup +%   \caption{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: {\ttfamily aat}, +%                     {\ttfamily icu}, and +%                     {\ttfamily gr}. +%            The special terminals are: +%            {\sc feature\textunderscore id} for a valid font +%               feature name and +%            {\sc feature\textunderscore value} for the corresponding +%               value. +%            {\sc tfmname} is the name of a \abbrev{tfm} file. +%            {\sc digit}  again refers to bytes 48--57, and +%            {\sc all\textunderscore characters} to all byte values. +%            {\sc csname} and {\sc dimension} are the \TEX concepts.} +%   \label{font-syntax} +% \end{figure} +% +% \subsection{Prefix -- the \identifier{luaotfload}{ }Way} +% +% In \identifier{luaotfload}, the canonical syntax for font requests +% requires a \emphasis{prefix}: +% \begin{quote} +%   |\font\fontname=|\meta{prefix}|:|\meta{fontname}\dots +% \end{quote} +% where \meta{prefix} is either \verb|file:| or \verb|name:|.\footnote{% +%   The development version also knows two further prefixes, +%   \verb|kpse:| and \verb|my:|. +%   A \verb|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 \verb|my| lookup takes this a step further: it lets you define +%   a custom resolver function and hook it into the \luafunction{resolve_font} +%   callback. +%   This ensures full control over how a file is located. +%   For a working example see the +%   \href{https://bitbucket.org/phg/lua-la-tex-tests/src/5f6a535d/pln-lookup-callback-1.tex} +%        {test repo}. +% } +% 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 +%   \href{http://www.ntg.nl/pipermail/ntg-context/2013/073889.html} +%        {this post} +%   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 \verb|--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 +%                             \verb|(|, +%                             \verb|:|, and +%                             \verb|/|. +% As is obvious from the last exception, the \verb|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}. +% +% \subsection{Compatibility Layer} +% +% In addition to the regular prefixed requests, \identifier{luaotfload} +% accepts loading fonts the \XETEX way. +% There are again two modes: bracketed and unbracketed. +% A bracketed request looks as follows. +% +% \begin{quote} +%   |\font\fontname=[|\meta{path to file}|]| +% \end{quote} +% +% \noindent +% Inside the square brackets, every character except for a closing +% bracket is permitted, allowing for specifying paths to a font file. +% Naturally, path-less file names are equally valid and processed the +% same way as an ordinary \verb|file:| lookup. +% +% \begin{quote} +%   |\font\fontname=|\meta{font name} \dots +% \end{quote} +% +% Unbracketed (or, for lack of a better word: \emphasis{anonymous}) +% font requests resemble the conventional \TEX syntax. +% 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 \verb|name:| lookup, which itself will +% fall back to a \verb|file:| lookup if no database entry matches +% \meta{font name}. +% +% Furthermore, \identifier{luaotfload} supports the slashed (shorthand) +% font style notation from \XETEX. +% +% \begin{quote} +%   |\font\fontname=|\meta{font name}|/|\meta{modifier}\dots +% \end{quote} +% +% \noindent +% Currently, four style modifiers are supported: +%   \verb|I| for italic shape, +%   \verb|B| for bold   weight, +%   \verb|BI| or \verb|IB| for the combination of both. +% Other “slashed” modifiers are too specific to the \XETEX engine and +% have no meaning in \LUATEX. +% +% \subsection{Examples} +% +% \subsubsection{Loading by File Name} +% +% For example, conventional \abbrev{type1} font can be loaded with a \verb|file:| +% request like so: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\lmromanten={file:ec-lmr10} at 10pt +%   \end{verbatim} +% \end{quote} +% +% The \OpenType version of Janusz Nowacki’s font \emphasis{Antykwa +% Półtawskiego}\footnote{% +%   \url{http://jmn.pl/antykwa-poltawskiego/}, also available in +%   in \TEX Live. +% } +% in its condensed variant can be loaded as follows: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\apcregular=file:antpoltltcond-regular.otf at 42pt +%   \end{verbatim} +% \end{quote} +% +% 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: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\gfsporson="[/tmp/GFSPorson.otf]" at 12pt +%   \end{verbatim} +% \end{quote} +% +% \subsubsection{Loading by Font Name} +% +% The \verb|name:| lookup does not depend on cryptic filenames: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\pagellaregular={name:TeX Gyre Pagella} at 9pt +%   \end{verbatim} +% \end{quote} +% +% A bit more specific but essentially the same lookup would be: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\pagellaregular={name:TeX Gyre Pagella Regular} at 9pt +%   \end{verbatim} +% \end{quote} +% +% \noindent +% Which fits nicely with the whole set: +% +% \begin{quote} +%   \begin{verbatim} +%   \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} +% +%   ... +%   \end{verbatim} +% \end{quote} +% +% \subsubsection{Modifiers} +% +% If the entire \emphasis{Iwona} family\footnote{% +%   \url{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: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\iwona=Iwona at 20pt +%   \end{verbatim} +% \end{quote} +% +% \noindent +% To load the most common of the other styles, the slash notation can +% be employed as shorthand: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\iwonaitalic    =Iwona/I    at 20pt +%   \font\iwonabold      =Iwona/B    at 20pt +%   \font\iwonabolditalic=Iwona/BI   at 20pt +%   \end{verbatim} +% \end{quote} +% +% \noindent +% which is equivalent to these full names: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\iwonaitalic    ="Iwona Italic"       at 20pt +%   \font\iwonabold      ="Iwona Bold"         at 20pt +%   \font\iwonabolditalic="Iwona BoldItalic"   at 20pt +%   \end{verbatim} +% \end{quote} +% +% \section{Font features} +% +% \emphasis{Font features} are the second to last component in the +% general scheme for font requests: +% +% \begin{quote} +%       |\font\foo={|% +%       \meta{prefix}|:|% +%       \meta{font name}|:|% +%       \meta{font features}|}|% +%       \meta{\TEX font features} +% \end{quote} +% +% \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. \url{http://www.microsoft.com/typography/otspec/featurelist.htm}. +% } +% and font options. +% Prepending a font feature with a |+| (plus sign) enables it, whereas +% a |-| (minus) disables it. For instance, the request +% +% \begin{quote} +%   \begin{verbatim} +%   \font\test=LatinModernRoman:+clig;-kern +%   \end{verbatim} +% \end{quote} +% +% \noindent activates contextual ligatures (|clig|) and disables +% kerning (|kern|). +% Alternatively the options |true| or |false| can be passed to +% the feature in a key/value expression. +% The following request has the same meaning as the last one: +% +% \begin{quote} +%   \begin{verbatim} +%   \font\test=LatinModernRoman:clig=true;kern=false +%   \end{verbatim} +% \end{quote} +% +% \noindent +% Furthermore, this second syntax is required should a font feature +% accept other options besides a true/false switch. +% For example, \emphasis{stylistic alternates} (|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, |random|. +% +% \iffalse TODO verify that this actually works with a font that supports +%               the salt/random feature!\fi +% \begin{quote} +%   \begin{verbatim} +%   \font\librmsaltfirst=LatinModernRoman:salt=1 +%   \end{verbatim} +% \end{quote} +% +% \noindent Other font options include: +% +% \begin{description} +% +% \item [mode] \hfill \\ +%        \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. +% +% \item [script] \label{script-tag} \hfill \\ +%        An \OpenType script tag;\footnote{% +%          See \url{http://www.microsoft.com/typography/otspec/scripttags.htm} +%          for a list of valid values. +%          For scripts derived from the Latin alphabet the value +%          |latn| is good choice. +%        } +%        the default value is |dlft|. +%        Some fonts, including very popular ones by foundries like Adobe, +%        do not assign features to the |dflt| script, in +%        which case the script needs to be set explicitly. +% +% \item [language] \hfill \\ +%        An \OpenType language system identifier,\footnote{% +%          Cf. \url{http://www.microsoft.com/typography/otspec/languagetags.htm}. +%        } +%        defaulting to |dflt|. +% +% \item [featurefile] \hfill \\ +%        A comma-separated list of feature files to be applied to the +%        font. +%        Feature files contain a textual representation of +%        \OpenType tables and extend the features of a font +%        on fly. +%        After they are applied to a font, features defined in a +%        feature file can be enabled or disabled just like any +%        other font feature. +%        The syntax is documented in \identifier{Adobe}’s +%        \OpenType Feature File Specification.\footnote{% +%          Cf. \url{http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html}. +%        } +% +%        For a demonstration of how to set a |tkrn| feature consult +%        the file |tkrn.fea| that is part of \identifier{luaotfload}. +%        It can be read and applied as follows: +% +%        |\font\test=Latin Modern Roman:featurefile=tkrn.fea;+tkrn| +% +% \item [color] \hfill \\ +%        A font color, defined as a triplet of two-digit hexadecimal +%        \abbrev{rgb} values, with an optional fourth value for +%        transparency +%        (where |00| is completely transparent and |FF| is opaque). +% +%        For example, in order to set text in semitransparent red: +% +%        \begin{quote} +%           \begin{verbatim} +%  \font\test={Latin Modern Roman}:color=FF0000BB +%           \end{verbatim} +%        \end{quote} +% +% \item [kernfactor \& letterspace] \hfill \\ +%        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: +% +%        \begin{quote} +%               \begin{verbatim} +%  \font\iwonakernedA="file:Iwona-Regular.otf:kernfactor=0.125" +%  \font\iwonakernedB="file:Iwona-Regular.otf:letterspace=12.5" +%               \end{verbatim} +%        \end{quote} +% +%        Specific pairs of letters and ligatures may be exempt from +%        letterspacing by defining the \LUA functions +%        \luafunction{keeptogether} and \luafunction{keepligature}, +%        respectively, inside the namespace \verb|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. +%        \luafunction{keeptogether} receives a pair of consecutive +%        glyph nodes in order of their appearance in the node list. +%        \luafunction{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. +% +% +% \item [protrusion \& expansion] \hfill \\ +%        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 +%           \begin{verbatim} +%  \directlua{inspect(fonts.protrusions.setups.default) +%             inspect(fonts.expansions.setups.default)} +%           \end{verbatim} +%           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 +%              \verb|pdfprotrudechars=2| and +%              \verb|pdfadjustspacing=2| +%          to activate protrusion and expansion, respectively. +%          See the +%          \href{http://mirrors.ctan.org/systems/pdftex/manual/pdftex-a.pdf}% +%               {\PDFTEX manual} +%          for details. +%        }: +% +%        \begin{quote} +%           \begin{verbatim} +%  \font\test=LatinModernRoman:protrusion=default +%           \end{verbatim} +%        \end{quote} +% \end{description} +% +% \paragraph{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: +% +% \begin{description} +% +%   \item [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}. +% +%   \item [tlig] +%           Applies legacy \TEX ligatures: +% +%           \begin{tabular}{rlrl} +%              ``  &  \verb|``|  &  ''  &  \verb|''|  \\ +%              `   &  \verb|`|   &  '   &  \verb|'|   \\ +%              "   &  \verb|"|   &  --  &  \verb|--|  \\ +%              --- &  \verb|---| &  !`  &  \verb|!`|  \\ +%              ?`  &  \verb|?`|  &      &             \\ +%           \end{tabular} +% +%           \footnote{% +%             These contain the feature set \verb|trep| of earlier +%             versions of \identifier{luaotfload}. +% +%             Note to \XETEX users: this is the equivalent of the +%             assignment \verb|mapping=text-tex| using \XETEX's input +%             remapping feature. +%           } +% +%   \item [itlc] +%           Computes italic correction values (active by default). +% +% \end{description} +% +% +% +% \section{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 \href{http://www.lcdf.org/type/}{\fileent{otfinfo}} (comes +%   with \TEX Live), when invoked on a font file with the \verb|-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. +% +% \subsection[luaotfload-tool / mkluatexfontdb.lua]% +%            {\fileent{luaotfload-tool} / +%             \fileent{mkluatexfontdb.lua}\footnote{% +%   The script may be named just \fileent{mkluatexfontdb} in your +%   distribution. +% }} +% +% 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 (\verb|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 +%   \href{https://foundry.supelec.fr/projects/luajittex/}% +%        {\identifier{Luajit\kern-.25ex\TEX}}, +%   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 +%   \verb|texlua.exe luaotfload-tool.lua|. +% } +% Invoked with the argument \verb|--update| it will perform a database +% update, scanning for fonts not indexed. +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool --update +%   \end{verbatim} +% \end{quote} +% +% Adding the \verb|--force| switch will initiate a complete +% rebuild of the database. +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool --update --force +%   \end{verbatim} +% \end{quote} +% +% For sake of backwards compatibility, \fileent{luaotfload-tool} may be +% renamed or symlinked to \fileent{mkluatexfontdb}. +% Whenever it is run under this name, it will update the database +% first, mimicking the behavior of earlier versions of +% \identifier{luaotfload}. +% +% \subsection{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 \verb|man 5 fonts.conf| for further information. +% On \identifier{Windows} systems, the standard location is +% \verb|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 +% \verb+OSFONTDIR+. +% If it is non-empty, then search will be extended to the included +% directories. +% +% \begin{table}[t] +%   \hrule +%   \caption{List of paths searched for each supported operating +%            system.} +%   \renewcommand{\arraystretch}{1.2} +%   \begin{center} +%     \begin{tabular}{lp{.5\textwidth}} +%       Windows     & \verb|%WINDIR%\Fonts| +%       \\ +%       Linux       & \fileent{/usr/local/etc/fonts/fonts.conf} and\hfill\break +%                     \fileent{/etc/fonts/fonts.conf} +%       \\ +%       Mac         & \fileent{\textasciitilde/Library/Fonts},\break +%                     \fileent{/Library/Fonts},\break +%                     \fileent{/System/Library/Fonts}, and\hfill\break +%                     \fileent{/Network/Library/Fonts} +%       \\ +%     \end{tabular} +%   \end{center} +%   \label{table-searchpaths} +%   \hrule +% \end{table} +% +% \subsection{Querying from Outside} +% +% \fileent{luaotfload-tool} also provides rudimentary means of +% accessing the information collected in the font database. +% If the option \verb|--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 +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool  --find="Iwona Regular" +%   \end{verbatim} +% \end{quote} +% +% \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 +% \verb|-F| (or \verb|--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 +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool  -F --find="Iwona Bright" +%   \end{verbatim} +% \end{quote} +% +% \noindent +% will tell you that indeed the latter name is correct. +% +% Basic information about fonts in the database can be displayed +% using the \verb|-i| option (\verb|--info|). +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool  -i --find="Iwona Light Italic" +%   \end{verbatim} +% \end{quote} +% \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 \verb|-I| option +% instead (\verb|--inspect|). +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool  -I --find="Iwona Light Italic" +%   \end{verbatim} +% \end{quote} +% +% \verb|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 +% (\verb|man 1 luaotfload-tool|).\footnote{% +%   Or see \verb|luaotfload-tool.rst| in the source directory. +% } +% +% \subsection{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 \verb|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 (|%|) 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 \verb|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 (|-|) is +% removed from the blacklist, causing it to be temporarily whitelisted +% without modifying the global file. +% An example with explicit paths: +% +% \begin{verbatim} +% % 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. +% \end{verbatim} +% +% \section{Files from \CONTEXT and \LUATEX-Fonts} +% +% \identifier{luaotfload} relies on code originally written by Hans +% Hagen\footnote{% +%   The creator of the \href{http://wiki.contextgarden.net}{\CONTEXT} +%   format. +% } +% for and tested with \CONTEXT. +% It integrates the font loader as distributed in +% the \identifier{\LUATEX-Fonts} package. +% The original \LUA source files have been combined using the +% \fileent{mtx-package} script into a single, self-contained blob. +% In this form the font loader has no further dependencies\footnote{% +%   It covers, however, to some extent the functionality of 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 from time to time. +% 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. +% +% Below is a commented list of the files distributed with +% \identifier{luaotfload} in one way or the other. +% See figure \ref{file-graph} on page \pageref{file-graph} for a +% graphical representation of the dependencies. +% From \LUATEX-Fonts, only the file \fileent{luatex-fonts-merged.lua} +% has been imported as \fileent{luaotfload-fontloader.lua}. +% It is generated by \fileent{mtx-package}, a \LUA source code merging +% too developed by Hans Hagen.\footnote{% +%   \fileent{mtx-package} is +%   \href +%     {http://repo.or.cz/w/context.git/blob_plain/refs/heads/origin:/scripts/context/lua/mtx-package.lua} +%     {part of \CONTEXT} +%   and requires \fileent{mtxrun}. +%   Run +%   \verb|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. +% } +% It houses several \LUA files that can be classed in three +% categories. +% +%   \begin{itemize} +%     \let\normalitem=\item +%     \def\incitem#1{% +%       \normalitem{\fileent{#1}} +%     } +%     \normalitem \emphasis{\LUA utility libraries}, a subset +%                 of what is provided by the \identifier{lualibs} +%                 package. +% +%                 \begin{multicols}{2} +%                   \begin{itemize} +%                     \incitem{l-lua.lua}       \incitem{l-lpeg.lua} +%                     \incitem{l-function.lua}  \incitem{l-string.lua} +%                     \incitem{l-table.lua}     \incitem{l-io.lua} +%                     \incitem{l-file.lua}      \incitem{l-boolean.lua} +%                     \incitem{l-math.lua}      \incitem{util-str.lua} +%                   \end{itemize} +%                 \end{multicols} +% +%     \normalitem The \emphasis{font loader} itself. +%                 These files have been written for +%                 \LUATEX-Fonts and they are distributed along +%                 with \identifier{luaotfload}. +%                 \begin{multicols}{2} +%                   \begin{itemize} +%                     \incitem{luatex-basics-gen.lua} +%                     \incitem{luatex-basics-nod.lua} +%                     \incitem{luatex-fonts-enc.lua} +%                     \incitem{luatex-fonts-syn.lua} +%                     \incitem{luatex-fonts-tfm.lua} +%                     \incitem{luatex-fonts-chr.lua} +%                     \incitem{luatex-fonts-lua.lua} +%                     \incitem{luatex-fonts-inj.lua} +%                     \incitem{luatex-fonts-otn.lua} +%                     \incitem{luatex-fonts-def.lua} +%                     \incitem{luatex-fonts-ext.lua} +%                     \incitem{luatex-fonts-cbk.lua} +%                   \end{itemize} +%                 \end{multicols} +% +%     \normalitem Code related to \emphasis{font handling and +%                 node processing}, taken directly from +%                 \CONTEXT. +%                 \begin{multicols}{2} +%                   \begin{itemize} +%                     \incitem{data-con.lua} \incitem{font-ini.lua} +%                     \incitem{font-con.lua} \incitem{font-cid.lua} +%                     \incitem{font-map.lua} \incitem{font-oti.lua} +%                     \incitem{font-otf.lua} \incitem{font-otb.lua} +%                     \incitem{font-ota.lua} \incitem{font-def.lua} +%                     \incitem{font-otp.lua} +%                   \end{itemize} +%                 \end{multicols} +%   \end{itemize} +% +% Note that if \identifier{luaotfload} cannot locate the +% merged file, it will load the individual \LUA libraries +% instead. +% Their names remain the same as in \CONTEXT (without the +% \verb|otfl|-prefix) since we imported the relevant section of +% \fileent{luatex-fonts.lua} unmodified into \fileent{luaotfload-main.lua}. +% Thus if you prefer running bleeding edge code from the +% \CONTEXT beta, all you have to do is remove +% \fileent{luaotfload-merged.lua} from the search path. +% +% 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-override.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. +% +% \begin{itemize} +%     \let\normalitem=\item +%     \def\ouritem#1{% +%       \normalitem{\fileent{#1}}% +%       \space--\hskip1em +%     } +%     \ouritem {luaotfload-features.lua}     font feature handling; +%                                            incorporates some of the code from +%                                            \fileent{font-otc} from \CONTEXT; +%     \ouritem {luaotfload-override.lua}     overrides the \CONTEXT logging +%                                            functionality. +%     \ouritem {luaotfload-loaders.lua}      registers the \OpenType +%                                            font reader as handler for +%                                            Postscript fonts +%                                            (\abbrev{pfa}, \abbrev{pfb}). +%     \ouritem {luaotfload-parsers.lua}      various \abbrev{lpeg}-based parsers. +%     \ouritem {luaotfload-database.lua}     font names database. +%     \ouritem {luaotfload-colors.lua}       color handling. +%     \ouritem {luaotfload-auxiliary.lua}    access to internal functionality +%                                            for package authors +%                                            (proposals for additions welcome). +%     \ouritem {luaotfload-letterspace.lua}  font-based letterspacing. +% \end{itemize} +% +% \begin{figure}[b] +%   \caption{Schematic of the files in \identifier{Luaotfload}} +%   \includegraphics[width=\textwidth]{filegraph.pdf} +%   \label{file-graph} +% \end{figure} +% +% \section{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 \luafunction{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. +% +% \subsection{Callback Functions} +% +% The \luafunction{patch_font} callback is inserted in the wrapper +% \identifier{luaotfload} provides for the font definition callback +% (see below, page \pageref{define-font}). +% 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}: +% +% \begin{quote} +%   \begin{verbatim} +%   \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 +%   \end{verbatim} +% \end{quote} +% +% \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. +% +% \subsubsection{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. +% +% \subsubsection{Patches} +% +% These are mostly concerned with establishing compatibility with +% \XETEX. +% +% \begin{itemize} +%   \let\normalitem=\item +%   \def\ouritem#1{% +%     \normalitem{\luafunction{#1}}% +%     \hfill\break +%   } +% +%   \ouritem  {set_sscale_dimens} +%             Calculate \texmacro{fontdimen}s 10 and 11 to emulate \XETEX. +% +%   \ouritem  {set_capheight} +%             Calculates \texmacro{fontdimen} 8 like \XETEX. +% +%   \ouritem  {patch_cambria_domh} +%             Correct some values of the font \emphasis{Cambria Math}. +% +% \end{itemize} +% +% \subsection{Package Author’s Interface} +% +% As \LUATEX release 1.0 is nearing, the demand for a reliable interface +% for package authors increases. +% +% \subsubsection{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. +% +% \begin{itemize} +%   \let\normalitem=\item +%   \def\ouritem#1{% +%     \normalitem{\luafunction{#1}}% +%     \hfill\break +%   } +% +%   \ouritem  {aux.font_has_glyph (id : int, index : int)} +%             Predicate that returns true if the font \luafunction{id} +%             has glyph \luafunction{index}. +% +%   \ouritem  {aux.slot_of_name(name : string)} +%             Translates an Adobe Glyph name to the corresponding glyph +%             slot. +% +%   \ouritem  {aux.name_of_slot(slot : int)} +%             The inverse of \luafunction{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 +%             \luafunction{name_of_slot}. +% +%   \ouritem  {aux.provides_script(id : int, script : string)} +%             Test if a font supports \luafunction{script}. +% +%   \ouritem  {aux.provides_language(id : int, script : string, language : string)} +%             Test if a font defines \luafunction{language} for a given +%             \luafunction{script}. +% +%   \ouritem  {aux.provides_feature(id : int, script : string, +%              language : string, feature : string)} +%             Test if a font defines \luafunction{feature} for +%             \luafunction{language} for a given \luafunction{script}. +% +%   \ouritem  {aux.get_math_dimension(id : int, dimension : string)} +%             Get the dimension \luafunction{dimension} of font \luafunction{id}. +% +%   \ouritem  {aux.sprint_math_dimension(id : int, dimension : string)} +%             Same as \luafunction{get_math_dimension()}, but output the value +%             in scaled points at the \TEX end. +% +% \end{itemize} +% +% \subsubsection{Database} +% +% \begin{itemize} +%   \let\normalitem=\item +%   \def\ouritem#1{% +%     \normalitem{\luafunction{#1}}% +%     \hfill\break +%   } +% +%   \ouritem  {aux.scan_external_dir(dir : string)} +%             Include fonts in directory \luafunction{dir} in font lookups without +%             adding them to the database. +% +% \end{itemize} +% +% \section{Troubleshooting} +% +% \subsection {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 +% \url{https://github.com/lualatex/luaotfload} where there is an issue +% tracker for submitting bug reports, feature requests and the likes +% requests and the likes. +% +% Bug reports are more likely to be addressed if they contain the output of +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool --diagnose=environment,files,permissions +%   \end{verbatim} +% \end{quote} +% +% \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}: +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool -fuvvv --log=stdout +%   \end{verbatim} +% \end{quote} +% +% \noindent or to a file in \fileent{/tmp}: +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool -fuvvv --log=file +%   \end{verbatim} +% \end{quote} +% +% \noindent In the latter case, invoke the \verb|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}). +% +% \subsection {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 \verb|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 \verb|latn|: +% +% \begin{quote} +%   \begin{verbatim} +%     \font\test=file:MyFont.otf:script=latn;+liga; +%   \end{verbatim} +% \end{quote} +% +% You can get a list of features that a font defines for scripts and languages +% by querying it in \fileent{luaotfload-tool}: +% +% \begin{quote} +%   \begin{verbatim} +%     luaotfload-tool --find="Iwona" --inspect +%   \end{verbatim} +% \end{quote} +% +% \subsection {\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 +% \luafunction{aux} namespace over direct manipulation of font objects. +% For example, raw access to the \luafunction{font.fonts} table like: +% +% \begin{quote} +%   \begin{verbatim} +%     local somefont = font.fonts[2] +%   \end{verbatim} +% \end{quote} +% +% \noindent can render already defined fonts unusable. +% Instead, the function \luafunction{font.getfont()} should be used because +% it has been replaced by a safe variant. +% +% However, \luafunction{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 +% \luafunction{font.getfont()} and \luafunction{font.fonts}. +% In this case, best define you own accessor: +% +% \begin{quote} +%   \begin{verbatim} +%     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) +%   \end{verbatim} +% \end{quote} +% +% \part{Implementation} +% +% \section{\fileent{luaotfload.lua}} +% +% As of version 2.5, the file \fileent{luaotfload.lua} is no longer +% generated from the \abbrev{dtx}. +% Instead, it is maintained separately as a plain \identifier{Lua} file +% \fileent{luaotfload-main.lua} in the Luaotfload \identifier{git} tree. +% The file documentation which used to be found in this section has +% been preserved in the comments. +% +% \section{\fileent{luaotfload.sty}} +% +% As of version 2.5, the file \fileent{luaotfload.sty} is no longer +% generated from the \abbrev{dtx}. +% Instead, it is maintained separately as a plain \identifier{\TEX} file +% in the Luaotfload \identifier{git} tree. +% The file documentation which used to be found in this section has +% been preserved in the comments. +% +% \clearpage +% \section{The GNU GPL License v2} +% +% The GPL requires the complete license text to be distributed along +% with the code. I recommend the canonical source, instead: +% \url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html}. +% But if you insist on an included copy, here it is. +% You might want to zoom in. +% +% \newsavebox{\gpl} +% \begin{lrbox}{\gpl} +% \begin{minipage}{3\textwidth} +% \columnsep=3\columnsep +% \begin{multicols}{3} +% \begin{center} +% {\Large GNU GENERAL PUBLIC LICENSE\par} +% \bigskip +% {Version 2, June 1991} +% \end{center} +% +% \begin{center} +% {\parindent 0in +% +% Copyright \textcopyright\ 1989, 1991 Free Software Foundation, Inc. +% +% \bigskip +% +% 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA +% +% \bigskip +% +% Everyone is permitted to copy and distribute verbatim copies +% of this license document, but changing it is not allowed. +% } +% \end{center} +% +% \begin{center} +% {\bf\large Preamble} +% \end{center} +% +% +% The licenses for most software are designed to take away your freedom to +% share and change it.  By contrast, the GNU General Public License is +% intended to guarantee your freedom to share and change free software---to +% make sure the software is free for all its users.  This General Public +% License applies to most of the Free Software Foundation's software and to +% any other program whose authors commit to using it.  (Some other Free +% Software Foundation software is covered by the GNU Library General Public +% License instead.)  You can apply it to your programs, too. +% +% When we speak of free software, we are referring to freedom, not price. +% Our General Public Licenses are designed to make sure that you have the +% freedom to distribute copies of free software (and charge for this service +% if you wish), that you receive source code or can get it if you want it, +% that you can change the software or use pieces of it in new free programs; +% and that you know you can do these things. +% +% To protect your rights, we need to make restrictions that forbid anyone to +% deny you these rights or to ask you to surrender the rights.  These +% restrictions translate to certain responsibilities for you if you +% distribute copies of the software, or if you modify it. +% +% For example, if you distribute copies of such a program, whether gratis or +% for a fee, you must give the recipients all the rights that you have.  You +% must make sure that they, too, receive or can get the source code.  And +% you must show them these terms so they know their rights. +% +% We protect your rights with two steps: (1) copyright the software, and (2) +% offer you this license which gives you legal permission to copy, +% distribute and/or modify the software. +% +% Also, for each author's protection and ours, we want to make certain that +% everyone understands that there is no warranty for this free software.  If +% the software is modified by someone else and passed on, we want its +% recipients to know that what they have is not the original, so that any +% problems introduced by others will not reflect on the original authors' +% reputations. +% +% Finally, any free program is threatened constantly by software patents. +% We wish to avoid the danger that redistributors of a free program will +% individually obtain patent licenses, in effect making the program +% proprietary.  To prevent this, we have made it clear that any patent must +% be licensed for everyone's free use or not licensed at all. +% +% The precise terms and conditions for copying, distribution and +% modification follow. +% +% \begin{center} +% {\Large \sc Terms and Conditions For Copying, Distribution and +%   Modification} +% \end{center} +% +% \begin{enumerate} +% \item +% This License applies to any program or other work which contains a notice +% placed by the copyright holder saying it may be distributed under the +% terms of this General Public License.  The ``Program'', below, refers to +% any such program or work, and a ``work based on the Program'' means either +% the Program or any derivative work under copyright law: that is to say, a +% work containing the Program or a portion of it, either verbatim or with +% modifications and/or translated into another language.  (Hereinafter, +% translation is included without limitation in the term ``modification''.) +% Each licensee is addressed as ``you''. +% +% Activities other than copying, distribution and modification are not +% covered by this License; they are outside its scope.  The act of +% running the Program is not restricted, and the output from the Program +% is covered only if its contents constitute a work based on the +% Program (independent of having been made by running the Program). +% Whether that is true depends on what the Program does. +% +% \item You may copy and distribute verbatim copies of the Program's source +%   code as you receive it, in any medium, provided that you conspicuously +%   and appropriately publish on each copy an appropriate copyright notice +%   and disclaimer of warranty; keep intact all the notices that refer to +%   this License and to the absence of any warranty; and give any other +%   recipients of the Program a copy of this License along with the Program. +% +% You may charge a fee for the physical act of transferring a copy, and you +% may at your option offer warranty protection in exchange for a fee. +% +% \item +% You may modify your copy or copies of the Program or any portion +% of it, thus forming a work based on the Program, and copy and +% distribute such modifications or work under the terms of Section 1 +% above, provided that you also meet all of these conditions: +% +% \begin{enumerate} +% +% \item +% You must cause the modified files to carry prominent notices stating that +% you changed the files and the date of any change. +% +% \item +% You must cause any work that you distribute or publish, that in +% whole or in part contains or is derived from the Program or any +% part thereof, to be licensed as a whole at no charge to all third +% parties under the terms of this License. +% +% \item +% If the modified program normally reads commands interactively +% when run, you must cause it, when started running for such +% interactive use in the most ordinary way, to print or display an +% announcement including an appropriate copyright notice and a +% notice that there is no warranty (or else, saying that you provide +% a warranty) and that users may redistribute the program under +% these conditions, and telling the user how to view a copy of this +% License.  (Exception: if the Program itself is interactive but +% does not normally print such an announcement, your work based on +% the Program is not required to print an announcement.) +% +% \end{enumerate} +% +% +% These requirements apply to the modified work as a whole.  If +% identifiable sections of that work are not derived from the Program, +% and can be reasonably considered independent and separate works in +% themselves, then this License, and its terms, do not apply to those +% sections when you distribute them as separate works.  But when you +% distribute the same sections as part of a whole which is a work based +% on the Program, the distribution of the whole must be on the terms of +% this License, whose permissions for other licensees extend to the +% entire whole, and thus to each and every part regardless of who wrote it. +% +% Thus, it is not the intent of this section to claim rights or contest +% your rights to work written entirely by you; rather, the intent is to +% exercise the right to control the distribution of derivative or +% collective works based on the Program. +% +% In addition, mere aggregation of another work not based on the Program +% with the Program (or with a work based on the Program) on a volume of +% a storage or distribution medium does not bring the other work under +% the scope of this License. +% +% \item +% You may copy and distribute the Program (or a work based on it, +% under Section 2) in object code or executable form under the terms of +% Sections 1 and 2 above provided that you also do one of the following: +% +% \begin{enumerate} +% +% \item +% +% Accompany it with the complete corresponding machine-readable +% source code, which must be distributed under the terms of Sections +% 1 and 2 above on a medium customarily used for software interchange; or, +% +% \item +% +% Accompany it with a written offer, valid for at least three +% years, to give any third party, for a charge no more than your +% cost of physically performing source distribution, a complete +% machine-readable copy of the corresponding source code, to be +% distributed under the terms of Sections 1 and 2 above on a medium +% customarily used for software interchange; or, +% +% \item +% +% Accompany it with the information you received as to the offer +% to distribute corresponding source code.  (This alternative is +% allowed only for noncommercial distribution and only if you +% received the program in object code or executable form with such +% an offer, in accord with Subsection b above.) +% +% \end{enumerate} +% +% +% The source code for a work means the preferred form of the work for +% making modifications to it.  For an executable work, complete source +% code means all the source code for all modules it contains, plus any +% associated interface definition files, plus the scripts used to +% control compilation and installation of the executable.  However, as a +% special exception, the source code distributed need not include +% anything that is normally distributed (in either source or binary +% form) with the major components (compiler, kernel, and so on) of the +% operating system on which the executable runs, unless that component +% itself accompanies the executable. +% +% If distribution of executable or object code is made by offering +% access to copy from a designated place, then offering equivalent +% access to copy the source code from the same place counts as +% distribution of the source code, even though third parties are not +% compelled to copy the source along with the object code. +% +% \item +% You may not copy, modify, sublicense, or distribute the Program +% except as expressly provided under this License.  Any attempt +% otherwise to copy, modify, sublicense or distribute the Program is +% void, and will automatically terminate your rights under this License. +% However, parties who have received copies, or rights, from you under +% this License will not have their licenses terminated so long as such +% parties remain in full compliance. +% +% \item +% You are not required to accept this License, since you have not +% signed it.  However, nothing else grants you permission to modify or +% distribute the Program or its derivative works.  These actions are +% prohibited by law if you do not accept this License.  Therefore, by +% modifying or distributing the Program (or any work based on the +% Program), you indicate your acceptance of this License to do so, and +% all its terms and conditions for copying, distributing or modifying +% the Program or works based on it. +% +% \item +% Each time you redistribute the Program (or any work based on the +% Program), the recipient automatically receives a license from the +% original licensor to copy, distribute or modify the Program subject to +% these terms and conditions.  You may not impose any further +% restrictions on the recipients' exercise of the rights granted herein. +% You are not responsible for enforcing compliance by third parties to +% this License. +% +% \item +% If, as a consequence of a court judgment or allegation of patent +% infringement or for any other reason (not limited to patent issues), +% conditions are imposed on you (whether by court order, agreement or +% otherwise) that contradict the conditions of this License, they do not +% excuse you from the conditions of this License.  If you cannot +% distribute so as to satisfy simultaneously your obligations under this +% License and any other pertinent obligations, then as a consequence you +% may not distribute the Program at all.  For example, if a patent +% license would not permit royalty-free redistribution of the Program by +% all those who receive copies directly or indirectly through you, then +% the only way you could satisfy both it and this License would be to +% refrain entirely from distribution of the Program. +% +% If any portion of this section is held invalid or unenforceable under +% any particular circumstance, the balance of the section is intended to +% apply and the section as a whole is intended to apply in other +% circumstances. +% +% It is not the purpose of this section to induce you to infringe any +% patents or other property right claims or to contest validity of any +% such claims; this section has the sole purpose of protecting the +% integrity of the free software distribution system, which is +% implemented by public license practices.  Many people have made +% generous contributions to the wide range of software distributed +% through that system in reliance on consistent application of that +% system; it is up to the author/donor to decide if he or she is willing +% to distribute software through any other system and a licensee cannot +% impose that choice. +% +% This section is intended to make thoroughly clear what is believed to +% be a consequence of the rest of this License. +% +% \item +% If the distribution and/or use of the Program is restricted in +% certain countries either by patents or by copyrighted interfaces, the +% original copyright holder who places the Program under this License +% may add an explicit geographical distribution limitation excluding +% those countries, so that distribution is permitted only in or among +% countries not thus excluded.  In such case, this License incorporates +% the limitation as if written in the body of this License. +% +% \item +% The Free Software Foundation may publish revised and/or new versions +% of the General Public License from time to time.  Such new versions will +% be similar in spirit to the present version, but may differ in detail to +% address new problems or concerns. +% +% Each version is given a distinguishing version number.  If the Program +% specifies a version number of this License which applies to it and ``any +% later version'', you have the option of following the terms and conditions +% either of that version or of any later version published by the Free +% Software Foundation.  If the Program does not specify a version number of +% this License, you may choose any version ever published by the Free Software +% Foundation. +% +% \item +% If you wish to incorporate parts of the Program into other free +% programs whose distribution conditions are different, write to the author +% to ask for permission.  For software which is copyrighted by the Free +% Software Foundation, write to the Free Software Foundation; we sometimes +% make exceptions for this.  Our decision will be guided by the two goals +% of preserving the free status of all derivatives of our free software and +% of promoting the sharing and reuse of software generally. +% +% \begin{center} +% {\Large\sc +% No Warranty +% } +% \end{center} +% +% \item +% {\sc Because the program is licensed free of charge, there is no warranty +% for the program, to the extent permitted by applicable law.  Except when +% otherwise stated in writing the copyright holders and/or other parties +% provide the program ``as is'' without warranty of any kind, either expressed +% or implied, including, but not limited to, the implied warranties of +% merchantability and fitness for a particular purpose.  The entire risk as +% to the quality and performance of the program is with you.  Should the +% program prove defective, you assume the cost of all necessary servicing, +% repair or correction.} +% +% \item +% {\sc In no event unless required by applicable law or agreed to in writing +% will any copyright holder, or any other party who may modify and/or +% redistribute the program as permitted above, be liable to you for damages, +% including any general, special, incidental or consequential damages arising +% out of the use or inability to use the program (including but not limited +% to loss of data or data being rendered inaccurate or losses sustained by +% you or third parties or a failure of the program to operate with any other +% programs), even if such holder or other party has been advised of the +% possibility of such damages.} +% +% \end{enumerate} +% +% +% \begin{center} +% {\Large\sc End of Terms and Conditions} +% \end{center} +% +% +% \pagebreak[2] +% +% \section*{Appendix: How to Apply These Terms to Your New Programs} +% +% If you develop a new program, and you want it to be of the greatest +% possible use to the public, the best way to achieve this is to make it +% free software which everyone can redistribute and change under these +% terms. +% +%   To do so, attach the following notices to the program.  It is safest to +%   attach them to the start of each source file to most effectively convey +%   the exclusion of warranty; and each file should have at least the +%   ``copyright'' line and a pointer to where the full notice is found. +% +% \begin{quote} +% one line to give the program's name and a brief idea of what it does. \\ +% Copyright (C) yyyy  name of author \\ +% +% This program 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; either version 2 of the License, or +% (at your option) any later version. +% +% This program 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 this program; if not, write to the Free Software +% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. +% \end{quote} +% +% Also add information on how to contact you by electronic and paper mail. +% +% If the program is interactive, make it output a short notice like this +% when it starts in an interactive mode: +% +% \begin{quote} +% Gnomovision version 69, Copyright (C) yyyy  name of author \\ +% Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. \\ +% This is free software, and you are welcome to redistribute it +% under certain conditions; type `show c' for details. +% \end{quote} +% +% +% The hypothetical commands {\tt show w} and {\tt show c} should show the +% appropriate parts of the General Public License.  Of course, the commands +% you use may be called something other than {\tt show w} and {\tt show c}; +% they could even be mouse-clicks or menu items---whatever suits your +% program. +% +% You should also get your employer (if you work as a programmer) or your +% school, if any, to sign a ``copyright disclaimer'' for the program, if +% necessary.  Here is a sample; alter the names: +% +% \begin{quote} +% Yoyodyne, Inc., hereby disclaims all copyright interest in the program \\ +% `Gnomovision' (which makes passes at compilers) written by James Hacker. \\ +% +% signature of Ty Coon, 1 April 1989 \\ +% Ty Coon, President of Vice +% \end{quote} +% +% +% This General Public License does not permit incorporating your program +% into proprietary programs.  If your program is a subroutine library, you +% may consider it more useful to permit linking proprietary applications +% with the library.  If this is what you want to do, use the GNU Library +% General Public License instead of this License. +% +% \end{multicols} +% \end{minipage} +% \end{lrbox} +% +% \begin{center} +% \scalebox{0.33}{\usebox{\gpl}} +% \end{center} +% +% \Finale +\endinput  | 
