diff options
| author | Philipp Gesang <phg42.2a@gmail.com> | 2014-07-13 15:30:16 +0200 | 
|---|---|---|
| committer | Philipp Gesang <phg42.2a@gmail.com> | 2014-07-13 15:30:16 +0200 | 
| commit | 13dd80306495936deedf9ba81e44e7eb258098a4 (patch) | |
| tree | fa315c4a27b4b42e4ba1769a0a5dec6d5cd288f6 /doc | |
| parent | a3cd328a3e0ef88b3ba3239664f53df70d1c7aef (diff) | |
| parent | 8956e54b744091acabd83207c75826b0b1087c47 (diff) | |
| download | luaotfload-13dd80306495936deedf9ba81e44e7eb258098a4.tar.gz | |
Merge pull request #228 from phi-gamma/master
merge version 2.5 (texlive2014) into master
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/Makefile | 58 | ||||
| -rw-r--r-- | doc/filegraph.dot | 287 | ||||
| -rw-r--r-- | doc/luaotfload-context.tex | 485 | ||||
| -rw-r--r-- | doc/luaotfload-latex.tex | 448 | ||||
| -rw-r--r-- | doc/luaotfload-main.tex | 1591 | ||||
| -rw-r--r-- | doc/luaotfload-tool.rst | 325 | ||||
| -rw-r--r-- | doc/luaotfload.conf.example | 30 | ||||
| -rw-r--r-- | doc/luaotfload.conf.rst | 347 | 
8 files changed, 3571 insertions, 0 deletions
diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..ed340a4 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,58 @@ +NAME		= luaotfload +DOCPDF		= $(NAME).pdf +DOCSRC		= $(NAME)-latex.tex + +SCRIPTNAME	= luaotfload-tool +TOOLMANSRC	= $(SCRIPTNAME).rst +TOOLMAN		= $(SCRIPTNAME).1 + +CONFNAME	= luaotfload.conf +CONFMANSRC	= $(CONFNAME).rst +CONFMAN		= $(CONFNAME).5 + +MANPAGES	= $(TOOLMAN) $(CONFMAN) + +GRAPH		= filegraph +DOTPDF		= $(GRAPH).pdf +DOT		= $(GRAPH).dot + +DOCS		= $(DOTPDF) $(DOCPDF) $(MANPAGES) + +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: manuals doc +graph: $(DOTPDF) +manuals: $(TOOLMAN) $(CONFMAN) + +$(DOCPDF): $(DOCSRC) +	@echo "creating PDF documentation ($@)" +	$(DO_LATEX) +	$(DO_LATEX) +	mv -f -- $(<:tex=pdf) $@ + +$(TOOLMAN): $(TOOLMANSRC) +	@echo "creating man page ($(TOOLMAN))" +	$(DO_DOCUTILS) + +$(CONFMAN): $(CONFMANSRC) +	@echo "creating man page ($(CONFMAN))" +	$(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: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-context.tex b/doc/luaotfload-context.tex new file mode 100644 index 0000000..6c8d4b2 --- /dev/null +++ b/doc/luaotfload-context.tex @@ -0,0 +1,485 @@ +% macros=mkvi +%% 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> +%% +%% This file is part of Luaotfload. +%% +%%      Home:      https://github.com/lualatex/luaotfload +%%      Support:   <lualatex-dev@tug.org>. +%% +%% Luaotfload is under the GPL v2.0 (exactly) license. +%% +%% ---------------------------------------------------------------------------- +%% +%% Luaotfload is free software; you can redistribute it and/or +%% modify it under the terms of the GNU General Public License +%% as published by the Free Software Foundation; version 2 +%% of the License. +%% +%% Luaotfload is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%% GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with Luaotfload; if not, see <http://www.gnu.org/licenses/>. +%% +%% ---------------------------------------------------------------------------- +%% + +\unprotect + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% layout and paper +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setuppapersize [A5] [A5] %% 148×210 + +\definelayout [mainlayout] [ +  backspace=15mm, %% 133 +  textwidth=103mm, +  topspace=15mm, +] + +\setuplayout [mainlayout] + +\setuppagenumbering [location=,alternative=doublesided] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% colors +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\usecolors [x11] +\definecolor [primarycolor]   [dodgerblue4] +\definecolor [secondarycolor] [goldenrod4] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% interaction +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setupinteraction [ +  state=start, +  page=no, +  click=yes, +  style=italic, +  color=primarycolor, +  contrastcolor=secondarycolor, +  title={The Luaotfload package}, +  subtitle={OpenType layout system for Plain TeX and LaTeX}, +  author={Elie Roux & Khaled Hosny & Philipp Gesang}, +  keywords={luatex, lualatex, unicode, opentype}, +] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% fonts +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\usemodule [simplefonts] + +\definefontfeature [default]   [default] [mode=base,liga=yes,dlig=yes,tlig=yes,onum=yes] +\definefontfeature [monospace]           [liga=no,tlig=no,onum=no] + +\definefontfamily [mainface] [serif] [Linux Libertine O] [features=default] +%definefontfamily [mainface] [serif] [Liberation Serif] [feature=default] +%definefontfamily [mainface] [sans]  [Iwona]             [feature=default] +\definefontfamily [mainface] [sans]  [Iwona Medium] [ +  feature=default, +  it=file:IwonaMedium-Italic.otf, +  tf=file:IwonaMedium-Regular.otf, +  bf=file:Iwona-Bold.otf, +  bi=file:Iwona-BoldItalic.otf, +] +%definefontfamily [mainface] [sans]  [DejaVu Sans]       [feature=default] +\definefontfamily [mainface] [mono]  [Liberation Mono]   [scale=0.85,features=monospace] + +\setupbodyfont [mainface,10pt] + +\def \LUA      {Lua} +\def \LUALATEX {Lua\LATEX} +\def \OpenType {\identifier{Open\kern-.25ex Type}} + +\definealternativestyle [emphasis:texmacro]        [\ss \it \letterbackslash]       [\ss \it \letterbackslash] +\definealternativestyle [emphasis:identifier]      [\ss]                            [\ss] +\definealternativestyle [emphasis:normal]          [\sl]                            [\sl] +\definealternativestyle [emphasis:abbrev]          [{\feature [+][smallcaps]}]      [{\feature [+][smallcaps]}] +\definealternativestyle [emphasis:Largefont]       [{\switchtobodyfont[14pt]}]      [{\switchtobodyfont[14pt]}] +\definealternativestyle [emphasis:smallcaps]       [{\feature [+][smallcaps]}]      [{\feature [+][smallcaps]}] +%definealternativestyle [emphasis:nonproportional] [\mono]                          [\mono] +\definealternativestyle [emphasis:nonproportional] [\tt]                            [\tt] +\definealternativestyle [head:section]             [{\roman\feature[+][smallcaps]}] [{\roman\feature[+][smallcaps]}] +\definealternativestyle [head:subsection]          [{\roman\feature[+][smallcaps]}] [{\roman\feature[+][smallcaps]}] +\definealternativestyle [head:subsubsection]       [{\roman\feature[+][smallcaps]}] [{\roman\feature[+][smallcaps]}] +\definealternativestyle [typing:luafunction]       [\italic]                        [\italic] +\definealternativestyle [typing:fileent]           [\tt]                            [\tt] + +\definehighlight        [texmacro] [style=emphasis:texmacro]        %% cs +\definehighlight      [identifier] [style=emphasis:identifier]      %% names +\definehighlight          [abbrev] [style=emphasis:abbrev]          %% acronyms +\definehighlight        [emphasis] [style=emphasis:normal]          %% level 1 emph + +\definehighlight       [Largefont] [style=emphasis:Largefont]       %% font size +\definehighlight       [smallcaps] [style=emphasis:smallcaps]       %% font feature +\definehighlight [nonproportional] [style=emphasis:nonproportional] %% font switch + +\definetype [fileent]     [style=typing:fileent] +\definetype [luafunction] [style=typing:luafunction] +\setuptyping [style=ttx] + +\definebodyfontenvironment  [8pt] +\definebodyfontenvironment [10pt] +\definebodyfontenvironment [12pt] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% headings +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setuphead [section]       [style=head:section,      alternative=inmargin] +\setuphead [subsection]    [style=head:subsection,   alternative=inmargin] +\setuphead [subsubsection] [style=head:subsubsection,alternative=inmargin] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% running headers +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setupheadertexts +  [{\tfx \getmarking[section]}] [pagenumber] +  [pagenumber] [{\tfx \fileent{Luaotfload} Manual}] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% structurals +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% section +\def \beginsection {\dosingleempty \section_begin_indeed} + +\def \section_begin_indeed [#ref]#title{% +  \iffirstargument +    \startsection [reference=#ref,title=#title]% +  \else +    \startsection [title=#title]% +  \fi +} + +\let \endsection \stopsection + +%% subsection +\def \beginsubsection {\dosingleempty \section_begin_indeed} + +\def \subsection_begin_indeed [#ref]#title{% +  \iffirstargument +    \startsubsection [reference=#ref,title=#title]% +  \else +    \startsubsection [title=#title]% +  \fi +} + +\let \endsubsection \stopsection + +%% subsubsection +\def \beginsubsubsection {\dosingleempty \section_begin_indeed} + +\def \subsubsection_begin_indeed [#ref]#title{% +  \iffirstargument +    \startsubsubsection [reference=#ref,title=#title]% +  \else +    \startsubsubsection [title=#title]% +  \fi +} + +\let \endsubsubsection \stopsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% inline verbatim +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Context offers both \type{…} and \type<<…>>, but not an unbalanced +%% one that we could map directly onto Latex’s \verb|…|. + +\definetype [inlinecode_indeed] [style=emphasis:nonproportional] + +%% The listings macros don’t seem to handle backslashes and braces +%% well. We emulate this behavior by handling the escaping in Lua. + +\startluacode +  local lpeg           = require "lpeg" +  local Cs, P, S       = lpeg.Cs, lpeg.P, lpeg.S +  local lpegmatch      = lpeg.match +  local unescape_char  = S[[\letterbackslash\letterleftbrace\letterrightbrace]] +  local backslash      = P[[\letterbackslash]] +  local unescape       = Cs (((backslash / "" * unescape_char) + 1)^0) +  commands.unescape_things = function (str) +    context.type (lpegmatch (unescape, str)) +  end +\stopluacode + +\unexpanded \def \inlinecode #content{% +  \ctxcommand {unescape_things \!!bs \detokenize {#content}\!!es}% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% codelistings +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Now *that’s* what I call easy. + +\unexpanded \def \beginlisting {% +  \grabbufferdatadirect{listing}{beginlisting}{endlisting}% +} + +\unexpanded \def \endlisting {\typebuffer [listing]} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% enumerations and lists +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\definedescription [descriptionitem] [ +  align=right, +  alternative=hanging, +  width=2em, +] + +\def \begindescriptions {% +  \begingroup +    \def \beginnormalitem ##1\endnormalitem{% +      \startitem##1\stopitem +    } +    \let \endnormalitem   \relax +    \let \beginaltitem    \startdescriptionitem +    \let \endaltitem      \stopdescriptionitem +} + +\let \enddescriptions \endgroup + + +\definedescription [definitionitem] [ +  align=right, +  alternative=hanging, +] + +\def \begindefinitions {% +  \begingroup +    \def \beginnormalitem ##1\endnormalitem{% +      \startitem##1\stopitem +    } +    \let \endnormalitem   \relax +    \let \beginaltitem    \startdefinitionitem +    \let \endaltitem      \stopdefinitionitem +} + +\let \enddefinitions \endgroup + + +\definedescription [filelistitem] [ +  align=normal, +  alternative=hanging, +  headstyle=typing:fileent, +  width=4cm, +] + +\def \beginfilelist {% +  \begingroup +    \def \beginnormalitem ##1\endnormalitem{% +      \startitem##1\stopitem +    } +    \let \endnormalitem   \relax +    \let \beginaltitem    \startfilelistitem +    \let \endaltitem      \stopfilelistitem +} + +\let \endfilelist \endgroup + +\definedescription [functionlistitem] [ +  align=normal, +  alternative=hanging, +  headstyle=typing:luafunction, +  width=4cm, +] + +\def \beginfunctionlist {% +  \begingroup +    \def \beginnormalitem ##1\endnormalitem{% +      \startitem##1\stopitem +    } +    \let \endnormalitem   \relax +    \let \beginaltitem    \startfunctionlistitem +    \let \endaltitem      \stopfunctionlistitem +} + +\let \endfunctionlist \endgroup + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% columns +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def \begindoublecolumns {\startcolumns [2]} +\let \enddoublecolumns   \stopcolumns + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% alignment +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setupnarrower [before={\blank[line]},after={\blank[line]}] +\let \beginnarrower \startnarrower +\let \endnarrower   \stopnarrower + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% special elements +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\definefont [lmromantenregular] [file:lmroman10-regular.otf*default] + +\def \meta #1{% +  {\lmromantenregular<}% +  {\italic #1}% +  {\lmromantenregular>}% +} + +\def \beginabstractcontent {% +  \grabbufferdatadirect{abstractcontent}{beginabstractcontent}{endabstractcontent}% +} + +\let \endabstractcontent \relax + +\def \setdocumenttitle   #1{\setvalue  {document_title}{#1}} +\def \setdocumentdate    #1{\setvalue   {document_date}{#1}} +\def \setdocumentauthor  #1{\setvalue {document_author}{#1}} + +\let \typesetdocumenttitle \relax +\let \beginfrontmatter \relax + +\def \endfrontmatter { +  \startstandardmakeup +    \vfill +    \strut \hfill +      \startframed [frame=off,align=middle,width=.5\textwidth] +        \Largefont{\getvalue {document_title}} +      \stopframed +    \hfill \strut \par + +    \blank [2*big] + +    \strut \hfill +      \startframed [frame=off,align=middle,width=.65\textwidth] +        \setuplocalinterlinespace [18pt] +        \getvalue {document_author} +      \stopframed +    \hfill \strut \par + +    \vfill +    \strut \hfill \getvalue {document_date} \hfill \strut +    \blank [2*big] + +    \strut \hfill +    \startframed [width=.7\textwidth,align=normal,style=tfx,frame=off]% +      \getbuffer [abstractcontent] +    \stopframed +    \hfill \strut  +  \stopstandardmakeup +} + +\let \typesetcontent \completecontent + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% floats +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% XXX we can improve on this part later + +\usemodule [vim] +\definevimtyping [bnf] [syntax=bnf] +\definefloat [syntax] [figure] + +\def \beginsyntaxfloat #reference#caption{% +  \begingroup +    \edef \currentreference {#reference}% +    \edef \currentcaption   {#caption}% +    \grabbufferdatadirect{rawsyntaxdata}{beginsyntaxfloat}{endsyntaxfloat}% +} + +\def \endsyntaxfloat {% +    \savebuffer [rawsyntaxdata] [rawsyntaxdata] +    \startplacesyntax [ +      reference=\currentreference, +      title={\currentcaption}, +    ] +      %% there’s no \typebnfbuffer in t-vim :( +      \typebnffile {\jobname-rawsyntaxdata.tmp} +    \stopplacesyntax +  \endgroup% +} + +\def \figurefloat #reference#caption#file{% +  \startplacefigure [ +    reference=#reference, +    title={#caption}, +  ] +    \externalfigure [#file] [width=\textwidth] +  \stopplacefigure +} + + +\def \tablefloat #reference#caption#content{% +  \startplacetable [ +    reference=#reference, +    title={#caption}, +  ] +    #content +  \stopplacetable +} + + +%% tables + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% tables +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\setupxtable [frame=off,option=stretch,textwidth=\dimexpr(\textwidth/2)] + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% hyperlinks and references +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\unexpanded \def \hyperlink{% +  \dosingleempty \hyperlink_indeed% +} + +\def \hyperlink_indeed [#text]#url{% +  \iffirstargument +    \useURL [temporary_url] [#url] [] [#text]% +  \else +    \useURL [temporary_url] [#url]% +  \fi% +  \from [temporary_url]% +} + + +\def \email #1{\goto{#1}[url(mailto:#1)]} + +\def \label #tag{\reference [#tag]\empty} +\def \pageref #tag{\at{page}{#tag}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% escaped characters +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\let \charpercent   \letterpercent +\let \charbackslash \letterbackslash +\let \chartilde     \lettertilde + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% main +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\protect + +\newif \ifcontextmkiv \contextmkivtrue + +\starttext +  \input luaotfload-main.tex +\stoptext + diff --git a/doc/luaotfload-latex.tex b/doc/luaotfload-latex.tex new file mode 100644 index 0000000..34c494d --- /dev/null +++ b/doc/luaotfload-latex.tex @@ -0,0 +1,448 @@ +\luatexsuppresslongerror1%% sigh ... +%% 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> +%% +%% This file is part of Luaotfload. +%% +%%      Home:      https://github.com/lualatex/luaotfload +%%      Support:   <lualatex-dev@tug.org>. +%% +%% Luaotfload is under the GPL v2.0 (exactly) license. +%% +%% ---------------------------------------------------------------------------- +%% +%% Luaotfload is free software; you can redistribute it and/or +%% modify it under the terms of the GNU General Public License +%% as published by the Free Software Foundation; version 2 +%% of the License. +%% +%% Luaotfload is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%% GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with Luaotfload; if not, see <http://www.gnu.org/licenses/>. +%% +%% ---------------------------------------------------------------------------- +%% + +\documentclass{ltxdoc} + +\makeatletter + +\usepackage {metalogo,multicol,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} + +%% \groupedcommand, with some omissions taken from syst-aux.mkiv +\let \handlegroupnormalbefore \relax +\let \handlegroupnormalafter  \relax + +\protected \def \handlegroupnormal #1#2{% +  \bgroup % 1 +  \def \handlegroupbefore {#1}% +  \def \handlegroupafter  {#2}% +  \afterassignment \handlegroupnormalbefore +  \let \next = +} + +\def \handlegroupnormalbefore {% +  \bgroup % 2 +  \handlegroupbefore +  \bgroup % 3 +  \aftergroup \handlegroupnormalafter% +} + +\def \handlegroupnormalafter {% +  \handlegroupafter +  \egroup % 3 +  \egroup % 2 +} + +\let \groupedcommand \handlegroupnormal %% only the two arg version + +\def \definehighlight [#1][#2]{% +  \ifcsname #1\endcsname\else +    \expandafter\def\csname #1\endcsname{% +      \leavevmode +      \groupedcommand {#2}\empty% +    } +  \fi% +} + +%% old, simplistic definition: obsolete now that we have +%% \groupedcommand +%\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 + +\definehighlight       [Largefont][\Large]                              %% font size +\definehighlight       [smallcaps][\sc]                                 %% font feature +\definehighlight [nonproportional][\tt]                                 %% font switch + +\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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% structurals +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def \definestructural #1{% +  \expandafter \let \csname end#1\endcsname \relax + +  \expandafter \def \csname begin#1\endcsname {% +    \@ifnextchar[{\csname begin#1indeed\endcsname} +                 {\csname begin#1indeed\endcsname[]}% +  } + +  \expandafter \def \csname begin#1indeed\endcsname [##1]##2{% +    \edef \first {##1}% +    \ifx \first \empty +      \csname #1\endcsname [##2]{##2}% +    \else +      \csname #1\endcsname [\first]{##2}% +    \fi +  } +} + +\definestructural {section} +\definestructural {subsection} +\definestructural {subsubsection} + +\def \fakesection #1{\section*{#1}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% inline verbatim +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Context offers both \type{…} and \type<<…>>, but not an unbalanced +%% one that we could map directly onto Latex’s \verb|…|. + +\usepackage {listings} +\lstset { +  basicstyle=\ttfamily, +} + +%\let \inlinecode \lstinline +\protected \def \inlinecode {\lstinline} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% codelistings; this sucks hard since we lack access to buffers +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcount \othercatcode  \othercatcode 12 +\newcount \activecatcode \othercatcode 13 + +\newluatexcatcodetable \vrbcatcodes +\setluatexcatcodetable \vrbcatcodes {% +  \luatexcatcodetable \CatcodeTableIniTeX +  \catcode  9 \othercatcode %% \tabasciicode +  \catcode 13 \othercatcode %% \endoflineasciicode +  \catcode 12 \othercatcode %% \formfeedasciicode +  \catcode 26 \othercatcode %% \endoffileasciicode +  \catcode 32 \othercatcode %% \spaceasciicode +} + +\newluatexcatcodetable \literalcatcodes +\setluatexcatcodetable \literalcatcodes {% +  \luatexcatcodetable \CatcodeTableString +  \catcode 32 \activecatcode %% \spaceasciicode +} + +\def \beginlisting {% +  \begingroup +    \luatexcatcodetable \vrbcatcodes +    \beginlistingindeed% +} + +\directlua { +  local texprint   = tex.print +  local stringsub  = string.sub +  local backslash  = string.byte (0x5c) +  document         = document or { } +  document.printlines = function (buffer) +    for _, line in next, string.explode (buffer, "\noexpand\n") do +      if stringsub (line, 1, 1) == " " then +        line = backslash .. line +      end +      texprint (-1, line) +      texprint (-1, "") +    end +  end +} + +\def \beginlistingindeed#1\endlisting{% +  \endgroup +  \begingroup +    \ttfamily +    \small +    \begin {quote} +      \bgroup +        \addfontfeature {RawFeature=-tlig;-liga}%% So one can’t just turn them all off at once using the ``Ligatures`` key? +        \luatexcatcodetable \literalcatcodes +        \obeyspaces +        \obeylines +        \directlua{document.printlines ([==[\detokenize {#1}]==])} +      \egroup +    \end {quote} +  \endgroup +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% enumerations and lists +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def \definelist [#1]#2{% name, itemcode +  \expandafter \def \csname begin#1\endcsname {% +    \begin {itemize} +      \let \normalitem = \item +      \def \altitem ####1{% +        \def \first {####1}% +        #2 +      } +      \let \beginnormalitem \item +      \let \endnormalitem   \relax +      \let \beginaltitem    \altitem +      \let \endaltitem      \relax +  } + +  \expandafter \def \csname end#1\endcsname {% +    \end {itemize} +  } +} + +\definelist  [descriptions]{\normalitem {\textbf \first}\hfill\break} +\definelist   [definitions]{\normalitem {\fileent {\first}}} +\definelist      [filelist]{\normalitem {\fileent {\first}}\space--\hskip 1em} +\definelist  [functionlist]{\normalitem {\luafunction {\first}}\hfill\break} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% columns +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def \begindoublecolumns {\begin {multicols} {2}} +\def \enddoublecolumns   {\end {multicols}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% alignment +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\def \begincentered {\begin {center}} +\def \endcentered   {\end {center}} + +\def \beginnarrower {\begin {quote}} +\def \endnarrower   {\end {quote}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% special elements +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\let \beginfrontmatter \relax +\let \endfrontmatter   \relax + +\def \beginabstractcontent {\begin {abstract}} +\def \endabstractcontent   {\end {abstract}} + +\let \setdocumenttitle      \title +\let \setdocumentdate       \date +\let \setdocumentauthor     \author +\let \typesetdocumenttitle  \maketitle + +\AtBeginDocument {%% seriously? +  \let \typesetcontent \tableofcontents% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% floats +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% syntax definition +\def \beginsyntaxfloat #1#2{%% #1:label #2:caption +  \begin {figure} [b] +    \edef \syntaxlabel  {#1}% +    \def \syntaxcaption {#2}% +    \setlength\grammarparsep{12pt plus 2pt minus 2pt}% +    \setlength\grammarindent{5cm}% +    \begingroup +      \small +      \begin {grammar} +} + +\def \endsyntaxfloat {% +      \end {grammar} +    \endgroup +    \caption \syntaxcaption +    \label   \syntaxlabel +  \end {figure} +} + +%% figures, e.g. the file graph +\def \figurefloat #1#2#3{%% #1:label #2:caption #3:file +  \begin {figure} [b] +    \caption {#2}% +    \includegraphics[width=\textwidth]{#3}% +    \label {#1} +  \end {figure} +} + +%% tables +\def \tablefloat #1#2{%% #1:label #2:caption +  \begin {table} [t] +    \hrule +    \caption {#2}% +    \label {#1} +    \hrule +  \end {table} +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% hyperlinks +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\protected \def \hyperlink{% +  \@ifnextchar[{\hyperlinkindeed}% +               {\hyperlinkindeed[]}% +} + +\def \hyperlinkindeed [#1]#2{% +  \def \first {#1}% +  \ifx \first \empty +    \url {#2}% +  \else +    \href {#2}{#1}% +  \fi% +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% tables +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Our tables aren’t anything special so we stick with “tabular” on the +%% Latex end. +%% +%% This is going to be largely incompatible with Context since format +%% specifications work quite differently (even between different +%% Context table variants). + +\def \begintabulate [#1]#2\endtabulate{% +  \begingroup +    \let \beginrow  = \relax %% -> \NC in Context +    \let \newcell   = &      %% -> \NC +    \let \endrow    = \cr    %% -> \NC \NR +    \begin {tabular}{#1}% +      #2 +    \end {tabular} +  \endgroup +} + +\let \endtabulate \relax + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% escaped characters +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\let \charpercent   \textpercent +\let \charbackslash \textbackslash +\let \chartilde     \textasciitilde + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% main +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\makeatother + +\newif \ifcontextmkiv \contextmkivfalse + +\begin {document} +  \input {luaotfload-main.tex} +\end {document} + + diff --git a/doc/luaotfload-main.tex b/doc/luaotfload-main.tex new file mode 100644 index 0000000..034b704 --- /dev/null +++ b/doc/luaotfload-main.tex @@ -0,0 +1,1591 @@ +%% 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> +%% +%% This file is part of Luaotfload. +%% +%%      Home:      https://github.com/lualatex/luaotfload +%%      Support:   <lualatex-dev@tug.org>. +%% +%% Luaotfload is under the GPL v2.0 (exactly) license. +%% +%% ---------------------------------------------------------------------------- +%% +%% Luaotfload is free software; you can redistribute it and/or +%% modify it under the terms of the GNU General Public License +%% as published by the Free Software Foundation; version 2 +%% of the License. +%% +%% Luaotfload is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%% GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with Luaotfload; if not, see <http://www.gnu.org/licenses/>. +%% +%% ---------------------------------------------------------------------------- +%% + +\beginfrontmatter + +  \setdocumenttitle  {The \identifier{luaotfload} package} +  \setdocumentdate   {2014/**/** v2.5} +  \setdocumentauthor {Elie Roux · Khaled Hosny · Philipp Gesang\\ +                      Home:    \hyperlink {https://github.com/lualatex/luaotfload}\\ +                      Support: \email     {lualatex-dev@tug.org}} + +  \typesetdocumenttitle + +  \beginabstractcontent +    This package is an adaptation of the \CONTEXT font loading system. +    It allows for loading \OpenType fonts with an extended syntax and adds +    support for a variety of font features. +  \endabstractcontent + +\endfrontmatter + +\typesetcontent + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Introduction} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Font management and installation has always been painful with \TEX.  A +lot of files are needed for one font (\abbrev{tfm}, \abbrev{pfb}, +\abbrev{map}, \abbrev{fd}, \abbrev{vf}), and due to the 8-Bit encoding +each font is limited to 256 characters. + +But the font world has evolved since the original \TEX, and new +typographic systems have appeared, most notably the so called +\emphasis{smart font} technologies like \OpenType fonts (\abbrev{otf}). + +These fonts can contain many more characters than \TEX fonts, as well +as additional functionality like ligatures, old-style numbers, small +capitals, etc., and support more complex writing systems like Arabic +and Indic\footnote{% +  Unfortunately, \identifier{luaotfload} doesn‘t support many Indic +  scripts right now. +  Assistance in implementing the prerequisites is greatly +  appreciated. +} +scripts. + +\OpenType fonts are widely deployed and available for all modern +operating systems. + +As of 2013 they have become the de facto standard for advanced text +layout. + +However, until recently the only way to use them directly in the \TEX +world was with the \XETEX engine. + +Unlike \XETEX, \LUATEX has no built-in support for \OpenType or +technologies other than the original \TEX fonts. + +Instead, it provides hooks for executing \LUA code during the \TEX run +that allow implementing extensions for loading fonts and manipulating +how input text is processed without modifying the underlying engine. + +This is where \identifier{luaotfload} comes into play: +Based on code from \CONTEXT, it extends \LUATEX with functionality necessary +for handling \OpenType fonts. + +Additionally, it provides means for accessing fonts known to the operating +system conveniently by indexing the metadata. + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Thanks} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\identifier{Luaotfload} is part of \LUALATEX, the community-driven +project to provide a foundation for using the \LATEX format with the +full capabilites of the \LUATEX engine. +% +As such, the distinction between end users, contributors, and project +maintainers is intentionally kept less strict, lest we unduly +personalize the common effort. + +Nevertheless, the current maintainers would like to express their +gratitude to Khaled Hosny, Akira Kakuto, Hironori Kitagawa and Dohyun +Kim. +% +Their contributions -- be it patches, advice, or systematic +testing -- made the switch from version 1.x to 2.2 possible. +% +Also, Hans Hagen, the author of the font loader, made porting the +code to \LATEX a breeze due to the extra effort he invested into +isolating it from the rest of \CONTEXT, not to mention his assistance +in the task and willingness to respond to our suggestions. + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Loading Fonts} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\identifier{luaotfload} supports an extended font request syntax: + +\beginnarrower +      \nonproportional{\string\font\string\foo\space= \string{}% +      \meta{prefix}\nonproportional{:}% +      \meta{font name}\nonproportional{:}% +      \meta{font features}\nonproportional{\string}}% +      \meta{\TEX font features} +\endnarrower + +\noindent +The curly brackets are optional and escape the spaces in the enclosed +font name. +% +Alternatively, double quotes serve the same purpose. +% +A selection of individual parts of the syntax are discussed below; +for a more formal description see figure \ref{font-syntax}. + +\beginsyntaxfloat +  {font-syntax} +  {Font request syntax. +   Braces or double quotes around the +   \emphasis{specification} rule will +   preserve whitespace in file names. +   In addition to the font style modifiers +   (\emphasis{slash-notation}) given above, there +   are others that are recognized but will be silently +   ignored: \nonproportional{aat}, +            \nonproportional{icu}, and +            \nonproportional{gr}. +   The special terminals are: +   \smallcaps {feature\textunderscore id} for a valid font +      feature name and +   \smallcaps {feature\textunderscore value} for the corresponding +      value. +   \smallcaps {tfmname} is the name of a \abbrev{tfm} file. +   \smallcaps {digit}  again refers to bytes 48--57, and +   \smallcaps {all\textunderscore characters} to all byte values. +   \smallcaps {csname} and \smallcaps {dimension} are the \TEX concepts.} +% +      <definition>      ::= `\\font', {\sc csname}, `=', <font request>, [ <size> ] ; + +      <size>            ::= `at', {\sc dimension} ; + +      <font request>    ::= `"', <unquoted font request> `"' +      \alt                  `{', <unquoted font request> `}' +      \alt                  <unquoted font request> ; + +      <unquoted font request> ::= <specification>, [`:', <feature list> ] +      \alt                        `[', <path lookup> `]', [ [`:'], <feature list> ] ; + +      <specification>    ::= <prefixed spec>, [ <subfont no> ], \{ <modifier> \} +      \alt                   <anon lookup>, \{ <modifier> \} ; + +      <prefixed spec>    ::= `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} - ( `(' | `/' | `:' ) ; +\endsyntaxfloat + +\beginsubsection{Prefix -- the \identifier{luaotfload}{ }Way} + +In \identifier{luaotfload}, the canonical syntax for font requests +requires a \emphasis{prefix}: +% +\beginnarrower +  \nonproportional{\string\font\string\fontname\space= }% +  \meta{prefix}% +  \nonproportional{:}% +  \meta{fontname}% +  \dots +\endnarrower +% +where \meta{prefix} is either \inlinecode{file:} or \inlinecode {name:}.\footnote{% +  The development version also knows two further prefixes, +  \inlinecode {kpse:} and \inlinecode {my:}. +  % +  A \inlinecode {kpse} lookup is restricted to files that can be found by +  \identifier{kpathsea} and +  will not attempt to locate system fonts. +  % +  This behavior can be of value when an extra degree of encapsulation is +  needed, for instance when supplying a customized tex distribution. + +  The \inlinecode {my} lookup takes this a step further: it lets you define +  a custom resolver function and hook it into the \luafunction{resolve_font} +  callback. +  % +  This ensures full control over how a file is located. +  % +  For a working example see the +  \hyperlink [test repo]{https://bitbucket.org/phg/lua-la-tex-tests/src/5f6a535d/pln-lookup-callback-1.tex}. +} +% +It determines whether the font loader should interpret the request as +a \emphasis{file name} or +  \emphasis{font name}, respectively, +which again influences how it will attempt to locate the font. +% +Examples for font names are +            “Latin Modern Italic”, +            “GFS Bodoni Rg”, and +            “PT Serif Caption” +-- they are the human readable identifiers +usually listed in drop-down menus and the like.\footnote{% +  Font names may appear like a great choice at first because they +  offer seemingly more intuitive identifiers in comparison to arguably +  cryptic file names: +  % +  “PT Sans Bold” is a lot more descriptive than \fileent{PTS75F.ttf}. +  On the other hand, font names are quite arbitrary and there is no +  universal method to determine their meaning. +  % +  While \identifier{luaotfload} provides fairly sophisticated heuristic +  to figure out a matching font style, weight, and optical size, it +  cannot be relied upon to work satisfactorily for all font files. +  % +  For an in-depth analysis of the situation and how broken font names +  are, please refer to +  \hyperlink [this post]{http://www.ntg.nl/pipermail/ntg-context/2013/073889.html} +  by Hans Hagen, the author of the font loader. +  % +  If in doubt, use filenames. +  % +  \fileent{luaotfload-tool} can perform the matching for you with the +  option \inlinecode {--find=<name>}, and you can use the file name it returns +  in your font definition. +} +% +In order for fonts installed both in system locations and in your +\fileent{texmf} to be accessible by font name, \identifier{luaotfload} must +first collect the metadata included in the files. +% +Please refer to section~\ref{sec:fontdb} below for instructions on how to +create the database. + +File names are whatever your file system allows them to be, except +that that they may not contain the characters +  \inlinecode {(}, +  \inlinecode {:}, and +  \inlinecode {/}. +% +As is obvious from the last exception, the \inlinecode {file:} lookup will +not process paths to the font location -- only those +files found when generating the database are addressable this way. +% +Continue below in the \XETEX section if you need to load your fonts +by path. +% +The file names corresponding to the example font names above are +  \fileent{lmroman12-italic.otf}, +  \fileent{GFSBodoni.otf}, and +  \fileent{PTZ56F.ttf}. + +\endsubsection + +\beginsubsection {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. + +\beginnarrower +  \nonproportional{\string\font\string\fontname\space = [}% +  \meta{/path/to/file}% +  \nonproportional{]} +\endnarrower + +\noindent +Inside the square brackets, every character except for a closing +bracket is permitted, allowing for specifying paths to a font file. +% +Naturally, path-less file names are equally valid and processed the +same way as an ordinary \inlinecode {file:} lookup. + +\beginnarrower +  \nonproportional{\string\font\string\fontname\space= }% +  \meta{font name} +  \dots +\endnarrower + +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 \inlinecode {name:} lookup, which itself will +fall back to a \inlinecode {file:} lookup if no database entry matches +\meta{font name}. + +Furthermore, \identifier{luaotfload} supports the slashed (shorthand) +font style notation from \XETEX. + +\beginnarrower +  \nonproportional{\string\font\string\fontname\space= }% +  \meta{font name}% +  \nonproportional{/}% +  \meta{modifier} +  \dots +\endnarrower + +\noindent +Currently, four style modifiers are supported: +  \inlinecode {I} for italic shape, +  \inlinecode {B} for bold   weight, +  \inlinecode {BI} or \inlinecode {IB} for the combination of both. +% +Other “slashed” modifiers are too specific to the \XETEX engine and +have no meaning in \LUATEX. + +\endsubsection + +\beginsubsection{Examples} + +\beginsubsubsection{Loading by File Name} + +For example, conventional \abbrev{type1} font can be loaded with a +\inlinecode {file:} request like so: + +\beginlisting +  \font \lmromanten = {file:ec-lmr10} at 10pt +\endlisting + +The \OpenType version of Janusz Nowacki’s font \emphasis{Antykwa +Półtawskiego}\footnote{% +  \hyperlink {http://jmn.pl/antykwa-poltawskiego/}, also available in +  in \TEX Live. +} +in its condensed variant can be loaded as follows: + +\beginlisting +  \font \apcregular = file:antpoltltcond-regular.otf at 42pt +\endlisting + +The next example shows how to load the \emphasis{Porson} font digitized by +the Greek Font Society using \XETEX-style syntax and an absolute path from a +non-standard directory: + +\beginlisting +  \font \gfsporson = "[/tmp/GFSPorson.otf]" at 12pt +\endlisting + +\endsubsubsection + +\beginsubsubsection{Loading by Font Name} + +The \inlinecode {name:} lookup does not depend on cryptic filenames: + +\beginlisting +  \font \pagellaregular = {name:TeX Gyre Pagella} at 9pt +\endlisting + +A bit more specific but essentially the same lookup would be: + +\beginlisting +  \font \pagellaregular = {name:TeX Gyre Pagella Regular} at 9pt +\endlisting + +\noindent +Which fits nicely with the whole set: + +\beginlisting +  \font\pagellaregular    = {name:TeX Gyre Pagella Regular}    at 9pt +  \font\pagellaitalic     = {name:TeX Gyre Pagella Italic}     at 9pt +  \font\pagellabold       = {name:TeX Gyre Pagella Bold}       at 9pt +  \font\pagellabolditalic = {name:TeX Gyre Pagella Bolditalic} at 9pt + +  {\pagellaregular     foo bar baz\endgraf} +  {\pagellaitalic      foo bar baz\endgraf} +  {\pagellabold        foo bar baz\endgraf} +  {\pagellabolditalic  foo bar baz\endgraf} + +  ... +\endlisting + +\endsubsubsection + +\beginsubsubsection{Modifiers} + +If the entire \emphasis{Iwona} family\footnote{% +  \hyperlink {http://jmn.pl/kurier-i-iwona/}, +  also in \TEX Live. +} +is installed in some location accessible by \identifier{luaotfload}, +the regular shape can be loaded as follows: + +\beginlisting +  \font \iwona = Iwona at 20pt +\endlisting + +\noindent +To load the most common of the other styles, the slash notation can +be employed as shorthand: + +\beginlisting +  \font \iwonaitalic     = Iwona/I    at 20pt +  \font \iwonabold       = Iwona/B    at 20pt +  \font \iwonabolditalic = Iwona/BI   at 20pt +\endlisting + +\noindent +which is equivalent to these full names: + +\beginlisting +  \font \iwonaitalic     = "Iwona Italic"       at 20pt +  \font \iwonabold       = "Iwona Bold"         at 20pt +  \font \iwonabolditalic = "Iwona BoldItalic"   at 20pt +\endlisting + +\endsubsubsection +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Font features} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\emphasis{Font features} are the second to last component in the +general scheme for font requests: + +\beginnarrower +  \nonproportional{\string\font\string\foo\space= "}% +  \meta{prefix}% +  \nonproportional{:}% +  \meta{font name}% +  \nonproportional{:}% +  \meta{font features}% +  \meta{\TEX font features}% +  \nonproportional{"} +\endnarrower + +\noindent +If style modifiers are present (\XETEX style), they must precede +\meta{font features}. + +The element \meta{font features} is a semicolon-separated list of feature +tags\footnote{% +  Cf. \hyperlink {http://www.microsoft.com/typography/otspec/featurelist.htm}. +} +and font options. +% +Prepending a font feature with a \inlinecode{+} (plus sign) enables it, +whereas a \inlinecode{-} (minus) disables it. For instance, the request + +\beginlisting +  \font \test = LatinModernRoman:+clig;-kern +\endlisting + +\noindent activates contextual ligatures (\inlinecode{clig}) and +disables kerning (\inlinecode{kern}). +% +Alternatively the options \inlinecode{true} or \inlinecode{false} can +be passed to the feature in a key/value expression. +% +The following request has the same meaning as the last one: + +\beginlisting +  \font \test = LatinModernRoman:clig=true;kern=false +\endlisting + +\noindent +Furthermore, this second syntax is required should a font feature +accept other options besides a true/false switch. +% +For example, \emphasis{stylistic alternates} (\inlinecode{salt}) are +variants of given glyphs. +% +They can be selected either explicitly by supplying the variant +index (starting from one), or randomly by setting the value to, +obviously, \inlinecode{random}. + +%% TODO   verify that this actually works with a font that supports +%%        the salt/random feature!\fi +\beginlisting +  \font \librmsaltfirst = LatinModernRoman:salt=1 +\endlisting + +\beginsubsection {Basic font features} + +\begindescriptions + +  \beginaltitem {mode} +         \identifier{luaotfload} has two \OpenType processing +         \emphasis{modes}: +         \identifier{base} and \identifier{node}. + +         \identifier{base} mode works by mapping \OpenType +         features to traditional \TEX ligature and kerning mechanisms. +         % +         Supporting only non-contextual substitutions and kerning +         pairs, it is the slightly faster, albeit somewhat limited, variant. +         % +         \identifier{node} mode works by processing \TeX’s internal +         node list directly at the \LUA end and supports +         a wider range of \OpenType features. +         % +         The downside is that the intricate operations required for +         \identifier{node} mode may slow down typesetting especially +         with complex fonts and it does not work in math mode. + +         By default \identifier{luaotfload} is in \identifier{node} +         mode, and \identifier{base} mode has to be requested where needed, +         e.~g. for math fonts. +  \endaltitem + +  \beginaltitem {script} \label{script-tag} +         An \OpenType script tag;\footnote{% +           See \hyperlink {http://www.microsoft.com/typography/otspec/scripttags.htm} +           for a list of valid values. +           % +           For scripts derived from the Latin alphabet the value +           \inlinecode{latn} is good choice. +         } +         the default value is \inlinecode{dlft}. +         % +         Some fonts, including very popular ones by foundries like Adobe, +         do not assign features to the \inlinecode{dflt} script, in +         which case the script needs to be set explicitly. +  \endaltitem + +  \beginaltitem {language} +         An \OpenType language system identifier,\footnote{% +           Cf. \hyperlink {http://www.microsoft.com/typography/otspec/languagetags.htm}. +         } +         defaulting to \inlinecode{dflt}. +  \endaltitem + +  \beginaltitem {featurefile} +         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. \hyperlink {http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html}. +           Feature file support is part of the engine which at the +           time of this writing (2014) implements the spec only +           partially. +           See the +           \hyperlink [\LUATEX tracker]{http://tracker.luatex.org/view.php?id=231} +            for details. +         } + +         For a demonstration of how to set a \inlinecode{tkrn} feature consult +         the file \inlinecode{tkrn.fea} that is part of \identifier{luaotfload}. +         It can be read and applied as follows: + +         \inlinecode{\\font \\test = Latin Modern Roman:featurefile=tkrn.fea;+tkrn} +  \endaltitem + +  \beginaltitem {color} +         A font color, defined as a triplet of two-digit hexadecimal +         \abbrev{rgb} values, with an optional fourth value for +         transparency +         (where \inlinecode{00} is completely transparent and +         \inlinecode{FF} is opaque). + +         For example, in order to set text in semitransparent red: + +         \beginlisting +\font \test = "Latin Modern Roman:color=FF0000BB" +         \endlisting +  \endaltitem + +  \beginaltitem {kernfactor \& letterspace} +         Define a font with letterspacing (tracking) enabled. +         % +         In \identifier{luaotfload}, letterspacing is implemented by +         inserting additional kerning between glyphs. + +         This approach is derived from and still quite similar to the +         \emphasis{character kerning} (\texmacro{setcharacterkerning} / +         \texmacro{definecharacterkerning} \& al.) functionality of +         Context, see the file \fileent{typo-krn.lua} there. +         % +         The main difference is that \identifier{luaotfload} does not +         use \LUATEX attributes to assign letterspacing to regions, +         but defines virtual letterspaced versions of a font. + +         The option \identifier{kernfactor} accepts a numeric value that +         determines the letterspacing factor to be applied to the font +         size. +         % +         E.~g. a kern factor of $0.42$ applied to a $10$ pt font +         results in $4.2$ pt of additional kerning applied to each +         pair of glyphs. +         % +         Ligatures are split into their component glyphs unless +         explicitly ignored (see below). + +         For compatibility with \XETEX an alternative +         \identifier{letterspace} option is supplied that interprets the +         supplied value as a \emphasis{percentage} of the font size but +         is otherwise identical to \identifier{kernfactor}. +         % +         Consequently, both definitions in below snippet yield the same +         letterspacing width: + +         \beginlisting +\font \iwonakernedA = "file:Iwona-Regular.otf:kernfactor=0.125" +\font \iwonakernedB = "file:Iwona-Regular.otf:letterspace=12.5" +         \endlisting + +         Specific pairs of letters and ligatures may be exempt from +         letterspacing by defining the \LUA functions +         \luafunction{keeptogether} and \luafunction{keepligature}, +         respectively, inside the namespace \inlinecode {luaotfload.letterspace}. +         % +         Both functions are called whenever the letterspacing callback +         encounters an appropriate node or set of nodes. +         % +         If they return a true-ish value, no extra kern is inserted at +         the current position. +         % +         \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. +  \endaltitem + +\ifcontextmkiv +  \startbuffer [printvectors] +  \directlua{inspect(fonts.protrusions.setups.default) +             inspect(fonts.expansions.setups.default)} +  \stopbuffer +\fi + +  \beginaltitem {protrusion \& expansion} +         These keys control microtypographic features of the font, +         namely \emphasis{character protrusion} and \emphasis{font +         expansion}. +         % +         Their arguments are names of \LUA tables that contain +         values for the respective features.\footnote{% +            For examples of the table layout please refer to the +            section of the file \fileent{luaotfload-fonts-ext.lua} where the +            default values are defined. +            % +            Alternatively and with loss of information, you can dump +            those tables into your terminal by issuing +            \unless \ifcontextmkiv +              \beginlisting + \directlua{inspect(fonts.protrusions.setups.default) +            inspect(fonts.expansions.setups.default)} +              \endlisting +            \else +              \typebuffer [printvectors] +            \fi +            at some point after loading \fileent{luaotfload.sty}. +         } +         % +         For both, only the set \identifier{default} is predefined. + +         For example, to define a font with the default +         protrusion vector applied\footnote{% +           You also need to set +               \inlinecode {pdfprotrudechars=2} and +               \inlinecode {pdfadjustspacing=2} +           to activate protrusion and expansion, respectively. +           See the +           \hyperlink [\PDFTEX manual]{http://mirrors.ctan.org/systems/pdftex/manual/pdftex-a.pdf}% +           for details. +         }: + +         \beginlisting +\font \test = LatinModernRoman:protrusion=default +         \endlisting +  \endaltitem +\enddescriptions + +\endsubsection + +\beginsubsection {Non-standard font features} +\identifier{luaotfload} adds a number of features that are not defined +in the original \OpenType specification, most of them +aiming at emulating the behavior familiar from other \TEX engines. +% +Currently (2014) there are three of them: + +\begindescriptions + +  \beginaltitem {anum} +          Substitutes the glyphs in the \abbrev{ascii} number range +          with their counterparts from eastern Arabic or Persian, +          depending on the value of \identifier{language}. +  \endaltitem + +  \beginaltitem {tlig} +          Applies legacy \TEX ligatures\footnote{% +            These contain the feature set \inlinecode {trep} of earlier +            versions of \identifier{luaotfload}. + +            Note to \XETEX users: this is the equivalent of the +            assignment \inlinecode {mapping=text-tex} using \XETEX's input +            remapping feature. +          }: + +          \unless \ifcontextmkiv +            %% Using braced arg syntax with inline code appears to be +            %% impossible within Latex tables -- just ignore the weird +            %% exclamation points below. +            \begintabulate [rlrl] +              \beginrow ``  \newcell  {\inlinecode !``! } \newcell  ''  \newcell  {\inlinecode !''!} \endrow +              \beginrow `   \newcell  {\inlinecode !`!  } \newcell  '   \newcell  {\inlinecode !'! } \endrow +              \beginrow "   \newcell  {\inlinecode !"!  } \newcell  --  \newcell  {\inlinecode !--!} \endrow +              \beginrow --- \newcell  {\inlinecode !---!} \newcell  !`  \newcell  {\inlinecode ?!`?} \endrow +              \beginrow ?`  \newcell  {\inlinecode !?`! } \newcell      \newcell                     \endrow +            \endtabulate +          \else +            %% XXX find a way to wrap these in the tabulate environment +            \startframed [frame=off,width=broad,align=middle] +              \startframed [frame=off,width=\dimexpr(\textwidth/2)] +                \startxtable [align=middle] +                    \startxrow \startxcell ``  \stopxcell \startxcell  \inlinecode {``}  \stopxcell \startxcell  ''  \stopxcell \startxcell  \inlinecode {''}  \stopxcell \stopxrow +                    \startxrow \startxcell `   \stopxcell \startxcell  \inlinecode {`}   \stopxcell \startxcell  '   \stopxcell \startxcell  \inlinecode {'}   \stopxcell \stopxrow +                    \startxrow \startxcell "   \stopxcell \startxcell  \inlinecode {"}   \stopxcell \startxcell  --  \stopxcell \startxcell  \inlinecode {--}  \stopxcell \stopxrow +                    \startxrow \startxcell --- \stopxcell \startxcell  \inlinecode {---} \stopxcell \startxcell  !`  \stopxcell \startxcell  \inlinecode {!`}  \stopxcell \stopxrow +                    \startxrow \startxcell ?`  \stopxcell \startxcell  \inlinecode {?`}  \stopxcell \startxcell      \stopxcell \startxcell                    \stopxcell \stopxrow +                \stopxtable +              \stopframed +            \stopframed +          \fi +  \endaltitem + +  \beginaltitem {itlc} +          Computes italic correction values (active by default). +  \endaltitem + +\enddescriptions + +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Font names database} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\label{sec:fontdb} + +As mentioned above, \identifier{luaotfload} keeps track of which +fonts are available to \LUATEX by means of a \emphasis{database}. +% +This allows referring to fonts not only by explicit filenames but +also by the proper names contained in the metadata which is often +more accessible to humans.\footnote{% +  The tool \hyperlink[\fileent{otfinfo}]{http://www.lcdf.org/type/} +  (comes with \TEX Live), when invoked on a font file with the +  \inlinecode {-i} option, lists the variety of name fields defined for +  it. +} + +When \identifier{luaotfload} is asked to load a font by a font name, +it will check if the database exists and load it, or else generate a +fresh one. +% +Should it then fail to locate the font, an update to the database is +performed in case the font has been added to the system only +recently. +% +As soon as the database is updated, the resolver will try +and look up the font again, all without user intervention. +% +The goal is for \identifier{luaotfload} to act in the background and +behave as unobtrusively as possible, while providing a convenient +interface to the fonts installed on the system. + +Generating the database for the first time may take a while since it +inspects every font file on your computer. +% +This is particularly noticeable if it occurs during a typesetting run. +In any case, subsequent updates to the database will be quite fast. + +\beginsubsection[luaotfload-tool] +                {\fileent{luaotfload-tool}} + +It can still be desirable at times to do some of these steps +manually, and without having to compile a document. +% +To this end, \identifier{luaotfload} comes with the utility +\fileent{luaotfload-tool} that offers an interface to the database +functionality. +% +Being a \LUA script, there are two ways to run it: +either make it executable (\inlinecode {chmod +x} on unixoid systems) or +pass it as an argument to \fileent{texlua}.\footnote{% +  Tests by the maintainer show only marginal performance gain by +  running with Luigi Scarso’s +  \hyperlink [\identifier{Luajit\kern-.25ex\TEX}]{https://foundry.supelec.fr/projects/luajittex/}, +  which is probably due to the fact that most of the time is spent +  on file system operations. + +  \emphasis{Note}: +  On \abbrev{MS} \identifier{Windows} systems, the script can be run +  either by calling the wrapper application +  \fileent{luaotfload-tool.exe} or as +  \inlinecode {texlua.exe luaotfload-tool.lua}. +} +% +Invoked with the argument \inlinecode {--update} it will perform a database +update, scanning for fonts not indexed. + +\beginlisting +  luaotfload-tool --update +\endlisting + +Adding the \inlinecode {--force} switch will initiate a complete +rebuild of the database. + +\beginlisting +  luaotfload-tool --update --force +\endlisting + +\endsubsection + +\beginsubsection{Search Paths} + +\identifier{luaotfload} scans those directories where fonts are +expected to be located on a given system. +% +On a Linux machine it follows the paths listed in the +\identifier{Fontconfig} configuration files; +consult \inlinecode {man 5 fonts.conf} for further information. +% +On \identifier{Windows} systems, the standard location is +\inlinecode {Windows\\Fonts}, +% +while \identifier{Mac OS~X} requires a multitude of paths to +be examined. +% +The complete list is is given in table \ref{table-searchpaths}. +Other paths can be specified by setting the environment variable +\inlinecode {OSFONTDIR}. +% +If it is non-empty, then search will be extended to the included +directories. + +\tablefloat {table-searchpaths} +  {List of paths searched for each supported operating system.} +  {% +    \unless \ifcontextmkiv +      \begincentered +        \begintabulate [lp{.5\textwidth}] +          \beginrow +            Windows   \newcell \inlinecode !\% WINDIR\%\\ Fonts! +          \endrow +          \beginrow +            Linux     \newcell \fileent{/usr/local/etc/fonts/fonts.conf} and\hfill\break +                               \fileent{/etc/fonts/fonts.conf} +          \endrow +          \beginrow +            Mac       \newcell \fileent{\textasciitilde/Library/Fonts},\break +                               \fileent{/Library/Fonts},\break +                               \fileent{/System/Library/Fonts}, and\hfill\break +                               \fileent{/Network/Library/Fonts} +          \endrow +        \endtabulate +      \endcentered +    \else +      \setuplocalinterlinespace [14pt] +      \starttabulate [|l|p(.5\textwidth)|] +        \NC Windows   \NC \inlinecode {\% WINDIR\%\\ Fonts} \NC \NR +        \NC Linux     \NC \fileent{/usr/local/etc/fonts/fonts.conf} and\crlf +                          \fileent{/etc/fonts/fonts.conf} \NC \NR +        \NC +          Mac         \NC \fileent{\textasciitilde/Library/Fonts},\crlf +                          \fileent{/Library/Fonts},\break +                          \fileent{/System/Library/Fonts}, and\crlf +                          \fileent{/Network/Library/Fonts} \NC \NR +      \stoptabulate +    \fi% +  } + +\endsubsection + +\beginsubsection{Querying from Outside} + +\fileent{luaotfload-tool} also provides rudimentary means of +accessing the information collected in the font database. +% +If the option \inlinecode {--find=}\emphasis{name} is given, the script will +try and search the fonts indexed by \identifier{luaotfload} for a +matching name. +% +For instance, the invocation + +\beginlisting +  luaotfload-tool  --find="Iwona Regular" +\endlisting + +\noindent +will verify if “Iwona Regular” is found in the database and can be +readily requested in a document. + +If you are unsure about the actual font name, then add the +\inlinecode {-F} (or \inlinecode {--fuzzy}) switch to the command line to enable +approximate matching. +% +Suppose you cannot precisely remember if the variant of +\identifier{Iwona} you are looking for was “Bright” or “Light”. +The query + +\beginlisting +  luaotfload-tool  -F --find="Iwona Bright" +\endlisting + +\noindent +will tell you that indeed the latter name is correct. + +Basic information about fonts in the database can be displayed +using the \inlinecode {-i} option (\inlinecode {--info}). +% +\beginlisting +  luaotfload-tool  -i --find="Iwona Light Italic" +\endlisting +% +\noindent +The meaning of the printed values is described in section 4.4 of the +\LUATEX reference manual.\footnote{% +  In \TEX Live: \fileent{texmf-dist/doc/luatex/base/luatexref-t.pdf}. +} + +For a much more detailed report about a given font try the +\inlinecode {-I} option instead (\inlinecode {--inspect}). +\beginlisting +  luaotfload-tool  -I --find="Iwona Light Italic" +\endlisting + +\inlinecode {luaotfload-tool --help} will list the available command line +switches, including some not discussed in detail here. +% +For a full documentation of \identifier{luaotfload-tool} and its +capabilities refer to the manpage +(\inlinecode {man 1 luaotfload-tool}).\footnote{% +  Or see \inlinecode {luaotfload-tool.rst} in the source directory. +} + +\endsubsection + +\beginsubsection {Blacklisting Fonts} +\label{font-blacklist} + +Some fonts are problematic in general, or just in \LUATEX. +% +If you find that compiling your document takes far too long or eats +away all your system’s memory, you can track down the culprit by +running \inlinecode {luaotfload-tool -v} to increase verbosity. +% +Take a note of the \emphasis{filename} of the font that database +creation fails with and append it to the file +\fileent{luaotfload-blacklist.cnf}. + +A blacklist file is a list of font filenames, one per line. +Specifying the full path to where the file is located is optional, the +plain filename should suffice. +% +File extensions (\fileent{.otf}, \fileent{.ttf}, etc.) may be omitted. +% +Anything after a percent (\inlinecode {\%}) character until the end of the line +is ignored, so use this to add comments. +% +Place this file to some location where the \identifier{kpse} +library can find it, e.~g. +\fileent{texmf-local/tex/luatex/luaotfload} if you are running +\identifier{\TEX Live},\footnote{% +  You may have to run \inlinecode {mktexlsr} if you created a new file in +  your \fileent{texmf} tree. +} +or just leave it in the working directory of your document. +% +\identifier{luaotfload} reads all files named +\fileent{luaotfload-blacklist.cnf} it finds, so the fonts in +\fileent{./luaotfload-blacklist.cnf} extend the global blacklist. + +Furthermore, a filename prepended with a dash character (\inlinecode{-}) is +removed from the blacklist, causing it to be temporarily whitelisted +without modifying the global file. +% +An example with explicit paths: + +\beginlisting +% example otf-blacklist.cnf +/Library/Fonts/GillSans.ttc  % Luaotfload ignores this font. +-/Library/Fonts/Optima.ttc   % This one is usable again, even if +                             % blacklisted somewhere else. +\endlisting + +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Files from \CONTEXT and \LUATEX-Fonts} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\identifier{luaotfload} relies on code originally written by Hans +Hagen for the \hyperlink[\identifier{\CONTEXT}]{http://wiki.contextgarden.net} +format. +% +It integrates the font loader 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 +  \hyperlink [part of \CONTEXT]{http://repo.or.cz/w/context.git/blob_plain/refs/heads/origin:/scripts/context/lua/mtx-package.lua} +  and requires \fileent{mtxrun}. +  Run +  \inlinecode {mtxrun --script package --help} +  to display further information. +  For the actual merging code see the file +  \fileent{util-mrg.lua} that is part of \CONTEXT. +} +It houses several \LUA files that can be classed in three +categories. + +\begindefinitions +  \beginnormalitem +    \emphasis{\LUA utility libraries}, a subset +    of what is provided by the \identifier{lualibs} +    package. + +    \begindoublecolumns +      \begindefinitions +          \beginaltitem {l-lua.lua}       \endaltitem +          \beginaltitem {l-lpeg.lua}      \endaltitem +          \beginaltitem {l-function.lua}  \endaltitem +          \beginaltitem {l-string.lua}    \endaltitem +          \beginaltitem {l-table.lua}     \endaltitem +          \beginaltitem {l-io.lua}        \endaltitem +          \beginaltitem {l-file.lua}      \endaltitem +          \beginaltitem {l-boolean.lua}   \endaltitem +          \beginaltitem {l-math.lua}      \endaltitem +          \beginaltitem {util-str.lua}    \endaltitem +      \enddefinitions +    \enddoublecolumns +  \endnormalitem + +  \beginnormalitem +    The \emphasis{font loader} itself. +    These files have been written for +    \LUATEX-Fonts and they are distributed along +    with \identifier{luaotfload}. +    \begindoublecolumns +      \begindefinitions +        \beginaltitem{luatex-basics-gen.lua} \endaltitem +        \beginaltitem{luatex-basics-nod.lua} \endaltitem +        \beginaltitem{luatex-fonts-enc.lua}  \endaltitem +        \beginaltitem{luatex-fonts-syn.lua}  \endaltitem +        \beginaltitem{luatex-fonts-tfm.lua}  \endaltitem +        \beginaltitem{luatex-fonts-chr.lua}  \endaltitem +        \beginaltitem{luatex-fonts-lua.lua}  \endaltitem +        \beginaltitem{luatex-fonts-inj.lua}  \endaltitem +        \beginaltitem{luatex-fonts-otn.lua}  \endaltitem +        \beginaltitem{luatex-fonts-def.lua}  \endaltitem +        \beginaltitem{luatex-fonts-ext.lua}  \endaltitem +        \beginaltitem{luatex-fonts-cbk.lua}  \endaltitem +      \enddefinitions +    \enddoublecolumns +  \endnormalitem + +  \beginnormalitem +    Code related to \emphasis{font handling and +    node processing}, taken directly from +    \CONTEXT. +    \begindoublecolumns +      \begindefinitions +        \beginaltitem{data-con.lua} \endaltitem +        \beginaltitem{font-ini.lua} \endaltitem +        \beginaltitem{font-con.lua} \endaltitem +        \beginaltitem{font-cid.lua} \endaltitem +        \beginaltitem{font-map.lua} \endaltitem +        \beginaltitem{font-oti.lua} \endaltitem +        \beginaltitem{font-otf.lua} \endaltitem +        \beginaltitem{font-otb.lua} \endaltitem +        \beginaltitem{font-ota.lua} \endaltitem +        \beginaltitem{font-def.lua} \endaltitem +        \beginaltitem{font-otp.lua} \endaltitem +      \enddefinitions +    \enddoublecolumns +  \endnormalitem +\enddefinitions + +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 +\inlinecode {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. + + +\beginfilelist +    \beginaltitem {luaotfload-features.lua} +      font feature handling; incorporates some of the code from +      \fileent{font-otc} from \CONTEXT; +    \endaltitem +    \beginaltitem {luaotfload-override.lua} +      overrides the \CONTEXT logging functionality. +    \endaltitem +    \beginaltitem {luaotfload-loaders.lua} +      registers the \OpenType font reader as handler for Postscript +      fonts (\abbrev{pfa}, \abbrev{pfb}). +    \endaltitem +    \beginaltitem {luaotfload-parsers.lua} +      various \abbrev{lpeg}-based parsers. +    \endaltitem +    \beginaltitem {luaotfload-database.lua} +      font names database. +    \endaltitem +    \beginaltitem {luaotfload-colors.lua} +      color handling. +    \endaltitem +    \beginaltitem {luaotfload-auxiliary.lua} +      access to internal functionality for package authors (proposals +      for additions welcome). +    \endaltitem +    \beginaltitem {luaotfload-letterspace.lua} +      font-based letterspacing. +    \endaltitem +\endfilelist + +\figurefloat +  {file-graph} +  {Schematic of the files in \identifier{Luaotfload}} +  {filegraph.pdf} + +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Auxiliary Functions} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +With release version 2.2, \identifier{luaotfload} received +additional functions for package authors to call from outside +(see the file \fileent{luaotfload-auxiliary.lua} for details). +% +The purpose of this addition twofold. +% +Firstly, \identifier{luaotfload} failed to provide a stable interface +to internals in the past which resulted in an unmanageable situation +of different packages abusing the raw access to font objects by means +of the \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. + +\beginsubsection {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}: + +\beginlisting +  \input luaotfload.sty +  \directlua{ +    local dumpfile    = "fontdump.lua" +    local dump_font   = function (tfmdata) +      local data = table.serialize(tfmdata) +      io.savedata(dumpfile, data) +    end + +    luatexbase.add_to_callback( +      "luaotfload.patch_font", +      dump_font, +      "my_private_callbacks.dump_font" +    ) +  } +  \font \dumpme = name:Iwona +  \bye +\endlisting + +\emphasis{Beware}: this creates a Lua file of around 150,000 lines of +code, taking up 3~\abbrev{mb} of disk space. +% +By inspecting the output you can get a first impression of how a font +is structured in \LUATEX’s memory, what elements it is composed of, +and in what ways it can be rearranged. + +\beginsubsubsection {Compatibility with Earlier Versions} + +As has been touched on in the preface to this section, the structure +of the object as returned by the fontloader underwent rather drastic +changes during different stages of its development, and not all +packages that made use of font patching have kept up with every one +of it. +% +To ensure compatibility with these as well as older versions of +some packages, \identifier{luaotfload} sets up copies of or references +to data in the font table where it used to be located. +% +For instance, important parameters like the requested point size, the +units factor, and the font name have again been made accessible from +the toplevel of the table even though they were migrated to different +subtables in the meantime. + +\endsubsubsection + +\beginsubsubsection{Patches} + +These are mostly concerned with establishing compatibility with \XETEX. + +\beginfunctionlist + +  \beginaltitem  {set_sscale_dimens} +    Calculate \texmacro{fontdimen}s 10 and 11 to emulate \XETEX. +  \endaltitem + +  \beginaltitem  {set_capheight} +    Calculates \texmacro{fontdimen} 8 like \XETEX. +  \endaltitem + +  \beginaltitem  {patch_cambria_domh} +    Correct some values of the font \emphasis{Cambria Math}. +  \endaltitem + +\endfunctionlist + +\endsubsection + +\beginsubsection {Package Author’s Interface} + +As \LUATEX release 1.0 is nearing, the demand for a reliable interface +for package authors increases. + +\endsubsubsection + +\beginsubsubsection{Font Properties} + +Below functions mostly concern querying the different components of a +font like for instance the glyphs it contains, or what font features +are defined for which scripts. + +\beginfunctionlist + +  \beginaltitem  {aux.font_has_glyph (id : int, index : int)} +            Predicate that returns true if the font \luafunction{id} +            has glyph \luafunction{index}. +  \endaltitem + +  \beginaltitem  {aux.slot_of_name(name : string)} +            Translates an Adobe Glyph name to the corresponding glyph +            slot. +  \endaltitem + +  \beginaltitem  {aux.name_of_slot(slot : int)} +            The inverse of \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}. +  \endaltitem + +  \beginaltitem  {aux.provides_script(id : int, script : string)} +            Test if a font supports \luafunction{script}. +  \endaltitem + +  \beginaltitem  {aux.provides_language(id : int, script : string, language : string)} +            Test if a font defines \luafunction{language} for a given +            \luafunction{script}. +  \endaltitem + +  \beginaltitem  {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}. +  \endaltitem + +  \beginaltitem  {aux.get_math_dimension(id : int, dimension : string)} +            Get the dimension \luafunction{dimension} of font \luafunction{id}. +  \endaltitem + +  \beginaltitem  {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. +  \endaltitem + +\endfunctionlist + +\endsubsubsection + +\beginsubsubsection{Database} + +%% not implemented, may come back later +\beginfunctionlist +%   \beginaltitem  {aux.scan_external_dir(dir : string)} +%             Include fonts in directory \luafunction{dir} in font lookups without +%             adding them to the database. +% +  \beginaltitem  {aux.read_font_index (void)} +            Read the index file from the appropriate location (usually +            the bytecode file \fileent{luaotfload-names.luc} somewhere +            in the \fileent{texmf-var} tree) and return the result as a +            table. The file is processed with each call so it is up to +            the user to store the result for later access. +  \endaltitem + +  \beginaltitem  {aux.font_index (void)} +            Return a reference of the font names table used internally +            by \identifier{luaotfload}. The index will be read if it +            has not been loaded up to this point. Also a font scan that +            overwrites the current index file might be triggered. Since +            the return value points to the actual index, any +            modifications to the table might influence runtime behavior +            of \identifier{luaotfload}. +  \endaltitem + +\endfunctionlist + +\endsubsubsection + +\endsubsection +\endsection + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\beginsection {Troubleshooting} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\beginsubsection {Database Generation} + +If you encounter problems with some fonts, please first update to the +latest version of this package before reporting a bug, as +\identifier{luaotfload} is under active development and still a moving +target. +% +The development takes place on \identifier{github} at +\hyperlink {https://github.com/lualatex/luaotfload} where there is an issue +tracker for submitting bug reports, feature requests and the likes. + +Bug reports are more likely to be addressed if they contain the output +of + +\beginlisting +    luaotfload-tool --diagnose=environment,files,permissions +\endlisting + +\noindent Consult the man page for a description of these options. + +Errors during database generation can be traced by increasing the +verbosity level and redirecting log output to \fileent{stdout}: + +\beginlisting +    luaotfload-tool -fuvvv --log=stdout +\endlisting + +\noindent or to a file in \fileent{/tmp}: + +\beginlisting +    luaotfload-tool -fuvvv --log=file +\endlisting + +\noindent In the latter case, invoke the \inlinecode {tail(1)} utility on the +file for live monitoring of the progress. + +If database generation fails, the font last printed to the terminal or +log file is likely to be the culprit. +% +Please specify it when reporting a bug, and blacklist it for the time +being (see above, page \pageref{font-blacklist}). + +\endsubsection + +\beginsubsection {Font Features} + +A common problem is the lack of features for some +\OpenType fonts even when specified. +% +This can be related to the fact that some fonts do not provide features +for the \inlinecode {dflt} script (see above on page \pageref{script-tag}), +which is the default one in this package. +% +If this happens, assigning a noth script when the font is defined should +fix it. +% +For example with \inlinecode {latn}: + +\beginlisting +    \font \test = file:MyFont.otf:script=latn;+liga; +\endlisting + +You can get a list of features that a font defines for scripts and +languages by querying it in \fileent{luaotfload-tool}: + +\beginlisting +    luaotfload-tool --find="Iwona" --inspect +\endlisting + +\endsubsection + +\beginsubsection {\LUATEX Programming} + +Another strategy that helps avoiding problems is to not access raw +\LUATEX internals directly. +% +Some of them, even though they are dangerous to access, have not been +overridden or disabled. +% +Thus, whenever possible prefer the functions in the \luafunction{aux} +namespace over direct manipulation of font objects. For example, raw +access to the \luafunction{font.fonts} table like: + +\beginlisting +    local somefont = font.fonts[2] +\endlisting + +\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: + +\beginlisting +    local unsafe_getfont = function (id) +        local tfmdata = font.getfont (id) +        if not tfmdata then +            tfmdata = font.fonts[id] +        end +        return tfmdata +    end + +    --- use like getfont() +    local somefont = unsafe_getfont (2) +\endlisting + +\endsubsection +\endsection + +\beginsection {License} + +\identifier {luaotfload} is licensed under the terms of the +\hyperlink [GNU General Public License version 2.0]% +           {https://www.gnu.org/licenses/old-licenses/gpl-2.0.html}. +Following the underlying fontloader code \identifier {luaotfload} +recognizes only that exact version as its license. +The „any later version” clause of the original license text as +copyrighted by the \hyperlink [Free Software Foundation]{http://www.fsf.org/} +\emphasis {does not apply} to either \identifier {luaotfload} or the +code imported from \CONTEXT. + +The complete text of the license is given as a separate file \fileent +{COPYING} in the toplevel directory of the +\hyperlink [\fileent {Luaotfload} Git repository]{https://github.com/lualatex/luaotfload/blob/master/COPYING}. +Distributions probably package it as \fileent +{doc/luatex/luaotfload/COPYING} in the relevant \fileent {texmf} tree. + +\endsection + +\endinput + diff --git a/doc/luaotfload-tool.rst b/doc/luaotfload-tool.rst new file mode 100644 index 0000000..4b1a934 --- /dev/null +++ b/doc/luaotfload-tool.rst @@ -0,0 +1,325 @@ +======================================================================= +                            luaotfload-tool +======================================================================= + +----------------------------------------------------------------------- +         generate and query the Luaotfload font names database +----------------------------------------------------------------------- + +:Date:                  2014-03-30 +:Copyright:             GPL v2.0 +:Version:               2.5 +:Manual section:        1 +:Manual group:          text processing + +SYNOPSIS +======================================================================= + +**luaotfload-tool** [ -bcDfFiIlLnpqRSuvVhw ] + +**luaotfload-tool** --update [ --force ] [ --quiet ] [ --verbose ] +                             [ --prefer-texmf ] [ --dry-run ] +                             [ --formats=[+|-]EXTENSIONS ] +                             [ --no-compress ] [ --no-strip ] +                             [ --local ] [ --max-fonts=N ] + +**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** --bisect=DIRECTIVE + +**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. +--local, -L             Include font files in ``$PWD``. This option +                        will cause large parts of the database to be +                        rebuilt. Thus it is quite inefficient. +                        Additionally, if local font files are found, +                        the database is prevented from being saved +                        to disk, so the local fonts need to be parsed +                        with every invocation of ``luaotfload-tool``. +--no-reload, -n         Suppress auto-updates to the database (e.g. +                        when ``--find`` is passed an unknown name). +--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. +--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. + +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. + +--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. + +debugging methods +----------------------------------------------------------------------- +--show-blacklist, -b    Show blacklisted files (not directories). +--dry-run, -D           Don’t load fonts when updating the database; +                        scan directories only. +                        (For debugging file system related issues.) +--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. +--max-fonts=N           Process at most *N* font files, including fonts +                        already indexed in the count. +--bisect=DIRECTIVE      Bisection of the font database. +                        This mode is intended as assistance in +                        debugging the Luatex engine, especially when +                        tracking memleaks or buggy fonts. + +                        *DIRECTIVE* can be one of the following: + +                        1) ``run`` -> Make ``luaotfload-tool`` respect +                           the bisection progress when running. +                           Combined with ``--update`` and possibly +                           ``--force`` this will only process the files +                           from the start up until the pivot and ignore +                           the rest. +                        2) ``start`` -> Start bisection: create a +                           bisection state file and initialize the low, +                           high, and pivot indices. +                        3) ``stop`` -> Terminate the current bisection +                           session by deleting the state file. +                        4) ``good`` | ``bad`` -> Mark the section +                           processed last as “good” or “bad”, +                           respectively. The next bisection step will +                           continue with the bad section. +                        5) ``status`` -> Print status information about +                           the current bisection session. Hint: Use +                           with higher verbosity settings for more +                           output. + +                        A bisection session is initiated by issuing the +                        ``start`` directive. This sets the pivot to the +                        middle of the list of available font files. +                        Now run *luaotfload-tool* with the ``--update`` +                        flag set as well as ``--bisect=run``: only the +                        fonts up to the pivot will be considered. If +                        that task exhibited the issue you are tracking, +                        then tell Luaotfload using ``--bisect=bad``. +                        The next step of ``--bisect=run`` will continue +                        bisection with the part of the files below the +                        pivot. +                        Likewise, issue ``--bisect=good`` in order to +                        continue with the fonts above the pivot, +                        assuming the tested part of the list did not +                        trigger the bug. + +                        Once the culprit font is tracked down, ``good`` +                        or ``bad`` will have no effect anymore. ``run`` +                        will always end up processing the single font +                        file that was left. +                        Use ``--bisect=stop`` to clear the bisection +                        state. + +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.conf.example b/doc/luaotfload.conf.example new file mode 100644 index 0000000..2756d62 --- /dev/null +++ b/doc/luaotfload.conf.example @@ -0,0 +1,30 @@ +;; Example configuration file for Luaotfload. This file contains the +;; defaults only, see luaotfload.conf(5) for more information. + +[db] +    compress        = true +    formats         = otf, ttf, ttc, dfont +    max-fonts       = 2.2517998136852e15 +    scan-local      = false +    skip-read       = false +    strip           = true +    update-live     = true + +[misc] +    statistics      = false +    termwidth       = nil + +[paths] +    cache-dir       = fonts +    names-dir       = names +    index-file      = luaotfload-names.lua +    lookups-file    = luaotfload-lookup-cache.lua + +[run] +    color-callback  = pre_linebreak_filter +    definer         = patch +    log-level       = 0 +    resolver        = cached + +;; vim:ft=dosini:et:sw=4:ts=8 + diff --git a/doc/luaotfload.conf.rst b/doc/luaotfload.conf.rst new file mode 100644 index 0000000..774095b --- /dev/null +++ b/doc/luaotfload.conf.rst @@ -0,0 +1,347 @@ +======================================================================= +                            luaotfload.conf +======================================================================= + +----------------------------------------------------------------------- +                     Luaotfload configuration file +----------------------------------------------------------------------- + +:Date:                  2014-06-09 +:Copyright:             GPL v2.0 +:Version:               2.5 +:Manual section:        5 +:Manual group:          text processing + +SYNOPSIS +======================================================================= + +- **./luaotfload{.conf,rc}** +- **XDG_CONFIG_HOME/luaotfload/luaotfload{.conf,rc}** +- **~/.luaotfloadrc** + +DESCRIPTION +======================================================================= + +The file ``luaotfload.conf`` contains configuration options for +*Luaotfload*, a font loading and font management component for LuaTeX. + + +EXAMPLE +======================================================================= + +A small Luaotfload configuration file with few customizations could +look as follows: :: + +    [db] +        formats = afm, pfa, pfb +        compress = false +     +    [misc] +        termwidth = 60 +     +    [run] +        log-level = 6 + +This will make Luaotfload ignore all font files except for PostScript +formats. NB: With a default Tex Live install the PS fonts will take +much longer to index than OpenType or TrueType ones. Also, an +uncompressed index file will be dumped which is going to be much larger +due to the huge amount of PostScript fonts indexed. The terminal width +is truncated to 60 characters which influences the verbose output +during indexing. Finally, the verbosity is increased greatly: each font +file being processed will be printed to the stdout on a separate line, +along with lots of other information. + +To observe the difference in behavior, save above snippet to +``./luaotfload.conf`` and update the font index: :: + +    luaotfload --update --force + + +SYNTAX +======================================================================= + +The configuration file syntax follows the common INI format. For a more +detailed description please refer to the section “CONFIGURATION FILE” +of **git-config**\(1). A brief list of rules is given below: + +  * Blank lines and lines starting with a semicolon (``;``) are ignored. + +  * A configuration file is partitioned into sections that are declared +    by specifying the section title in brackets on a separate line: :: + +        [some-section] +        ... section content ... + +  * Sections consist of one or more variable assignments of the form +    ``variable-name = value``  E. g.:: + +        [foo] +            bar = baz +            quux = xyzzy +            ... + +  * Section and variable names may contain only uppercase and lowercase +    letters as well as dashes (``-``). + + +VARIABLES +======================================================================= + +Variables in belong into a configuration section and their values must +be of a certain type. Some of them have further constraints. For +example, the “color callback” must be a string of one of the values +``pre_linebreak_filter`` or ``pre_output_filter``, defined in the +section *run*. + +Currently, the configuration is organized into four sections: + +db +    Options relating to the font index. + +misc +    Options without a clearly defined category. + +paths +    Path and file name settings. + +run +    Options controlling runtime behavior of Luaotfload. + +The list of valid variables, the sections they are part of and their +type is given below. Types represent Lua types that the values must be +convertible to; they are abbreviated as follows: ``s`` for the *string* +type, ``n`` for *number*, ``b`` for *boolean*. A value of ``nil`` means +the variable is unset. + + +Section ``db`` +----------------------------------------------------------------------- + ++---------------+--------+---------------------------+ +|  variable     |  type  |  default                  | ++---------------+--------+---------------------------+ +|  compress     |   b    |  ``true``                 | ++---------------+--------+---------------------------+ +|  formats      |   s    |  ``"otf,ttf,ttc,dfont"``  | ++---------------+--------+---------------------------+ +|  max-fonts    |   n    |  ``2^51``                 | ++---------------+--------+---------------------------+ +|  scan-local   |   b    |  ``false``                | ++---------------+--------+---------------------------+ +|  skip-read    |   b    |  ``false``                | ++---------------+--------+---------------------------+ +|  strip        |   b    |  ``true``                 | ++---------------+--------+---------------------------+ +|  update-live  |   b    |  ``true``                 | ++---------------+--------+---------------------------+ + +The flag ``compress`` determines whether the font index (usually +``luaotfload-names.lua[.gz]`` will be stored in compressed forms. +If unset it is equivalent of passing ``--no-compress`` to +**luaotfload-tool**. Since the file is only created for convenience +and has no effect on the runtime behavior of Luaotfload, the flag +should remain set. Most editors come with zlib support anyways. + +The list of ``formats`` must be a comma separated sequence of strings +containing one or more of these elements: + +* ``otf``               (OpenType format), +* ``ttf`` and ``ttc``   (TrueType format), +* ``dfont``             (Macintosh TrueType format), +* ``afm``               (Adobe Font Metrics), +* ``pfb`` and ``pfa``   (PostScript format). + +It corresponds loosely to the ``--formats`` option to +**luaotfload-tool**. Invalid or duplicate members are ignored; if the +list does not contain any useful identifiers, the default list +``"otf,ttf,ttc,dfont"`` will be used. + +The variable ``max-fonts`` determines after processing how many font +files the font scanner will terminate the search. This is useful for +debugging issues with the font index and has the same effect as the +option ``--max-fonts`` to **luaotfload-tools**. + +The ``scan-local`` flag, if set, will incorporate the current working +directory as a font search location. NB: This will potentially slow +down document processing because a font index with local fonts will not +be saved to disk, so these fonts will have to be re-indexed whenever +the document is built. + +The ``skip-read`` flag is only useful for debugging: It makes +Luaotfload skip reading fonts. The font information for rebuilding the +index is taken from the presently existing one. + +Unsetting the ``strip`` flag prevents Luaotfload from removing data +from the index that is only useful when processing font files. NB: this +can increase the size of the index files significantly and has no +effect on the runtime behavior. + +If ``update-live`` is set, Luaotfload will reload the database if it +cannot find a requested font. Those who prefer to update manually using +**luaotfload-tool** should unset this flag. + + +Section ``default-features`` +----------------------------------------------------------------------- + +By default Luaotfload enables ``node`` mode and picks the default font +features that are prescribed in the OpenType standard. This behavior +may be overridden in the ``default-features`` section. Global defaults +that will be applied for all scripts can be set via the ``global`` +option, others by the script they are to be applied to. For example, +a setting of :: + +  [default-features] +      global = mode=base,color=0000FF +      dflt   = smcp,onum + +would force *base* mode, tint all fonts blue and activate small +capitals and text figures globally. Features are specified as a comma +separated list of variables or variable-value pairs. Variables without +an explicit value are set to ``true``. + + +Section ``misc`` +----------------------------------------------------------------------- + ++---------------+--------+-------------------------+ +|  variable     |  type  |  default                | ++---------------+--------+-------------------------+ +|  statistics   |   b    |  ``false``              | ++---------------+--------+-------------------------+ +|  termwidth    |   n    |  ``nil``                | ++---------------+--------+-------------------------+ +|  version      |   s    |  <Luaotfload version>   | ++---------------+--------+-------------------------+ + +With ``statistics`` enabled, extra statistics will be collected during +index creation and appended to the index file. It may then be queried +at the Lua end or inspected by reading the file itself. + +The value of ``termwidth``, if set, overrides the value retrieved by +querying the properties of the terminal in which Luatex runs. This is +useful if the engine runs with ``shell_escape`` disabled and the actual +terminal dimensions cannot be retrieved. + +The value of ``version`` is derived from the version string hard-coded +in the Luaotfload source. Override at your own risk. + + +Section ``paths`` +----------------------------------------------------------------------- + ++------------------+--------+------------------------------------+ +|  variable        |  type  |  default                           | ++------------------+--------+------------------------------------+ +|  cache-dir       |   s    |  ``"fonts"``                       | ++------------------+--------+------------------------------------+ +|  names-dir       |   s    |  ``"names"``                       | ++------------------+--------+------------------------------------+ +|  index-file      |   s    |  ``"luaotfload-names.lua"``        | ++------------------+--------+------------------------------------+ +|  lookups-file    |   s    |  ``"luaotfload-lookup-cache.lua"`` | ++------------------+--------+------------------------------------+ + +The paths ``cache-dir`` and ``names-dir`` determine the subdirectory +inside the Luaotfload subtree of the ``luatex-cache`` directory where +the font cache and the font index will be stored, respectively. + +Inside the index directory, the names of the index file and the font +lookup cache will be derived from the respective values of +``index-file`` and ``lookups-file``. This is the filename base for the +bytecode compiled version as well as -- for the index -- the gzipped +version. + + +Section ``run`` +----------------------------------------------------------------------- + ++------------------+--------+------------------------------+ +|  variable        |  type  |  default                     | ++------------------+--------+------------------------------+ +|  color-callback  |   s    |  ``"pre_linebreak_filter"``  | ++------------------+--------+------------------------------+ +|  definer         |   s    |  ``"patch"``                 | ++------------------+--------+------------------------------+ +|  log-level       |   n    |  ``0``                       | ++------------------+--------+------------------------------+ +|  resolver        |   s    |  ``"cached"``                | ++------------------+--------+------------------------------+ + +The ``color-callback`` option determines the stage at which fonts that +defined with a ``color=xxyyzz`` feature will be colorized. By default +this happens in a ``pre_linebreak_filter`` but alternatively the +``pre_output_filter`` may be chosen, which is faster but might produce +inconsistent output. The latter also was the default in the 1.x series +of Luaotfload. + +The ``definer`` allows for switching the ``define_font`` callback. +Apart from the default ``patch`` one may also choose the ``generic`` +one that comes with the vanilla fontloader. Beware that this might +break tools like Fontspect that rely on the ``patch_font`` callback +provided by Luaotfload to perform important corrections on font data. + +The value of ``log-level`` sets the default verbosity of messages +printed by Luaotfload. Only messages defined with a verbosity of less +than or equal to the supplied value will be output on the terminal. +At a log level of five Luaotfload can be very noisy. Also, printing too +many messages will slow down the interpreter due to line buffering +being disabled (see **setbuf**\(3)). + +The ``resolver`` setting allows choosing the font name resolution +function: With the default value ``cached`` Luaotfload saves the result +of a successful font name request to a cache file to speed up +subsequent lookups. The alternative, ``normal`` circumvents the cache +and resolves every request individually. (Since to the restructuring of +the font name index in Luaotfload 2.4 the performance difference +between the cached and uncached lookups should be marginal.) + + +FILES +======================================================================= + +Luaotfload only processes the first configuration file it encounters at +one of the search locations. The file name may be either +``luaotfload.conf`` or ``luaotfloadrc``, except for the dotfile in the +user’s home directory which is expected at ``~/.luaotfloadrc``. + +Configuration files are located following a series of steps. The search +terminates as soon as a suitable file is encountered. The sequence of +locations that Luaotfload looks at is + +i.    The current working directory of the LuaTeX process. +ii.   The subdirectory ``luaotfload/`` inside the XDG configuration +      tree, e. g. ``/home/oenothea/config/luaotfload/``. +iii.  The dotfile. +iv.   The *TEXMF* (using kpathsea). + + +SEE ALSO +======================================================================= + +**luaotfload-tool**\(1), **luatex**\(1), **lua**\(1) + +* ``texdoc luaotfload`` to display the PDF 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/>`_ +* Luaotfload on CTAN     `<http://ctan.org/pkg/luaotfload>`_ + + +REFERENCES +======================================================================= + +* The XDG base specification +  `<http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html>`_. + +AUTHORS +======================================================================= + +*Luaotfload* is maintained by the LuaLaTeX dev team +(`<https://github.com/lualatex/>`_). + +This manual page was written by Philipp Gesang +<philipp.gesang@alumni.uni-heidelberg.de>. +  | 
