% \iffalse meta-comment % % Copyright (C) 2009-2013 % by Elie Roux % and Khaled Hosny % and Philipp Gesang % % Home: https://github.com/lualatex/luaotfload % Support: . % % This work is under the GPL v2.0 license. % % This work consists of the main source file luaotfload.dtx % and the derived files % luaotfload.sty, luaotfload.lua % % Unpacking: % tex luaotfload.dtx % % Documentation: % lualatex luaotfload.dtx % % The class ltxdoc loads the configuration file ltxdoc.cfg % if available. Here you can specify further options, e.g. % use A4 as paper format: % \PassOptionsToClass{a4paper}{article} % % % %<*ignore> \begingroup \def\x{LaTeX2e}% \expandafter\endgroup \ifcase 0\ifx\install y1\fi\expandafter \ifx\csname processbatchFile\endcsname\relax\else1\fi \ifx\fmtname\x\else 1\fi\relax \else\csname fi\endcsname % %<*install> \input docstrip.tex \Msg{************************************************************************} \Msg{* Installation} \Msg{* Package: luaotfload v2.4 OpenType layout system} \Msg{************************************************************************} \keepsilent \askforoverwritefalse \let\MetaPrefix\relax \preamble This is a generated file. Copyright (C) 2009-2013 by Elie Roux and Khaled Hosny and Philipp Gesang Home: https://github.com/lualatex/luaotfload Support: . This work is under the GPL v2.0 license. This work consists of the main source file luaotfload.dtx and the derived files luaotfload.sty, luaotfload.lua \endpreamble \let\MetaPrefix\DoubleperCent \generate{% \usedir{tex/luatex/luaotfload}% \file{luaotfload.sty}{\from{luaotfload.dtx}{package}}% } % The following hacks are to generate a lua file with lua comments starting with % -- instead of %% \def\MetaPrefix{-- } \def\luapostamble{% \MetaPrefix^^J% \MetaPrefix\space End of File `\outFileName'.% } \def\currentpostamble{\luapostamble}% \generate{% \usedir{tex/luatex/luaotfload}% \file{luaotfload.lua}{\from{luaotfload.dtx}{lua}}%% } \obeyspaces \Msg{************************************************************************} \Msg{*} \Msg{* To finish the installation you have to move the following} \Msg{* files into a directory searched by TeX:} \Msg{*} \Msg{* luaotfload.sty, luaotfload.lua} \Msg{*} \Msg{* Happy TeXing!} \Msg{*} \Msg{************************************************************************} \endbatchfile % %<*ignore> \fi % %<*driver> \NeedsTeXFormat{LaTeX2e} \ProvidesFile{luaotfload.drv}% [2013/07/28 v2.4 OpenType layout system]% \documentclass{ltxdoc} \usepackage{metalogo,multicol,mdwlist,fancyvrb,xspace} \usepackage[x11names]{xcolor} % \def\primarycolor{DodgerBlue4} %%-> rgb 16 78 139 | #104e8b \def\secondarycolor{Goldenrod4} %%-> rgb 139 105 200 | #8b6914 % \usepackage[ bookmarks=true, colorlinks=true, linkcolor=\primarycolor, urlcolor=\secondarycolor, citecolor=\primarycolor, pdftitle={The luaotfload package}, pdfsubject={OpenType layout system for Plain TeX and LaTeX}, pdfauthor={Elie Roux & Khaled Hosny & Philipp Gesang}, pdfkeywords={luatex, lualatex, unicode, opentype} ]{hyperref} \usepackage{fontspec} \usepackage{unicode-math} \setmainfont[ % Numbers = OldStyle, %% buggy with font cache Ligatures = TeX, BoldFont = {Linux Libertine O Bold}, ItalicFont = {Linux Libertine O Italic}, SlantedFont = {Linux Libertine O Italic}, ]{Linux Libertine O} \setmonofont[Ligatures=TeX,Scale=MatchLowercase]{Liberation Mono} %setsansfont[Ligatures=TeX]{Linux Biolinum O} \setsansfont[Ligatures=TeX,Scale=MatchLowercase]{Iwona Medium} %setmathfont{XITS Math} \usepackage{hologo} \newcommand\TEX {\TeX\xspace} \newcommand\LUA {Lua\xspace} \newcommand\PDFTEX {pdf\TeX\xspace} \newcommand\LUATEX {Lua\TeX\xspace} \newcommand\XETEX {\XeTeX\xspace} \newcommand\LATEX {\LaTeX\xspace} \newcommand\LUALATEX {Lua\LaTeX\xspace} \newcommand\CONTEXT {Con\TeX t\xspace} \newcommand\OpenType {\identifier{Open\kern-.25ex Type}\xspace} \def\definehighlight[#1][#2]% {\ifcsname #1\endcsname\else \expandafter\def\csname #1\endcsname% {\bgroup#2\csname #1_indeed\endcsname} \expandafter\def\csname #1_indeed\endcsname##1% {##1\egroup}% \fi} \def\restoreunderscore{\catcode`\_=12\relax} \definehighlight [fileent][\ttfamily\restoreunderscore] %% files, dirs \definehighlight [texmacro][\sffamily\itshape\textbackslash] %% cs \definehighlight[luafunction][\sffamily\itshape\restoreunderscore] %% lua identifiers \definehighlight [identifier][\sffamily] %% names \definehighlight [abbrev][\rmfamily\scshape] %% acronyms \definehighlight [emphasis][\rmfamily\slshape] %% level 1 emph \newcommand*\email[1]{\href{mailto:#1}{#1}} \renewcommand\partname{Part}%% gets rid of the stupid “file” heading \usepackage{syntax}%% bnf for font request syntax \usepackage{titlesec} \def\movecountertomargin#1{\llap{\rmfamily\upshape#1\hskip2em}} \def\zeropoint{0pt} \titleformat \part {\normalsize\rmfamily\bfseries} {\movecountertomargin\thepart} \zeropoint {} \titleformat \section {\normalsize\rmfamily\scshape} {\movecountertomargin\thesection} \zeropoint {} \titleformat \subsection {\small\rmfamily\itshape} {\movecountertomargin\thesubsection} \zeropoint {} \titleformat \subsubsection {\normalsize\rmfamily\upshape} {\movecountertomargin\thesubsubsection} \zeropoint {} \usepackage{tocloft} \renewcommand \cftpartfont {\rmfamily\upshape} \renewcommand \cftsecfont {\rmfamily\upshape} \renewcommand \cftsubsecfont {\rmfamily\upshape} \setlength \cftbeforepartskip {1ex} \setlength \cftbeforesecskip {1ex} \VerbatimFootnotes \begin{document} \DocInput{luaotfload.dtx}% \end{document} % % \fi % % \CheckSum{0} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \GetFileInfo{luaotfload.drv} % % \title{The \identifier{luaotfload} package} % \date{2013/07/28 v2.4} % \author{Elie Roux · Khaled Hosny · Philipp Gesang\\ % Home: \url{https://github.com/lualatex/luaotfload}\\ % Support: \email{lualatex-dev@tug.org}} % % \maketitle % % \begin{abstract} % This package is an adaptation of the \CONTEXT font loading system. % It allows for loading \OpenType fonts with an extended syntax and adds % support for a variety of font features. % \end{abstract} % % \tableofcontents % % \part{Package Description} % % \section{Introduction} % % Font management and installation has always been painful with \TEX. A lot of % files are needed for one font (\abbrev{tfm}, \abbrev{pfb}, \abbrev{map}, % \abbrev{fd}, \abbrev{vf}), and due to the 8-Bit encoding each font is limited % to 256 characters. % But the font world has evolved since the original % \TEX, and new typographic systems have appeared, most notably the so % called \emphasis{smart font} technologies like \OpenType % fonts (\abbrev{otf}). % These fonts can contain many more characters than \TEX fonts, as well as additional % functionality like ligatures, old-style numbers, small capitals, % etc., and support more complex writing systems like Arabic and % Indic\footnote{% % Unfortunately, \identifier{luaotfload} doesn‘t support many Indic % scripts right now. % Assistance in implementing the prerequisites is greatly % appreciated. % } % scripts. % \OpenType fonts are widely deployed and available for all % modern operating systems. % As of 2013 they have become the de facto standard for advanced text % layout. % However, until recently the only way to use them directly in the \TEX % world was with the \XETEX engine. % % Unlike \XETEX, \LUATEX has no built-in support for % \OpenType or technologies other than the original \TEX fonts. % Instead, it provides hooks for executing \LUA code during the \TEX run % that allow implementing extensions for loading fonts and manipulating % how input text is processed without modifying the underlying engine. % This is where \identifier{luaotfload} comes into play: % Based on code from \CONTEXT, it extends \LUATEX with functionality necessary % for handling \OpenType fonts. % Additionally, it provides means for accessing fonts known to the operating % system conveniently by indexing the metadata. % % % \section{Thanks} % % \identifier{Luaotfload} is part of \LUALATEX, the community-driven % project to provide a foundation for using the \LATEX format with the % full capabilites of the \LUATEX engine. % As such, the distinction between end users, contributors, and project % maintainers is intentionally kept less strict, lest we unduly % personalize the common effort. % % Nevertheless, the current maintainers would like to express their % gratitude to Khaled Hosny, Akira Kakuto, Hironori Kitagawa and Dohyun % Kim. % Their contributions -- be it patches, advice, or systematic % testing -- made the switch from version 1.x to 2.2 possible. % Also, Hans Hagen, the author of the font loader, made porting the % code to \LATEX a breeze due to the extra effort he invested into % isolating it from the rest of \CONTEXT, not to mention his assistance % in the task and willingness to respond to our suggestions. % % % \section{Loading Fonts} % % \identifier{luaotfload} supports an extended font request syntax: % % \begin{quote} % |\font\foo={|% % \meta{prefix}|:|% % \meta{font name}|:|% % \meta{font features}|}|% % \meta{\TEX font features} % \end{quote} % % \noindent % The curly brackets are optional and escape the spaces in the enclosed % font name. % Alternatively, double quotes serve the same purpose. % A selection of individual parts of the syntax are discussed below; % for a more formal description see figure \ref{font-syntax}. % % \begin{figure}[b] % \setlength\grammarparsep{12pt plus 2pt minus 2pt} % \setlength\grammarindent{5cm} % \begingroup % \small % \begin{grammar} % ::= `\\font', {\sc csname}, `=', , [ ] ; % % ::= `at', {\sc dimension} ; % % ::= `"', `"' % \alt `{', `}' % \alt ; % % ::= , [`:', ] % \alt `[', `]', [ [`:'], ] ; % % ::= , [ ], \{ \} % \alt , \{ \} ; % % ::= `file:', % \alt `name:', ; % % ::= \{ \} ; % % ::= \{ \} ; % % ::= {\sc tfmname} | ; % % ::= \{ {\sc all_characters} - `]' \} ; % % ::= `/', (`I' | `B' | `BI' | `IB' | `S=', \{ {\sc digit} \} ) ; % % ::= `(', \{ {\sc digit} \}, `)' ; % % ::= , \{ `;', \} ; % % ::= {\sc feature_id}, `=', {\sc feature_value} % \alt , {\sc feature_id} ; % % ::= `+' | `-' ; % % ::= {\sc all_characters} - ( `(' | `/' | `:' ) ; % \end{grammar} % \endgroup % \caption{Font request syntax. % Braces or double quotes around the % \emphasis{specification} rule will % preserve whitespace in file names. % In addition to the font style modifiers % (\emphasis{slash-notation}) given above, there % are others that are recognized but will be silently % ignored: {\ttfamily aat}, % {\ttfamily icu}, and % {\ttfamily gr}. % The special terminals are: % {\sc feature\textunderscore id} for a valid font % feature name and % {\sc feature\textunderscore value} for the corresponding % value. % {\sc tfmname} is the name of a \abbrev{tfm} file. % {\sc digit} again refers to bytes 48--57, and % {\sc all\textunderscore characters} to all byte values. % {\sc csname} and {\sc dimension} are the \TEX concepts.} % \label{font-syntax} % \end{figure} % % \subsection{Prefix -- the \identifier{luaotfload}{ }Way} % % In \identifier{luaotfload}, the canonical syntax for font requests % requires a \emphasis{prefix}: % \begin{quote} % |\font\fontname=|\meta{prefix}|:|\meta{fontname}\dots % \end{quote} % where \meta{prefix} is either \verb|file:| or \verb|name:|.\footnote{% % The development version also knows two further prefixes, % \verb|kpse:| and \verb|my:|. % A \verb|kpse| lookup is restricted to files that can be found by % \identifier{kpathsea} and % will not attempt to locate system fonts. % This behavior can be of value when an extra degree of encapsulation is % needed, for instance when supplying a customized tex distribution. % % The \verb|my| lookup takes this a step further: it lets you define % a custom resolver function and hook it into the \luafunction{resolve_font} % callback. % This ensures full control over how a file is located. % For a working example see the % \href{https://bitbucket.org/phg/lua-la-tex-tests/src/5f6a535d/pln-lookup-callback-1.tex} % {test repo}. % } % It determines whether the font loader should interpret the request as % a \emphasis{file name} or % \emphasis{font name}, respectively, % which again influences how it will attempt to locate the font. % Examples for font names are % “Latin Modern Italic”, % “GFS Bodoni Rg”, and % “PT Serif Caption” % -- they are the human readable identifiers % usually listed in drop-down menus and the like.\footnote{% % Font names may appear like a great choice at first because they % offer seemingly more intuitive identifiers in comparison to arguably % cryptic file names: % “PT Sans Bold” is a lot more descriptive than \fileent{PTS75F.ttf}. % On the other hand, font names are quite arbitrary and there is no % universal method to determine their meaning. % While \identifier{luaotfload} provides fairly sophisticated heuristic % to figure out a matching font style, weight, and optical size, it % cannot be relied upon to work satisfactorily for all font files. % For an in-depth analysis of the situation and how broken font names % are, please refer to % \href{http://www.ntg.nl/pipermail/ntg-context/2013/073889.html} % {this post} % by Hans Hagen, the author of the font loader. % If in doubt, use filenames. % \fileent{luaotfload-tool} can perform the matching for you with the % option \verb|--find=|, and you can use the file name it returns % in your font definition. % } % In order for fonts installed both in system locations and in your % \fileent{texmf} to be accessible by font name, \identifier{luaotfload} must % first collect the metadata included in the files. % Please refer to section~\ref{sec:fontdb} below for instructions on how to % create the database. % % File names are whatever your file system allows them to be, except % that that they may not contain the characters % \verb|(|, % \verb|:|, and % \verb|/|. % As is obvious from the last exception, the \verb|file:| lookup will % not process paths to the font location -- only those % files found when generating the database are addressable this way. % Continue below in the \XETEX section if you need to load your fonts % by path. % The file names corresponding to the example font names above are % \fileent{lmroman12-italic.otf}, % \fileent{GFSBodoni.otf}, and % \fileent{PTZ56F.ttf}. % % \subsection{Compatibility Layer} % % In addition to the regular prefixed requests, \identifier{luaotfload} % accepts loading fonts the \XETEX way. % There are again two modes: bracketed and unbracketed. % A bracketed request looks as follows. % % \begin{quote} % |\font\fontname=[|\meta{path to file}|]| % \end{quote} % % \noindent % Inside the square brackets, every character except for a closing % bracket is permitted, allowing for specifying paths to a font file. % Naturally, path-less file names are equally valid and processed the % same way as an ordinary \verb|file:| lookup. % % \begin{quote} % |\font\fontname=|\meta{font name} \dots % \end{quote} % % Unbracketed (or, for lack of a better word: \emphasis{anonymous}) % font requests resemble the conventional \TEX syntax. % However, they have a broader spectrum of possible interpretations: % before anything else, \identifier{luaotfload} attempts to load a % traditional \TEX Font Metric (\abbrev{tfm} or \abbrev{ofm}). % If this fails, it performs a \verb|name:| lookup, which itself will % fall back to a \verb|file:| lookup if no database entry matches % \meta{font name}. % % Furthermore, \identifier{luaotfload} supports the slashed (shorthand) % font style notation from \XETEX. % % \begin{quote} % |\font\fontname=|\meta{font name}|/|\meta{modifier}\dots % \end{quote} % % \noindent % Currently, four style modifiers are supported: % \verb|I| for italic shape, % \verb|B| for bold weight, % \verb|BI| or \verb|IB| for the combination of both. % Other “slashed” modifiers are too specific to the \XETEX engine and % have no meaning in \LUATEX. % % \subsection{Examples} % % \subsubsection{Loading by File Name} % % For example, conventional \abbrev{type1} font can be loaded with a \verb|file:| % request like so: % % \begin{quote} % \begin{verbatim} % \font\lmromanten={file:ec-lmr10} at 10pt % \end{verbatim} % \end{quote} % % The \OpenType version of Janusz Nowacki’s font \emphasis{Antykwa % Półtawskiego}\footnote{% % \url{http://jmn.pl/antykwa-poltawskiego/}, also available in % in \TEX Live. % } % in its condensed variant can be loaded as follows: % % \begin{quote} % \begin{verbatim} % \font\apcregular=file:antpoltltcond-regular.otf at 42pt % \end{verbatim} % \end{quote} % % The next example shows how to load the \emphasis{Porson} font digitized by % the Greek Font Society using \XETEX-style syntax and an absolute path from a % non-standard directory: % % \begin{quote} % \begin{verbatim} % \font\gfsporson="[/tmp/GFSPorson.otf]" at 12pt % \end{verbatim} % \end{quote} % % \subsubsection{Loading by Font Name} % % The \verb|name:| lookup does not depend on cryptic filenames: % % \begin{quote} % \begin{verbatim} % \font\pagellaregular={name:TeX Gyre Pagella} at 9pt % \end{verbatim} % \end{quote} % % A bit more specific but essentially the same lookup would be: % % \begin{quote} % \begin{verbatim} % \font\pagellaregular={name:TeX Gyre Pagella Regular} at 9pt % \end{verbatim} % \end{quote} % % \noindent % Which fits nicely with the whole set: % % \begin{quote} % \begin{verbatim} % \font\pagellaregular ={name:TeX Gyre Pagella Regular} at 9pt % \font\pagellaitalic ={name:TeX Gyre Pagella Italic} at 9pt % \font\pagellabold ={name:TeX Gyre Pagella Bold} at 9pt % \font\pagellabolditalic={name:TeX Gyre Pagella Bolditalic} at 9pt % % {\pagellaregular foo bar baz\endgraf} % {\pagellaitalic foo bar baz\endgraf} % {\pagellabold foo bar baz\endgraf} % {\pagellabolditalic foo bar baz\endgraf} % % ... % \end{verbatim} % \end{quote} % % \subsubsection{Modifiers} % % If the entire \emphasis{Iwona} family\footnote{% % \url{http://jmn.pl/kurier-i-iwona/}, % also in \TEX Live. % } % is installed in some location accessible by \identifier{luaotfload}, % the regular shape can be loaded as follows: % % \begin{quote} % \begin{verbatim} % \font\iwona=Iwona at 20pt % \end{verbatim} % \end{quote} % % \noindent % To load the most common of the other styles, the slash notation can % be employed as shorthand: % % \begin{quote} % \begin{verbatim} % \font\iwonaitalic =Iwona/I at 20pt % \font\iwonabold =Iwona/B at 20pt % \font\iwonabolditalic=Iwona/BI at 20pt % \end{verbatim} % \end{quote} % % \noindent % which is equivalent to these full names: % % \begin{quote} % \begin{verbatim} % \font\iwonaitalic ="Iwona Italic" at 20pt % \font\iwonabold ="Iwona Bold" at 20pt % \font\iwonabolditalic="Iwona BoldItalic" at 20pt % \end{verbatim} % \end{quote} % % \section{Font features} % % \emphasis{Font features} are the second to last component in the % general scheme for font requests: % % \begin{quote} % |\font\foo={|% % \meta{prefix}|:|% % \meta{font name}|:|% % \meta{font features}|}|% % \meta{\TEX font features} % \end{quote} % % \noindent % If style modifiers are present (\XETEX style), they must precede % \meta{font features}. % % The element \meta{font features} is a semicolon-separated list of feature % tags\footnote{% % Cf. \url{http://www.microsoft.com/typography/otspec/featurelist.htm}. % } % and font options. % Prepending a font feature with a |+| (plus sign) enables it, whereas % a |-| (minus) disables it. For instance, the request % % \begin{quote} % \begin{verbatim} % \font\test=LatinModernRoman:+clig;-kern % \end{verbatim} % \end{quote} % % \noindent activates contextual ligatures (|clig|) and disables % kerning (|kern|). % Alternatively the options |true| or |false| can be passed to % the feature in a key/value expression. % The following request has the same meaning as the last one: % % \begin{quote} % \begin{verbatim} % \font\test=LatinModernRoman:clig=true;kern=false % \end{verbatim} % \end{quote} % % \noindent % Furthermore, this second syntax is required should a font feature % accept other options besides a true/false switch. % For example, \emphasis{stylistic alternates} (|salt|) are variants of given % glyphs. % They can be selected either explicitly by supplying the variant % index (starting from one), or randomly by setting the value to, % obviously, |random|. % % \iffalse TODO verify that this actually works with a font that supports % the salt/random feature!\fi % \begin{quote} % \begin{verbatim} % \font\librmsaltfirst=LatinModernRoman:salt=1 % \end{verbatim} % \end{quote} % % \noindent Other font options include: % % \begin{description} % % \item [mode] \hfill \\ % \identifier{luaotfload} has two \OpenType processing % \emphasis{modes}: % \identifier{base} and \identifier{node}. % % \identifier{base} mode works by mapping \OpenType % features to traditional \TEX ligature and kerning mechanisms. % Supporting only non-contextual substitutions and kerning % pairs, it is the slightly faster, albeit somewhat limited, variant. % \identifier{node} mode works by processing \TeX’s internal % node list directly at the \LUA end and supports % a wider range of \OpenType features. % The downside is that the intricate operations required for % \identifier{node} mode may slow down typesetting especially % with complex fonts and it does not work in math mode. % % By default \identifier{luaotfload} is in \identifier{node} % mode, and \identifier{base} mode has to be requested where needed, % e.~g. for math fonts. % % \item [script] \label{script-tag} \hfill \\ % An \OpenType script tag;\footnote{% % See \url{http://www.microsoft.com/typography/otspec/scripttags.htm} % for a list of valid values. % For scripts derived from the Latin alphabet the value % |latn| is good choice. % } % the default value is |dlft|. % Some fonts, including very popular ones by foundries like Adobe, % do not assign features to the |dflt| script, in % which case the script needs to be set explicitly. % % \item [language] \hfill \\ % An \OpenType language system identifier,\footnote{% % Cf. \url{http://www.microsoft.com/typography/otspec/languagetags.htm}. % } % defaulting to |dflt|. % % \item [featurefile] \hfill \\ % A comma-separated list of feature files to be applied to the % font. % Feature files contain a textual representation of % \OpenType tables and extend the features of a font % on fly. % After they are applied to a font, features defined in a % feature file can be enabled or disabled just like any % other font feature. % The syntax is documented in \identifier{Adobe}’s % \OpenType Feature File Specification.\footnote{% % Cf. \url{http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html}. % } % % For a demonstration of how to set a |tkrn| feature consult % the file |tkrn.fea| that is part of \identifier{luaotfload}. % It can be read and applied as follows: % % |\font\test=Latin Modern Roman:featurefile=tkrn.fea;+tkrn| % % \item [color] \hfill \\ % A font color, defined as a triplet of two-digit hexadecimal % \abbrev{rgb} values, with an optional fourth value for % transparency % (where |00| is completely transparent and |FF| is opaque). % % For example, in order to set text in semitransparent red: % % \begin{quote} % \begin{verbatim} % \font\test={Latin Modern Roman}:color=FF0000BB % \end{verbatim} % \end{quote} % % \item [protrusion \& expansion] \hfill \\ % These keys control microtypographic features of the font, % namely \emphasis{character protrusion} and \emphasis{font % expansion}. % Their arguments are names of \LUA tables that contain % values for the respective features.\footnote{% % For examples of the table layout please refer to the % section of the file \fileent{luaotfload-fonts-ext.lua} where the % default values are defined. % Alternatively and with loss of information, you can dump % those tables into your terminal by issuing % \begin{verbatim} % \directlua{inspect(fonts.protrusions.setups.default) % inspect(fonts.expansions.setups.default)} % \end{verbatim} % at some point after loading \fileent{luaotfload.sty}. % } % For both, only the set \identifier{default} is predefined. % % For example, to enable default protrusion\footnote{% % You also need to set % \verb|pdfprotrudechars=2| and % \verb|pdfadjustspacing=2| % to activate protrusion and expansion, respectively. % See the % \href{http://mirrors.ctan.org/systems/pdftex/manual/pdftex-a.pdf}% % {\PDFTEX manual} % for details. % }: % % \begin{quote} % \begin{verbatim} % \font\test=LatinModernRoman:protrusion=default % \end{verbatim} % \end{quote} % \end{description} % % \paragraph{Non-standard font features} % \identifier{luaotfload} adds a number of features that are not defined % in the original \OpenType specification, most of them % aiming at emulating the behavior familiar from other \TEX engines. % Currently (2013) there are three of them: % % \begin{description} % % \item [anum] % Substitutes the glyphs in the \abbrev{ascii} number range % with their counterparts from eastern Arabic or Persian, % depending on the value of \identifier{language}. % % \item [tlig] % Applies legacy \TEX ligatures: % % \begin{tabular}{rlrl} % `` & \verb|``| & '' & \verb|''| \\ % ` & \verb|`| & ' & \verb|'| \\ % " & \verb|"| & -- & \verb|--| \\ % --- & \verb|---| & !` & \verb|!`| \\ % ?` & \verb|?`| & & \\ % \end{tabular} % % \footnote{% % These contain the feature set \verb|trep| of earlier % versions of \identifier{luaotfload}. % % Note to \XETEX users: this is the equivalent of the % assignment \verb|mapping=text-tex| using \XETEX's input % remapping feature. % } % % \item [itlc] % Computes italic correction values (active by default). % % \end{description} % % % % \section{Font names database} % \label{sec:fontdb} % % As mentioned above, \identifier{luaotfload} keeps track of which % fonts are available to \LUATEX by means of a \emphasis{database}. % This allows referring to fonts not only by explicit filenames but % also by the proper names contained in the metadata which is often % more accessible to humans.\footnote{% % The tool \href{http://www.lcdf.org/type/}{\fileent{otfinfo}} (comes % with \TEX Live), when invoked on a font file with the \verb|-i| % option, lists the variety of name fields defined for it. % } % % When \identifier{luaotfload} is asked to load a font by a font name, % it will check if the database exists and load it, or else generate a % fresh one. % Should it then fail to locate the font, an update to the database is % performed in case the font has been added to the system only % recently. As soon as the database is updated, the resolver will try % and look up the font again, all without user intervention. % The goal is for \identifier{luaotfload} to act in the background and % behave as unobtrusively as possible, while providing a convenient % interface to the fonts installed on the system. % % Generating the database for the first time may take a while since it % inspects every font file on your computer. % This is particularly noticeable if it occurs during a typesetting run. % In any case, subsequent updates to the database will be quite fast. % % \subsection[luaotfload-tool / mkluatexfontdb.lua]% % {\fileent{luaotfload-tool} / % \fileent{mkluatexfontdb.lua}\footnote{% % The script may be named just \fileent{mkluatexfontdb} in your % distribution. % }} % % It can still be desirable at times to do some of these steps % manually, and without having to compile a document. % To this end, \identifier{luaotfload} comes with the utility % \fileent{luaotfload-tool} that offers an interface to the database % functionality. % Being a \LUA script, there are two ways to run it: % either make it executable (\verb|chmod +x| on unixoid systems) or % pass it as an argument to \fileent{texlua}.\footnote{% % Tests by the maintainer show only marginal performance gain by % running with Luigi Scarso’s % \href{https://foundry.supelec.fr/projects/luajittex/}% % {\identifier{Luajit\kern-.25ex\TEX}}, % which is probably due to the fact that most of the time is spent % on file system operations. % % \emphasis{Note}: % On \abbrev{MS} \identifier{Windows} systems, the script can be run % either by calling the wrapper application % \fileent{luaotfload-tool.exe} or as % \verb|texlua.exe luaotfload-tool.lua|. % } % Invoked with the argument \verb|--update| it will perform a database % update, scanning for fonts not indexed. % % \begin{quote} % \begin{verbatim} % luaotfload-tool --update % \end{verbatim} % \end{quote} % % Adding the \verb|--force| switch will initiate a complete % rebuild of the database. % % \begin{quote} % \begin{verbatim} % luaotfload-tool --update --force % \end{verbatim} % \end{quote} % % For sake of backwards compatibility, \fileent{luaotfload-tool} may be % renamed or symlinked to \fileent{mkluatexfontdb}. % Whenever it is run under this name, it will update the database % first, mimicking the behavior of earlier versions of % \identifier{luaotfload}. % % \subsection{Search Paths} % % \identifier{luaotfload} scans those directories where fonts are % expected to be located on a given system. % On a Linux machine it follows the paths listed in the % \identifier{Fontconfig} configuration files; % consult \verb|man 5 fonts.conf| for further information. % On \identifier{Windows} systems, the standard location is % \verb|Windows\Fonts|, % while \identifier{Mac OS~X} requires a multitude of paths to % be examined. % The complete list is is given in table \ref{table-searchpaths}. % Other paths can be specified by setting the environment variable % \verb+OSFONTDIR+. % If it is non-empty, then search will be extended to the included % directories. % % \begin{table}[t] % \hrule % \caption{List of paths searched for each supported operating % system.} % \renewcommand{\arraystretch}{1.2} % \begin{center} % \begin{tabular}{lp{.5\textwidth}} % Windows & \verb|%WINDIR%\Fonts| % \\ % Linux & \fileent{/usr/local/etc/fonts/fonts.conf} and\hfill\break % \fileent{/etc/fonts/fonts.conf} % \\ % Mac & \fileent{\textasciitilde/Library/Fonts},\break % \fileent{/Library/Fonts},\break % \fileent{/System/Library/Fonts}, and\hfill\break % \fileent{/Network/Library/Fonts} % \\ % \end{tabular} % \end{center} % \label{table-searchpaths} % \hrule % \end{table} % % \subsection{Querying from Outside} % % \fileent{luaotfload-tool} also provides rudimentary means of % accessing the information collected in the font database. % If the option \verb|--find=|\emphasis{name} is given, the script will % try and search the fonts indexed by \identifier{luaotfload} for a % matching name. % For instance, the invocation % % \begin{quote} % \begin{verbatim} % luaotfload-tool --find="Iwona Regular" % \end{verbatim} % \end{quote} % % \noindent % will verify if “Iwona Regular” is found in the database and can be % readily requested in a document. % % If you are unsure about the actual font name, then add the % \verb|-F| (or \verb|--fuzzy|) switch to the command line to enable % approximate matching. % Suppose you cannot precisely remember if the variant of % \identifier{Iwona} you are looking for was “Bright” or “Light”. % The query % % \begin{quote} % \begin{verbatim} % luaotfload-tool -F --find="Iwona Bright" % \end{verbatim} % \end{quote} % % \noindent % will tell you that indeed the latter name is correct. % % Basic information about fonts in the database can be displayed % using the \verb|-i| option (\verb|--info|). % \begin{quote} % \begin{verbatim} % luaotfload-tool -i --find="Iwona Light Italic" % \end{verbatim} % \end{quote} % \noindent % The meaning of the printed values is described in section 4.4 of the % \LUATEX reference manual.\footnote{% % In \TEX Live: \fileent{texmf-dist/doc/luatex/base/luatexref-t.pdf}. % } % % For a much more detailed report about a given font try the \verb|-I| option % instead (\verb|--inspect|). % \begin{quote} % \begin{verbatim} % luaotfload-tool -I --find="Iwona Light Italic" % \end{verbatim} % \end{quote} % % \verb|luaotfload-tool --help| will list the available command line % switches, including some not discussed in detail here. % For a full documentation of \identifier{luaotfload-tool} and its % capabilities refer to the manpage % (\verb|man 1 luaotfload-tool|).\footnote{% % Or see \verb|luaotfload-tool.rst| in the source directory. % } % % \subsection{Blacklisting Fonts} % \label{font-blacklist} % % Some fonts are problematic in general, or just in \LUATEX. % If you find that compiling your document takes far too long or eats % away all your system’s memory, you can track down the culprit by % running \verb|luaotfload-tool -v| to increase verbosity. % Take a note of the \emphasis{filename} of the font that database % creation fails with and append it to the file % \fileent{luaotfload-blacklist.cnf}. % % A blacklist file is a list of font filenames, one per line. % Specifying the full path to where the file is located is optional, the % plain filename should suffice. % File extensions (\fileent{.otf}, \fileent{.ttf}, etc.) may be omitted. % Anything after a percent (|%|) character until the end of the line % is ignored, so use this to add comments. % Place this file to some location where the \identifier{kpse} % library can find it, e.~g. % \fileent{texmf-local/tex/luatex/luaotfload} if you are running % \identifier{\TEX Live},\footnote{% % You may have to run \verb|mktexlsr| if you created a new file in % your \fileent{texmf} tree. % } % or just leave it in the working directory of your document. % \identifier{luaotfload} reads all files named % \fileent{luaotfload-blacklist.cnf} it finds, so the fonts in % \fileent{./luaotfload-blacklist.cnf} extend the global blacklist. % % Furthermore, a filename prepended with a dash character (|-|) is % removed from the blacklist, causing it to be temporarily whitelisted % without modifying the global file. % An example with explicit paths: % % \begin{verbatim} % % example otf-blacklist.cnf % /Library/Fonts/GillSans.ttc % Luaotfload ignores this font. % -/Library/Fonts/Optima.ttc % This one is usable again, even if % % blacklisted somewhere else. % \end{verbatim} % % \section{Files from \CONTEXT and \LUATEX-Fonts} % % \identifier{luaotfload} relies on code originally written by Hans % Hagen\footnote{% % The creator of the \href{http://wiki.contextgarden.net}{\CONTEXT} % format. % } % for and tested with \CONTEXT. % It integrates the font loader as distributed in % the \identifier{\LUATEX-Fonts} package. % The original \LUA source files have been combined using the % \fileent{mtx-package} script into a single, self-contained blob. % In this form the font loader has no further dependencies\footnote{% % It covers, however, to some extent the functionality of the % \identifier{lualibs} package. % } % and requires only minor adaptions to integrate into % \identifier{luaotfload}. % The guiding principle is to let \CONTEXT/\LUATEX-Fonts take care of % the implementation, and update the imported code from time to time. % As maintainers, we aim at importing files from upstream essentially % \emphasis{unmodified}, except for renaming them to prevent name % clashes. % This job has been greatly alleviated since the advent of % \LUATEX-Fonts, prior to which the individual dependencies had to be % manually spotted and extracted from the \CONTEXT source code in a % complicated and error-prone fashion. % % Below is a commented list of the files distributed with % \identifier{luaotfload} in one way or the other. % See figure \ref{file-graph} on page \pageref{file-graph} for a % graphical representation of the dependencies. % From \LUATEX-Fonts, only the file \fileent{luatex-fonts-merged.lua} % has been imported as \fileent{luaotfload-fontloader.lua}. % It is generated by \fileent{mtx-package}, a \LUA source code merging % too developed by Hans Hagen.\footnote{% % \fileent{mtx-package} is % \href % {http://repo.or.cz/w/context.git/blob_plain/refs/heads/origin:/scripts/context/lua/mtx-package.lua} % {part of \CONTEXT} % and requires \fileent{mtxrun}. % Run % \verb|mtxrun --script package --help| % to display further information. % For the actual merging code see the file % \fileent{util-mrg.lua} that is part of \CONTEXT. % } % It houses several \LUA files that can be classed in three % categories. % % \begin{itemize} % \let\normalitem=\item % \def\incitem#1{% % \normalitem{\fileent{#1}} % } % \normalitem \emphasis{\LUA utility libraries}, a subset % of what is provided by the \identifier{lualibs} % package. % % \begin{multicols}{2} % \begin{itemize} % \incitem{l-lua.lua} \incitem{l-lpeg.lua} % \incitem{l-function.lua} \incitem{l-string.lua} % \incitem{l-table.lua} \incitem{l-io.lua} % \incitem{l-file.lua} \incitem{l-boolean.lua} % \incitem{l-math.lua} \incitem{util-str.lua} % \end{itemize} % \end{multicols} % % \normalitem The \emphasis{font loader} itself. % These files have been written for % \LUATEX-Fonts and they are distributed along % with \identifier{luaotfload}. % \begin{multicols}{2} % \begin{itemize} % \incitem{luatex-basics-gen.lua} % \incitem{luatex-basics-nod.lua} % \incitem{luatex-fonts-enc.lua} % \incitem{luatex-fonts-syn.lua} % \incitem{luatex-fonts-tfm.lua} % \incitem{luatex-fonts-chr.lua} % \incitem{luatex-fonts-lua.lua} % \incitem{luatex-fonts-def.lua} % \incitem{luatex-fonts-ext.lua} % \incitem{luatex-fonts-cbk.lua} % \end{itemize} % \end{multicols} % % \normalitem Code related to \emphasis{font handling and % node processing}, taken directly from % \CONTEXT. % \begin{multicols}{2} % \begin{itemize} % \incitem{data-con.lua} \incitem{font-ini.lua} % \incitem{font-con.lua} \incitem{font-cid.lua} % \incitem{font-map.lua} \incitem{font-oti.lua} % \incitem{font-otf.lua} \incitem{font-otb.lua} % \incitem{node-inj.lua} \incitem{font-ota.lua} % \incitem{font-otn.lua} \incitem{font-def.lua} % \incitem{font-otp.lua} % \end{itemize} % \end{multicols} % \end{itemize} % % Note that if \identifier{luaotfload} cannot locate the % merged file, it will load the individual \LUA libraries % instead. % Their names remain the same as in \CONTEXT (without the % \verb|otfl|-prefix) since we imported the relevant section of % \fileent{luatex-fonts.lua} unmodified into \fileent{luaotfload.lua}. % Thus if you prefer running bleeding edge code from the % \CONTEXT beta, all you have to do is remove % \fileent{luaotfload-merged.lua} from the search path. % % Also, the merged file at some point % loads the Adobe Glyph List from a \LUA table that is contained in % \fileent{luaotfload-glyphlist.lua}, which is automatically generated by the % script \fileent{mkglyphlist}.\footnote{% % See \fileent{luaotfload-font-enc.lua}. % The hard-coded file name is why we have to replace the procedure % that loads the file in \fileent{luaotfload-override.lua}. % } % There is a make target \identifier{glyphs} that will create a fresh % glyph list so we don’t need to import it from \CONTEXT % any longer. % % In addition to these, \identifier{luaotfload} requires a number of % files not contained in the merge. Some of these have no equivalent in % \LUATEX-Fonts or \CONTEXT, some were taken unmodified from the % latter. % % \begin{itemize} % \let\normalitem=\item % \def\ouritem#1{% % \normalitem{\fileent{#1}}% % \space--\hskip1em % } % \ouritem {luaotfload-features.lua} font feature handling; % incorporates some of the code from % \fileent{font-otc} from \CONTEXT; % \ouritem {luaotfload-override.lua} overrides the \CONTEXT logging % functionality. % \ouritem {luaotfload-loaders.lua} registers the \OpenType % font reader as handler for % Postscript fonts % (\abbrev{pfa}, \abbrev{pfb}). % \ouritem {luaotfload-database.lua} font names database. % \ouritem {luaotfload-colors.lua} color handling. % \ouritem {luaotfload-auxiliary.lua} access to internal functionality % for package authors % (proposals for additions welcome). % \ouritem {luaotfload-extralibs.lua} layer for loading of further % Context libraries. % \ouritem {luaotfload-letterspace.lua} font-based letterspacing. % \ouritem {luaotfload-typo-krn.lua} attribute-based letterspacing. % \end{itemize} % % \begin{figure}[b] % \caption{Schematic of the files in \identifier{Luaotfload}} % \includegraphics[width=\textwidth]{filegraph.pdf} % \label{file-graph} % \end{figure} % % \section{Auxiliary Functions} % % With release version 2.2, \identifier{luaotfload} received % additional functions for package authors to call from outside % (see the file \fileent{luaotfload-auxiliary.lua} for details). % The purpose of this addition twofold. % Firstly, \identifier{luaotfload} failed to provide a stable interface % to internals in the past which resulted in an unmanageable situation % of different packages abusing the raw access to font objects by means % of the \luafunction{patch_font} callback. % When the structure of the font object changed due to an update, all % of these imploded and several packages had to be fixed while % simultaneously providing fallbacks for earlier versions. % Now the patching is done on the \identifier{luaotfload} side and can % be adapted with future modifications to font objects without touching % the packages that depend on it. % Second, some the capabilities of the font loader and the names % database are not immediately relevant in \identifier{luaotfload} % itself but might nevertheless be of great value to package authors or % end users. % % Note that the current interface is not yet set in stone and the % development team is open to suggestions for improvements or % additions. % % \subsection{Callback Functions} % % The \luafunction{patch_font} callback is inserted in the wrapper % \identifier{luaotfload} provides for the font definition callback % (see below, page \pageref{define-font}). % At this place it allows manipulating the font object immediately after % the font loader is done creating it. % For a short demonstration of its usefulness, here is a snippet that % writes an entire font object to the file \fileent{fontdump.lua}: % % \begin{quote} % \begin{verbatim} % \input luaotfload.sty % \directlua{ % local dumpfile = "fontdump.lua" % local dump_font = function (tfmdata) % local data = table.serialize(tfmdata) % io.savedata(dumpfile, data) % end % % luatexbase.add_to_callback( % "luaotfload.patch_font", % dump_font, % "my_private_callbacks.dump_font" % ) % } % \font\dumpme=name:Iwona % \bye % \end{verbatim} % \end{quote} % % \emphasis{Beware}: this creates a Lua file of around 150,000 lines of % code, taking up 3~\abbrev{mb} of disk space. % By inspecting the output you can get a first impression of how a font % is structured in \LUATEX’s memory, what elements it is composed of, % and in what ways it can be rearranged. % % \subsubsection{Compatibility with Earlier Versions} % % As has been touched on in the preface to this section, the structure % of the object as returned by the fontloader underwent rather drastic % changes during different stages of its development, and not all % packages that made use of font patching have kept up with every one % of it. % To ensure compatibility with these as well as older versions of % some packages, \identifier{luaotfload} sets up copies of or references % to data in the font table where it used to be located. % For instance, important parameters like the requested point size, the % units factor, and the font name have again been made accessible from % the toplevel of the table even though they were migrated to different % subtables in the meantime. % % \subsubsection{Patches} % % These are mostly concerned with establishing compatibility with % \XETEX. % % \begin{itemize} % \let\normalitem=\item % \def\ouritem#1{% % \normalitem{\luafunction{#1}}% % \hfill\break % } % % \ouritem {set_sscale_dimens} % Calculate \texmacro{fontdimen}s 10 and 11 to emulate \XETEX. % % \ouritem {set_capheight} % Calculates \texmacro{fontdimen} 8 like \XETEX. % % \ouritem {patch_cambria_domh} % Correct some values of the font \emphasis{Cambria Math}. % % \end{itemize} % % \subsection{Package Author’s Interface} % % As \LUATEX release 1.0 is nearing, the demand for a reliable interface % for package authors increases. % % \subsubsection{Font Properties} % % Below functions mostly concern querying the different components of a % font like for instance the glyphs it contains, or what font features % are defined for which scripts. % % \begin{itemize} % \let\normalitem=\item % \def\ouritem#1{% % \normalitem{\luafunction{#1}}% % \hfill\break % } % % \ouritem {aux.font_has_glyph (id : int, index : int)} % Predicate that returns true if the font \luafunction{id} % has glyph \luafunction{index}. % % \ouritem {aux.slot_of_name(name : string)} % Translates an Adobe Glyph name to the corresponding glyph % slot. % % \ouritem {aux.name_of_slot(slot : int)} % The inverse of \luafunction{slot_of_name}; note that this % might be incomplete as multiple glyph names may map to the % same codepoint, only one of which is returned by % \luafunction{name_of_slot}. % % \ouritem {aux.provides_script(id : int, script : string)} % Test if a font supports \luafunction{script}. % % \ouritem {aux.provides_language(id : int, script : string, language : string)} % Test if a font defines \luafunction{language} for a given % \luafunction{script}. % % \ouritem {aux.provides_feature(id : int, script : string, % language : string, feature : string)} % Test if a font defines \luafunction{feature} for % \luafunction{language} for a given \luafunction{script}. % % \ouritem {aux.get_math_dimension(id : int, dimension : string)} % Get the dimension \luafunction{dimension} of font \luafunction{id}. % % \ouritem {aux.sprint_math_dimension(id : int, dimension : string)} % Same as \luafunction{get_math_dimension()}, but output the value % in scaled points at the \TEX end. % % \end{itemize} % % \subsubsection{Database} % % \begin{itemize} % \let\normalitem=\item % \def\ouritem#1{% % \normalitem{\luafunction{#1}}% % \hfill\break % } % % \ouritem {aux.scan_external_dir(dir : string)} % Include fonts in directory \luafunction{dir} in font lookups without % adding them to the database. % % \end{itemize} % % \section{Troubleshooting} % % \subsection {Database Generation} % If you encounter problems with some fonts, please first update to the latest % version of this package before reporting a bug, as % \identifier{luaotfload} is under active development and still a % moving target. % The development takes place on \identifier{github} at % \url{https://github.com/lualatex/luaotfload} where there is an issue % tracker for submitting bug reports, feature requests and the likes % requests and the likes. % % Bug reports are more likely to be addressed if they contain the output of % % \begin{quote} % \begin{verbatim} % luaotfload-tool --diagnose=environment,files,permissions % \end{verbatim} % \end{quote} % % \noindent Consult the man page for a description of these options. % % Errors during database generation can be traced by increasing the % verbosity level and redirecting log output to \fileent{stdout}: % % \begin{quote} % \begin{verbatim} % luaotfload-tool -fuvvv --log=stdout % \end{verbatim} % \end{quote} % % \noindent or to a file in \fileent{/tmp}: % % \begin{quote} % \begin{verbatim} % luaotfload-tool -fuvvv --log=file % \end{verbatim} % \end{quote} % % \noindent In the latter case, invoke the \verb|tail(1)| utility on the file % for live monitoring of the progress. % % If database generation fails, the font last printed to the terminal or log % file is likely to be the culprit. % Please specify it when reporting a bug, and blacklist it for the time % being (see above, page \pageref{font-blacklist}). % % \subsection {Font Features} % A common problem is the lack of features for some % \OpenType fonts even when specified. % This can be related to the fact that some fonts do not provide % features for the \verb|dflt| script (see above on page % \pageref{script-tag}), % which is the default one in this package. % If this happens, assigning a noth script when the font is defined should % fix it. % For example with \verb|latn|: % % \begin{quote} % \begin{verbatim} % \font\test=file:MyFont.otf:script=latn;+liga; % \end{verbatim} % \end{quote} % % You can get a list of features that a font defines for scripts and languages % by querying it in \fileent{luaotfload-tool}: % % \begin{quote} % \begin{verbatim} % luaotfload-tool --find="Iwona" --inspect % \end{verbatim} % \end{quote} % % \subsection {\LUATEX Programming} % Another strategy that helps avoiding problems is to not access raw \LUATEX % internals directly. % Some of them, even though they are dangerous to access, have not been % overridden or disabled. % Thus, whenever possible prefer the functions in the % \luafunction{aux} namespace over direct manipulation of font objects. % For example, raw access to the \luafunction{font.fonts} table like: % % \begin{quote} % \begin{verbatim} % local somefont = font.fonts[2] % \end{verbatim} % \end{quote} % % \noindent can render already defined fonts unusable. % Instead, the function \luafunction{font.getfont()} should be used because % it has been replaced by a safe variant. % % However, \luafunction{font.getfont()} only covers fonts handled by the font % loader, e.~g. \identifier{OpenType} and \identifier{TrueType} fonts, but % not \abbrev{tfm} or \abbrev{ofm}. % Should you absolutely require access to all fonts known to \LUATEX, including % the virtual and autogenerated ones, then you need to query both % \luafunction{font.getfont()} and \luafunction{font.fonts}. % In this case, best define you own accessor: % % \begin{quote} % \begin{verbatim} % local unsafe_getfont = function (id) % local tfmdata = font.getfont (id) % if not tfmdata then % tfmdata = font.fonts[id] % end % return tfmdata % end % % --- use like getfont() % local somefont = unsafe_getfont (2) % \end{verbatim} % \end{quote} % % \part{Implementation} % % \section{\fileent{luaotfload.lua}} % % This file initializes the system and loads the font loader. % To minimize potential conflicts between other packages and the % code imported from \CONTEXT, several precautions are in order. % Some of the functionality that the font loader expects to be present, % like raw access to callbacks, are assumed to have been disabled by % \identifier{luatexbase} when this file is processed. % In some cases it is possible to trick it by putting dummies into % place and restoring the behavior from \identifier{luatexbase} after % initilization. % Other cases such as attribute allocation require that we hook the % functionality from \identifier{luatexbase} into locations where they % normally wouldn’t be. % % Anyways we can import the code base without modifications, which is % due mostly to the extra effort by % Hans Hagen to make \LUATEX-Fonts self-contained and encapsulate it, % and especially due to his willingness to incorporate our suggestions. % % \iffalse %<*lua> % \fi % \begin{macrocode} luaotfload = luaotfload or {} local luaotfload = luaotfload config = config or { } config.luaotfload = config.luaotfload or { } ------.luaotfload.resolver = config.luaotfload.resolver or "normal" config.luaotfload.resolver = config.luaotfload.resolver or "cached" config.luaotfload.definer = config.luaotfload.definer or "patch" config.luaotfload.compatibility = config.luaotfload.compatibility or false config.luaotfload.loglevel = config.luaotfload.loglevel or 1 config.luaotfload.color_callback = config.luaotfload.color_callback or "pre_linebreak_filter" config.luaotfload.prioritize = config.luaotfload.prioritize or "sys" config.luaotfload.names_dir = config.luaotfload.names_dir or "names" config.luaotfload.cache_dir = config.luaotfload.cache_dir or "fonts" config.luaotfload.index_file = config.luaotfload.index_file or "luaotfload-names.lua" config.luaotfload.formats = config.luaotfload.formats or "otf,ttf,ttc,dfont" if not config.luaotfload.strip then config.luaotfload.strip = true end luaotfload.module = { name = "luaotfload", version = 2.40002, date = "2013/07/28", description = "OpenType layout system.", author = "Elie Roux & Hans Hagen", copyright = "Elie Roux", license = "GPL v2.0" } local luatexbase = luatexbase local setmetatable = setmetatable local type, next = type, next local kpsefind_file = kpse.find_file local lfsisfile = lfs.isfile local add_to_callback, create_callback = luatexbase.add_to_callback, luatexbase.create_callback local reset_callback, call_callback = luatexbase.reset_callback, luatexbase.call_callback local dummy_function = function () end local error, warning, info, log = luatexbase.provides_module(luaotfload.module) luaotfload.error = error luaotfload.warning = warning luaotfload.info = info luaotfload.log = log % \end{macrocode} % We set the minimum version requirement for \LUATEX to v0.76, % because the font loader requires recent features like direct % attribute indexing and \luafunction{node.end_of_math()} that aren’t % available in earlier versions.\footnote{% % See Taco’s announcement of v0.76: % \url{http://comments.gmane.org/gmane.comp.tex.luatex.user/4042} % and this commit by Hans that introduced those features. % \url{http://repo.or.cz/w/context.git/commitdiff/a51f6cf6ee087046a2ae5927ed4edff0a1acec1b}. % } % % \begin{macrocode} local luatex_version = 76 if tex.luatexversion < luatex_version then warning("LuaTeX v%.2f is old, v%.2f is recommended.", tex.luatexversion/100, luatex_version /100) --- we install a fallback for older versions as a safety if not node.end_of_math then local math_t = node.id"math" local traverse_nodes = node.traverse_id node.end_of_math = function (n) for n in traverse_nodes(math_t, n.next) do return n end end end end % \end{macrocode} % \subsection{Module loading} % We load the files imported from \CONTEXT with this function. % It automatically prepends the prefix \fileent{luaotfload-} to its % argument, so we can refer to the files with their actual \CONTEXT name. % % \begin{macrocode} local fl_prefix = "luaotfload" -- “luatex” for luatex-plain local loadmodule = function (name) require(fl_prefix .."-"..name) end % \end{macrocode} % Before \TeX Live 2013 version, \LUATEX had a bug that made ofm fonts fail % when called with their extension. There was a side-effect making ofm % totally unloadable when luaotfload was present. The following lines are % a patch for this bug. The utility of these lines is questionable as they % are not necessary since \TeX Live 2013. They should be removed in the next % version. % % \begin{macrocode} local Cs, P, lpegmatch = lpeg.Cs, lpeg.P, lpeg.match local p_dot, p_slash = P".", P"/" local p_suffix = (p_dot * (1 - p_dot - p_slash)^1 * P(-1)) / "" local p_removesuffix = Cs((p_suffix + 1)^1) local find_vf_file = function (name) local fullname = kpsefind_file(name, "ovf") if not fullname then --fullname = kpsefind_file(file.removesuffix(name), "ovf") fullname = kpsefind_file(lpegmatch(p_removesuffix, name), "ovf") end if fullname then log("loading virtual font file %s.", fullname) end return fullname end % \end{macrocode} % \subsection{Preparing the Font Loader} % We treat the fontloader as a black box so behavior is consistent % between formats. % We do no longer run the intermediate wrapper file % \fileent{luaotfload-fonts.lua} which we used to import from % \href{http://standalone.contextgarden.net/current/context/experimental/tex/generic/context/luatex/}{\LUATEX-Plain}. % Rather, we load the fontloader code directly in the same fashion as % \identifier{luatex-fonts}. % How this is executed depends on the presence on the \emphasis{merged % font loader code}. % In \identifier{luaotfload} this is contained in the file % \fileent{luaotfload-merged.lua}. % If this file cannot be found, the original libraries from \CONTEXT of % which the merged code was composed are loaded instead. % The imported font loader will call \luafunction{callback.register} once % while reading \fileent{font-def.lua}. % This is unavoidable unless we modify the imported files, but harmless % if we make it call a dummy instead. % However, this problem might vanish if we decide to do the merging % ourselves, like the \identifier{lualibs} package does. % With this step we would obtain the freedom to load our own overrides in % the process right where they are needed, at the cost of losing % encapsulation. % The decision on how to progress is currently on indefinite hold. % % \begin{macrocode} local starttime = os.gettimeofday() local trapped_register = callback.register callback.register = dummy_function % \end{macrocode} % By default, the fontloader requires a number of \emphasis{private % attributes} for internal use. % These must be kept consistent with the attribute handling methods as % provided by \identifier{luatexbase}. % Our strategy is to override the function that allocates new attributes % before we initialize the font loader, making it a wrapper around % \luafunction{luatexbase.new_attribute}.\footnote{% % Many thanks, again, to Hans Hagen for making this part % configurable! % } % The attribute identifiers are prefixed “\fileent{luaotfload@}” to % avoid name clashes. % % \begin{macrocode} do local new_attribute = luatexbase.new_attribute local the_attributes = luatexbase.attributes attributes = attributes or { } attributes.private = function (name) local attr = "luaotfload@" .. name --- used to be: “otfl@” local number = the_attributes[attr] if not number then number = new_attribute(attr) end return number end end % \end{macrocode} % These next lines replicate the behavior of \fileent{luatex-fonts.lua}. % % \begin{macrocode} local context_environment = { } local push_namespaces = function () log("push namespace for font loader") local normalglobal = { } for k, v in next, _G do normalglobal[k] = v end return normalglobal end local pop_namespaces = function (normalglobal, isolate) if normalglobal then local _G = _G local mode = "non-destructive" if isolate then mode = "destructive" end log("pop namespace from font loader -- " .. mode) for k, v in next, _G do if not normalglobal[k] then context_environment[k] = v if isolate then _G[k] = nil end end end for k, v in next, normalglobal do _G[k] = v end -- just to be sure: setmetatable(context_environment,_G) else log("irrecoverable error during pop_namespace: no globals to restore") os.exit() end end luaotfload.context_environment = context_environment luaotfload.push_namespaces = push_namespaces luaotfload.pop_namespaces = pop_namespaces local our_environment = push_namespaces() % \end{macrocode} % The font loader requires that the attribute with index zero be zero. % We happily oblige. % (Cf. \fileent{luatex-fonts-nod.lua}.) % % \begin{macrocode} tex.attribute[0] = 0 % \end{macrocode} % Now that things are sorted out we can finally load the fontloader. % % \begin{macrocode} loadmodule"fontloader.lua" ---loadmodule"font-odv.lua" --- <= Devanagari support from Context if fonts then if not fonts._merge_loaded_message_done_ then log [["I am using the merged version of 'luaotfload.lua' here.]] log [[ If you run into problems or experience unexpected]] log [[ behaviour, and if you have ConTeXt installed you can try]] log [[ to delete the file 'luaotfload-merged.lua' as I might]] log [[ then use the possibly updated libraries. The merged]] log [[ version is not supported as it is a frozen instance.]] log [[ Problems can be reported to the ConTeXt mailing list."]] end fonts._merge_loaded_message_done_ = true else--- the loading sequence is known to change, so this might have to --- be updated with future updates! --- do not modify it though unless there is a change to the merged --- package! loadmodule("l-lua.lua") loadmodule("l-lpeg.lua") loadmodule("l-function.lua") loadmodule("l-string.lua") loadmodule("l-table.lua") loadmodule("l-io.lua") loadmodule("l-file.lua") loadmodule("l-boolean.lua") loadmodule("l-math.lua") loadmodule("util-str.lua") loadmodule('luatex-basics-gen.lua') loadmodule('data-con.lua') loadmodule('luatex-basics-nod.lua') loadmodule('font-ini.lua') loadmodule('font-con.lua') loadmodule('luatex-fonts-enc.lua') loadmodule('font-cid.lua') loadmodule('font-map.lua') loadmodule('luatex-fonts-syn.lua') loadmodule('luatex-fonts-tfm.lua') loadmodule('font-oti.lua') loadmodule('font-otf.lua') loadmodule('font-otb.lua') loadmodule('node-inj.lua') loadmodule('font-ota.lua') loadmodule('font-otn.lua') loadmodule('font-otp.lua')--- since 2013-04-23 loadmodule('luatex-fonts-lua.lua') loadmodule('font-def.lua') loadmodule('luatex-fonts-def.lua') loadmodule('luatex-fonts-ext.lua') loadmodule('luatex-fonts-cbk.lua') end --- non-merge fallback scope % \end{macrocode} % Here we adjust the globals created during font loader initialization. % If the second argument to \luafunction{pop_namespaces()} is \verb|true| % this will restore the state of \luafunction{_G}, eliminating every % global generated since the last call to \luafunction{push_namespaces()}. % At the moment we see no reason to do this, and since the font loader is % considered an essential part of \identifier{luatex} as well as a very % well organized piece of code, we happily concede it the right to add to % \luafunction{_G} if needed. % % \begin{macrocode} pop_namespaces(our_environment, false)-- true) log("fontloader loaded in %0.3f seconds", os.gettimeofday()-starttime) % \end{macrocode} % \subsection{Callbacks} % After the fontloader is ready we can restore the callback trap from % \identifier{luatexbase}. % % \begin{macrocode} callback.register = trapped_register % \end{macrocode} % We do our own callback handling with the means provided by luatexbase. % Note: \luafunction{pre_linebreak_filter} and \luafunction{hpack_filter} % are coupled in \CONTEXT in the concept of \emphasis{node processor}. % % \begin{macrocode} add_to_callback("pre_linebreak_filter", nodes.simple_font_handler, "luaotfload.node_processor", 1) add_to_callback("hpack_filter", nodes.simple_font_handler, "luaotfload.node_processor", 1) add_to_callback("find_vf_file", find_vf_file, "luaotfload.find_vf_file") loadmodule"override.lua" --- “luat-ovr” logs.set_loglevel(config.luaotfload.loglevel) % \end{macrocode} % Now we load the modules written for \identifier{luaotfload}. % % \begin{macrocode} loadmodule"loaders.lua" --- “font-pfb” new in 2.0, added 2011 loadmodule"database.lua" --- “font-nms” loadmodule"colors.lua" --- “font-clr” % \end{macrocode} % Relying on the \verb|name:| resolver for everything has been the source % of permanent trouble with the database. % With the introduction of the new syntax parser we now have enough % granularity to distinguish between the \XETEX emulation layer and the % genuine \verb|name:| and \verb|file:| lookups of \LUATEX-Fonts. % Another benefit is that we can now easily plug in or replace new lookup % behaviors if necessary. % The name resolver remains untouched, but it calls % \luafunction{fonts.names.resolve()} internally anyways (see % \fileent{luaotfload-database.lua}). % % \begin{macrocode} local filesuffix = file.suffix local fileremovesuffix = file.removesuffix local request_resolvers = fonts.definers.resolvers local formats = fonts.formats local names = fonts.names formats.ofm = "type1" fonts.encodings.known = fonts.encodings.known or { } % \end{macrocode} % \identifier{luaotfload} promises easy access to system fonts. % Without additional precautions, this cannot be achieved by % \identifier{kpathsea} alone, because it searches only the % \fileent{texmf} directories by default. % Although it is possible for \identifier{kpathsea} to include extra % paths by adding them to the \verb|OSFONTDIR| environment variable, % this is still short of the goal »\emphasis{it just works!}«. % When building the font database \identifier{luaotfload} scans % system font directories anyways, so we already have all the % information for looking sytem fonts. % With the release version 2.2 the file names are indexed in the database % as well and we are ready to resolve \verb|file:| lookups this way. % Thus we no longer need to call the \identifier{kpathsea} library in % most cases when looking up font files, only when generating the database, % and when verifying the existence of a file in the \fileent{texmf} tree. % % \begin{macrocode} local resolve_file = names.crude_file_lookup --local resolve_file = names.crude_file_lookup_verbose local resolve_name = names.resolve_name local file_resolver = function (specification) local name = resolve_file (specification.name) local suffix = filesuffix(name) if formats[suffix] then specification.forced = suffix specification.forcedname = file.removesuffix(name) else specification.name = name end end request_resolvers.file = file_resolver % \end{macrocode} % We classify as \verb|anon:| those requests that have neither a % prefix nor brackets. According to Khaled\footnote{% % \url{https://github.com/phi-gamma/luaotfload/issues/4#issuecomment-17090553}. % } % they are the \XETEX equivalent of a \verb|name:| request, so we will be % treating them as such. % % \begin{macrocode} --request_resolvers.anon = request_resolvers.name % \end{macrocode} % There is one drawback, though. % This syntax is also used for requesting fonts in \identifier{Type1} % (\abbrev{tfm}, \abbrev{ofm}) format. % These are essentially \verb|file:| lookups and must be caught before % the \verb|name:| resolver kicks in, lest they cause the database to % update. % Even if we were to require the \verb|file:| prefix for all % \identifier{Type1} requests, tests have shown that certain fonts still % include further fonts (e.~g. \fileent{omlgcb.ofm} will ask for % \fileent{omsecob.tfm}) \emphasis{using the old syntax}. % For this reason, we introduce an extra check with an early return. % % \begin{macrocode} local type1_formats = { "tfm", "ofm", } request_resolvers.anon = function (specification) local name = specification.name for i=1, #type1_formats do local format = type1_formats[i] if resolvers.findfile(name, format) then specification.forcedname = file.addsuffix(name, format) specification.forced = format return end end --- under some weird circumstances absolute paths get --- passed to the definer; we have to catch them --- before the name: resolver misinterprets them. name = specification.specification local exists, _ = lfsisfile(name) if exists then --- garbage; we do this because we are nice, --- not because it is correct logs.names_report("log", 1, "load", "file %q exists", name) logs.names_report("log", 1, "load", "... overriding borked anon: lookup with path: lookup") specification.name = name request_resolvers.path(specification) return end request_resolvers.name(specification) end % \end{macrocode} % Prior to version 2.2, \identifier{luaotfload} did not distinguish % \verb|file:| and \verb|path:| lookups, causing complications with the % resolver. % Now we test if the requested name is an absolute path in the file % system, otherwise we fall back to the \verb|file:| lookup. % % \begin{macrocode} request_resolvers.path = function (specification) local name = specification.name local exists, _ = lfsisfile(name) if not exists then -- resort to file: lookup logs.names_report("log", 1, "load", "path lookup of %q unsuccessful, falling back to file:", name) file_resolver (specification) else local suffix = filesuffix (name) if formats[suffix] then specification.forced = suffix specification.name = file.removesuffix(name) else specification.name = name end end end % \end{macrocode} % {\bfseries EXPERIMENTAL}: % \identifier{kpse}-only resolver, for those who can do without system % fonts. % % \begin{macrocode} request_resolvers.kpse = function (specification) local name = specification.name local suffix = filesuffix(name) if suffix and formats[suffix] then name = file.removesuffix(name) if resolvers.findfile(name, suffix) then specification.forced = suffix specification.forcedname = name return end end for t, format in next, formats do --- brute force if kpse.find_file (name, format) then specification.forced = t specification.name = name return end end end % \end{macrocode} % The \verb|name:| resolver wraps the database function % \luafunction{resolve_name}. % % \begin{macrocode} --- fonts.names.resolvers.name -- Customized version of the --- generic name resolver. request_resolvers.name = function (specification) local resolved, subfont = resolve_name (specification) if resolved then specification.resolved = resolved specification.sub = subfont specification.forced = filesuffix (resolved) specification.forcedname = resolved specification.name = fileremovesuffix (resolved) else file_resolver (specification) end end % \end{macrocode} % Also {\bfseries EXPERIMENTAL}: % custom file resolvers via callback. % % \begin{macrocode} create_callback("luaotfload.resolve_font", "simple", dummy_function) request_resolvers.my = function (specification) call_callback("luaotfload.resolve_font", specification) end % \end{macrocode} % We create a callback for patching fonts on the fly, to be used by other % packages. % It initially contains the empty function that we are going to override % below. % % \begin{macrocode} create_callback("luaotfload.patch_font", "simple", dummy_function) % \end{macrocode} % \subsection{\CONTEXT override} % \label{define-font} % We provide a simplified version of the original font definition % callback. % % \begin{macrocode} local read_font_file = fonts.definers.read --- spec -> size -> id -> tmfdata local patch_defined_font = function (specification, size, id) local tfmdata = read_font_file(specification, size, id) if type(tfmdata) == "table" and tfmdata.shared then --- We need to test for the “shared” field here --- or else the fontspec capheight callback will --- operate on tfm fonts. call_callback("luaotfload.patch_font", tfmdata, specification) end return tfmdata end reset_callback "define_font" % \end{macrocode} % Finally we register the callbacks. % % \begin{macrocode} local font_definer = config.luaotfload.definer if font_definer == "generic" then add_to_callback("define_font", fonts.definers.read, "luaotfload.define_font", 1) elseif font_definer == "patch" then add_to_callback("define_font", patch_defined_font, "luaotfload.define_font", 1) end loadmodule"features.lua" --- contains what was “font-ltx” and “font-otc” loadmodule"extralibs.lua" --- load additional Context libraries loadmodule"auxiliary.lua" --- additionaly high-level functionality (new) luaotfload.aux.start_rewrite_fontname () --- to be migrated to fontspec -- vim:tw=71:sw=4:ts=4:expandtab % \end{macrocode} % % \iffalse % % \fi % % \section{\fileent{luaotfload.sty}} % % \iffalse %<*package> % \fi % % Classical Plain+\LATEX package initialization. % % \begin{macrocode} \csname ifluaotfloadloaded\endcsname \let\ifluaotfloadloaded\endinput \bgroup\expandafter\expandafter\expandafter\egroup \expandafter\ifx\csname ProvidesPackage\endcsname\relax \input luatexbase.sty \else \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{luaotfload}% [2013/07/28 v2.4 OpenType layout system] \RequirePackage{luatexbase} \fi \ifnum\luatexversion<76 %% here some deprecation warning would be in order \RequireLuaModule{lualibs} \RequireLuaModule{luaotfload-legacy} \else \RequireLuaModule{luaotfload} \fi \endinput % \end{macrocode} % \iffalse % % \fi % % \clearpage % \section{The GNU GPL License v2} % % The GPL requires the complete license text to be distributed along % with the code. I recommend the canonical source, instead: % \url{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html}. % But if you insist on an included copy, here it is. % You might want to zoom in. % % \newsavebox{\gpl} % \begin{lrbox}{\gpl} % \begin{minipage}{3\textwidth} % \columnsep=3\columnsep % \begin{multicols}{3} % \begin{center} % {\Large GNU GENERAL PUBLIC LICENSE\par} % \bigskip % {Version 2, June 1991} % \end{center} % % \begin{center} % {\parindent 0in % % Copyright \textcopyright\ 1989, 1991 Free Software Foundation, Inc. % % \bigskip % % 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA % % \bigskip % % Everyone is permitted to copy and distribute verbatim copies % of this license document, but changing it is not allowed. % } % \end{center} % % \begin{center} % {\bf\large Preamble} % \end{center} % % % The licenses for most software are designed to take away your freedom to % share and change it. By contrast, the GNU General Public License is % intended to guarantee your freedom to share and change free software---to % make sure the software is free for all its users. This General Public % License applies to most of the Free Software Foundation's software and to % any other program whose authors commit to using it. (Some other Free % Software Foundation software is covered by the GNU Library General Public % License instead.) You can apply it to your programs, too. % % When we speak of free software, we are referring to freedom, not price. % Our General Public Licenses are designed to make sure that you have the % freedom to distribute copies of free software (and charge for this service % if you wish), that you receive source code or can get it if you want it, % that you can change the software or use pieces of it in new free programs; % and that you know you can do these things. % % To protect your rights, we need to make restrictions that forbid anyone to % deny you these rights or to ask you to surrender the rights. These % restrictions translate to certain responsibilities for you if you % distribute copies of the software, or if you modify it. % % For example, if you distribute copies of such a program, whether gratis or % for a fee, you must give the recipients all the rights that you have. You % must make sure that they, too, receive or can get the source code. And % you must show them these terms so they know their rights. % % We protect your rights with two steps: (1) copyright the software, and (2) % offer you this license which gives you legal permission to copy, % distribute and/or modify the software. % % Also, for each author's protection and ours, we want to make certain that % everyone understands that there is no warranty for this free software. If % the software is modified by someone else and passed on, we want its % recipients to know that what they have is not the original, so that any % problems introduced by others will not reflect on the original authors' % reputations. % % Finally, any free program is threatened constantly by software patents. % We wish to avoid the danger that redistributors of a free program will % individually obtain patent licenses, in effect making the program % proprietary. To prevent this, we have made it clear that any patent must % be licensed for everyone's free use or not licensed at all. % % The precise terms and conditions for copying, distribution and % modification follow. % % \begin{center} % {\Large \sc Terms and Conditions For Copying, Distribution and % Modification} % \end{center} % % \begin{enumerate} % \item % This License applies to any program or other work which contains a notice % placed by the copyright holder saying it may be distributed under the % terms of this General Public License. The ``Program'', below, refers to % any such program or work, and a ``work based on the Program'' means either % the Program or any derivative work under copyright law: that is to say, a % work containing the Program or a portion of it, either verbatim or with % modifications and/or translated into another language. (Hereinafter, % translation is included without limitation in the term ``modification''.) % Each licensee is addressed as ``you''. % % Activities other than copying, distribution and modification are not % covered by this License; they are outside its scope. The act of % running the Program is not restricted, and the output from the Program % is covered only if its contents constitute a work based on the % Program (independent of having been made by running the Program). % Whether that is true depends on what the Program does. % % \item You may copy and distribute verbatim copies of the Program's source % code as you receive it, in any medium, provided that you conspicuously % and appropriately publish on each copy an appropriate copyright notice % and disclaimer of warranty; keep intact all the notices that refer to % this License and to the absence of any warranty; and give any other % recipients of the Program a copy of this License along with the Program. % % You may charge a fee for the physical act of transferring a copy, and you % may at your option offer warranty protection in exchange for a fee. % % \item % You may modify your copy or copies of the Program or any portion % of it, thus forming a work based on the Program, and copy and % distribute such modifications or work under the terms of Section 1 % above, provided that you also meet all of these conditions: % % \begin{enumerate} % % \item % You must cause the modified files to carry prominent notices stating that % you changed the files and the date of any change. % % \item % You must cause any work that you distribute or publish, that in % whole or in part contains or is derived from the Program or any % part thereof, to be licensed as a whole at no charge to all third % parties under the terms of this License. % % \item % If the modified program normally reads commands interactively % when run, you must cause it, when started running for such % interactive use in the most ordinary way, to print or display an % announcement including an appropriate copyright notice and a % notice that there is no warranty (or else, saying that you provide % a warranty) and that users may redistribute the program under % these conditions, and telling the user how to view a copy of this % License. (Exception: if the Program itself is interactive but % does not normally print such an announcement, your work based on % the Program is not required to print an announcement.) % % \end{enumerate} % % % These requirements apply to the modified work as a whole. If % identifiable sections of that work are not derived from the Program, % and can be reasonably considered independent and separate works in % themselves, then this License, and its terms, do not apply to those % sections when you distribute them as separate works. But when you % distribute the same sections as part of a whole which is a work based % on the Program, the distribution of the whole must be on the terms of % this License, whose permissions for other licensees extend to the % entire whole, and thus to each and every part regardless of who wrote it. % % Thus, it is not the intent of this section to claim rights or contest % your rights to work written entirely by you; rather, the intent is to % exercise the right to control the distribution of derivative or % collective works based on the Program. % % In addition, mere aggregation of another work not based on the Program % with the Program (or with a work based on the Program) on a volume of % a storage or distribution medium does not bring the other work under % the scope of this License. % % \item % You may copy and distribute the Program (or a work based on it, % under Section 2) in object code or executable form under the terms of % Sections 1 and 2 above provided that you also do one of the following: % % \begin{enumerate} % % \item % % Accompany it with the complete corresponding machine-readable % source code, which must be distributed under the terms of Sections % 1 and 2 above on a medium customarily used for software interchange; or, % % \item % % Accompany it with a written offer, valid for at least three % years, to give any third party, for a charge no more than your % cost of physically performing source distribution, a complete % machine-readable copy of the corresponding source code, to be % distributed under the terms of Sections 1 and 2 above on a medium % customarily used for software interchange; or, % % \item % % Accompany it with the information you received as to the offer % to distribute corresponding source code. (This alternative is % allowed only for noncommercial distribution and only if you % received the program in object code or executable form with such % an offer, in accord with Subsection b above.) % % \end{enumerate} % % % The source code for a work means the preferred form of the work for % making modifications to it. For an executable work, complete source % code means all the source code for all modules it contains, plus any % associated interface definition files, plus the scripts used to % control compilation and installation of the executable. However, as a % special exception, the source code distributed need not include % anything that is normally distributed (in either source or binary % form) with the major components (compiler, kernel, and so on) of the % operating system on which the executable runs, unless that component % itself accompanies the executable. % % If distribution of executable or object code is made by offering % access to copy from a designated place, then offering equivalent % access to copy the source code from the same place counts as % distribution of the source code, even though third parties are not % compelled to copy the source along with the object code. % % \item % You may not copy, modify, sublicense, or distribute the Program % except as expressly provided under this License. Any attempt % otherwise to copy, modify, sublicense or distribute the Program is % void, and will automatically terminate your rights under this License. % However, parties who have received copies, or rights, from you under % this License will not have their licenses terminated so long as such % parties remain in full compliance. % % \item % You are not required to accept this License, since you have not % signed it. However, nothing else grants you permission to modify or % distribute the Program or its derivative works. These actions are % prohibited by law if you do not accept this License. Therefore, by % modifying or distributing the Program (or any work based on the % Program), you indicate your acceptance of this License to do so, and % all its terms and conditions for copying, distributing or modifying % the Program or works based on it. % % \item % Each time you redistribute the Program (or any work based on the % Program), the recipient automatically receives a license from the % original licensor to copy, distribute or modify the Program subject to % these terms and conditions. You may not impose any further % restrictions on the recipients' exercise of the rights granted herein. % You are not responsible for enforcing compliance by third parties to % this License. % % \item % If, as a consequence of a court judgment or allegation of patent % infringement or for any other reason (not limited to patent issues), % conditions are imposed on you (whether by court order, agreement or % otherwise) that contradict the conditions of this License, they do not % excuse you from the conditions of this License. If you cannot % distribute so as to satisfy simultaneously your obligations under this % License and any other pertinent obligations, then as a consequence you % may not distribute the Program at all. For example, if a patent % license would not permit royalty-free redistribution of the Program by % all those who receive copies directly or indirectly through you, then % the only way you could satisfy both it and this License would be to % refrain entirely from distribution of the Program. % % If any portion of this section is held invalid or unenforceable under % any particular circumstance, the balance of the section is intended to % apply and the section as a whole is intended to apply in other % circumstances. % % It is not the purpose of this section to induce you to infringe any % patents or other property right claims or to contest validity of any % such claims; this section has the sole purpose of protecting the % integrity of the free software distribution system, which is % implemented by public license practices. Many people have made % generous contributions to the wide range of software distributed % through that system in reliance on consistent application of that % system; it is up to the author/donor to decide if he or she is willing % to distribute software through any other system and a licensee cannot % impose that choice. % % This section is intended to make thoroughly clear what is believed to % be a consequence of the rest of this License. % % \item % If the distribution and/or use of the Program is restricted in % certain countries either by patents or by copyrighted interfaces, the % original copyright holder who places the Program under this License % may add an explicit geographical distribution limitation excluding % those countries, so that distribution is permitted only in or among % countries not thus excluded. In such case, this License incorporates % the limitation as if written in the body of this License. % % \item % The Free Software Foundation may publish revised and/or new versions % of the General Public License from time to time. Such new versions will % be similar in spirit to the present version, but may differ in detail to % address new problems or concerns. % % Each version is given a distinguishing version number. If the Program % specifies a version number of this License which applies to it and ``any % later version'', you have the option of following the terms and conditions % either of that version or of any later version published by the Free % Software Foundation. If the Program does not specify a version number of % this License, you may choose any version ever published by the Free Software % Foundation. % % \item % If you wish to incorporate parts of the Program into other free % programs whose distribution conditions are different, write to the author % to ask for permission. For software which is copyrighted by the Free % Software Foundation, write to the Free Software Foundation; we sometimes % make exceptions for this. Our decision will be guided by the two goals % of preserving the free status of all derivatives of our free software and % of promoting the sharing and reuse of software generally. % % \begin{center} % {\Large\sc % No Warranty % } % \end{center} % % \item % {\sc Because the program is licensed free of charge, there is no warranty % for the program, to the extent permitted by applicable law. Except when % otherwise stated in writing the copyright holders and/or other parties % provide the program ``as is'' without warranty of any kind, either expressed % or implied, including, but not limited to, the implied warranties of % merchantability and fitness for a particular purpose. The entire risk as % to the quality and performance of the program is with you. Should the % program prove defective, you assume the cost of all necessary servicing, % repair or correction.} % % \item % {\sc In no event unless required by applicable law or agreed to in writing % will any copyright holder, or any other party who may modify and/or % redistribute the program as permitted above, be liable to you for damages, % including any general, special, incidental or consequential damages arising % out of the use or inability to use the program (including but not limited % to loss of data or data being rendered inaccurate or losses sustained by % you or third parties or a failure of the program to operate with any other % programs), even if such holder or other party has been advised of the % possibility of such damages.} % % \end{enumerate} % % % \begin{center} % {\Large\sc End of Terms and Conditions} % \end{center} % % % \pagebreak[2] % % \section*{Appendix: How to Apply These Terms to Your New Programs} % % If you develop a new program, and you want it to be of the greatest % possible use to the public, the best way to achieve this is to make it % free software which everyone can redistribute and change under these % terms. % % To do so, attach the following notices to the program. It is safest to % attach them to the start of each source file to most effectively convey % the exclusion of warranty; and each file should have at least the % ``copyright'' line and a pointer to where the full notice is found. % % \begin{quote} % one line to give the program's name and a brief idea of what it does. \\ % Copyright (C) yyyy name of author \\ % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. % \end{quote} % % Also add information on how to contact you by electronic and paper mail. % % If the program is interactive, make it output a short notice like this % when it starts in an interactive mode: % % \begin{quote} % Gnomovision version 69, Copyright (C) yyyy name of author \\ % Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. \\ % This is free software, and you are welcome to redistribute it % under certain conditions; type `show c' for details. % \end{quote} % % % The hypothetical commands {\tt show w} and {\tt show c} should show the % appropriate parts of the General Public License. Of course, the commands % you use may be called something other than {\tt show w} and {\tt show c}; % they could even be mouse-clicks or menu items---whatever suits your % program. % % You should also get your employer (if you work as a programmer) or your % school, if any, to sign a ``copyright disclaimer'' for the program, if % necessary. Here is a sample; alter the names: % % \begin{quote} % Yoyodyne, Inc., hereby disclaims all copyright interest in the program \\ % `Gnomovision' (which makes passes at compilers) written by James Hacker. \\ % % signature of Ty Coon, 1 April 1989 \\ % Ty Coon, President of Vice % \end{quote} % % % This General Public License does not permit incorporating your program % into proprietary programs. If your program is a subroutine library, you % may consider it more useful to permit linking proprietary applications % with the library. If this is what you want to do, use the GNU Library % General Public License instead of this License. % % \end{multicols} % \end{minipage} % \end{lrbox} % % \begin{center} % \scalebox{0.33}{\usebox{\gpl}} % \end{center} % % \Finale \endinput