% \iffalse meta-comment % % Copyright (C) 2009-2013 by Elie Roux % and Khaled Hosny % (Support: .) % % This work is under the CC0 license. % % This work consists of the main source file luaotfload.dtx % and the derived files % luaotfload.sty, luaotfload.lua % % Unpacking: % tex luaotfload.dtx % % Documentation: % pdflatex 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.0 OpenType layout system} \Msg{************************************************************************} \keepsilent \askforoverwritefalse \let\MetaPrefix\relax \preamble This is a generated file. Copyright (C) 2009-2013 by by Elie Roux and Khaled Hosny (Support: .) This work is under the CC0 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/04/16 v2.2 OpenType layout system]% \documentclass{ltxdoc} \usepackage{metalogo,multicol,mdwlist,fancyvrb,xspace} \usepackage[x11names]{xcolor} % \def\primarycolor{DodgerBlue4} \def\secondarycolor{Goldenrod4} % \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}, pdfkeywords={luatex, lualatex, unicode, opentype} ]{hyperref} \usepackage{fontspec} %usepackage{unicode-math}%% broken \setmainfont[Numbers=OldStyle,Ligatures=TeX]{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} %%\definecolor{niceblue}{rgb}{0.4,0.6,1.000} \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\CONTEXT{Con\TeX t\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}} \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/04/16 v2.2} % \author{Elie Roux and Khaled Hosny\\ % Support: \email{lualatex-dev@tug.org}} % % \maketitle % % \begin{abstract} % This package is an adaptation of the \CONTEXT font loading system, providing % the ability to load \identifier{OpenType} fonts with extended font loading syntax % supporting a large selection of OpenType font features. % \end{abstract} % % \tableofcontents % % \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 as \TEX is 8-bit each font is limited to 256 % characters. % But the font world has evolved since % \TEX, and new font technologies have appeared, most notably the so called % \emphasis{smart font} technologies like \identifier{OpenType} fonts. These fonts can % contain a lot of characters, and additional functionalities 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 Indic scripts right % now. % } scripts. % They are widely deployed % and available for all modern operating systems and are becoming the de facto % standard fonts for advanced text layout. Until now the only way to use them % directly in the \TEX world was by using them with \XETEX. % % Unlike \XETEX, \LUATEX does not provide direct support for using these fonts % by default, but it provides a way to hook \LUA code in some points of the \TEX % processing; for instance, we can improve the font loading system, and text % procession, which what this package is about. % % \section{Loading fonts} % % \identifier{luaotfload} supports an extended font loading syntax which looks % like: % % \begin{center} % |\font\foo={|\meta{prefix}|:|\meta{font name}|:|\meta{font features}|}| \meta{\TEX font features} % \end{center} % % \noindent % The curly brackets are optional and are used for escaping spaces in font % names (double quotes can also used for the same purpose). % % \paragraph{Prefix} % % The \meta{prefix} can be either |file:| or |name:|, which specify whether to % use a select the font from its filename or font name, respectively. If no % prefix is specified |name:| is assumed. % % For compatibility with \XETEX, surrounding the \meta{font name} with square % brackets is synonymous to using the |file:| prefix. % % Accessing fonts by fontname allows loading system installed fonts as well as % \fileent{texmf} ones, and requires a font names database; see % Section~\ref{sec:fontdb} for more information. % % \paragraph{Font name} % % The \meta{font name} can be either a font filename or actual font name based % on the \meta{prefix} as mentioned above. % % Fonts loaded by filename may either include their absolute path in the % filesystem or consist of just the filename with a path. If no path is % specified then \identifier{kpathsea} is used to locate the font (which will % typically be in the \fileent{texmf} tree or the current directory). % % For example, % \begin{quote} % \begin{verbatim} % \font\1={file:ec-lmr10} at 10pt % \font\2={/Users/Shared/Fonts/aldus.otf} at 11pt % \font\3={name:TeX Gyre Pagella} at 9pt % \end{verbatim} % \end{quote} % % % \paragraph{Font features} % % \meta{font features} is semicolon-separated list of feature % tags\footnote{% % Cf. \url{http://www.microsoft.com/typography/otspec/featurelist.htm} % } % and font options. Font features are prepended with a |+| to turn them on and % a |-| to turn them off, alternatively you can pass |true| or |false| value to % the feature: % % |\font\test=Latin Modern Roman:+clig;-kern| % % \noindent or: % % |\font\test=Latin Modern Roman:clig=true;kern=false| % % \noindent For alternate substation features you can pass the index of the % variant you want (starting from 1) or |random| to randomly select a variant % each time an affected glyph is shown, e.g.: % % |\font\test=Latin Modern Roman:salt=1| % % \noindent Known font options include: % % \begin{description} % \item [mode] % \identifier{luaotfload} has two OpenType processing modes; \identifier{base} % and \identifier{node}. % \identifier{base} mode works by mapping OpenType features to traditional \TEX % ligature and kerning mechanisms, thus supporting only non-contextual % substitutions and kerning pairs, but is slightly faster. \identifier{node} % works by direct processing of the node list at \LUA end and have more wide % support of OpenType features but can be slow especially with complex fonts % and can't be used in math mode. % % By default \identifier{node} mode is used, and you have to manually force % \identifier{base} mode when needed, e.~g. for math fonts. % % \item [script] % OpenType script string,\footnote{% % Cf. \url{http://www.microsoft.com/typography/otspec/scripttags.htm}. % } % default value is \identifier{dlft}. % Some fonts don't assign features to the |dflt| % script, in which case the script need to be set explicitly. % % \item [language] \hfill \\ % OpenType language string,\footnote{% % Cf. \url{http://www.microsoft.com/typography/otspec/languagetags.htm}. % } % default value is \identifier{latn}. % % \item [featurefile] \hfill \\ % a comma-separated list of feature files to be applied to the font. Feature % files are textual representation of OpenType tables and can be used to extend % OpenType features of the font on fly. Features defined in a feature file, % after being applied to the font, can be enabled/disabled like any other % feature. The syntax is documented in Adobe's OpenType Feature File % Specification.\footnote{% % Cf. \url{http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html} % } % % For example, to set a |tkrn| feature from |mykern.fea| file: % % |\font\test=Latin Modern Roman:featurefile=mykern.fea;+tkrn| % % \item [color] \hfill \\ % font color, defined as a triplet of two-digit hexadecimal RGB values, with % optionally another value for the transparency (where |00| is completely % transparent and |FF| is opaque.) % % For example, to set text in semitransparent red: % % |\font\test=Latin Modern Roman:color=FF0000BB| % % \item [protrusion \& expansion] \hfill \\ % Both keys control microtypographic features of the font, namely glyph % protrusion and expansion. The value of the key is the name of predefined \LUA % tables of protrusion and expansion values; see the end of % \fileent{otfl-fonts-ext.lua} % file for an example of such tables. The only predefined value is % \identifier{default}. % % For example, to enable default protrusion\footnote{% % You also need to set % \texmacro{pdfprotrudechars}|=2| % \texmacro{pdfadjustspacing}|=2| % to activate protrusion and expansion, respectively. % See % \href{http://mirrors.ctan.org/systems/pdftex/manual/pdftex-a.pdf}% % {\PDFTEX manual} % for details. % }: % % |\font\test=Latin Modern Roman:protrusion=default| % \end{description} % % \subparagraph{Non-standard font features} % \identifier{luaotfload} defines some additional font feature not defined in % OpenType, currently three features are defined: % % \begin{itemize*} % % \item \identifier{anum}: % replaces European numbers with eastern Arabic numbers or Persian % numbers, depending on the value of \identifier{language}. % \item \identifier{tlig}: % applies legacy \TEX ligatures: % |``|, |''|, |`|, |'|, |"|, |--|, |---|, |!`| and |?`|.% % \footnote{% % For \XETEX users: this is the equivalent of the assignment % \verb|mapping=text-tex| using \XETEX's input remapping feature. % } % % \end{itemize*} % % % % \section{Font names database} % \label{sec:fontdb} % % As introduced in the previous section, \identifier{luaotfload} uses a database to % keep track of fonts available to \LUATEX. Using this database, fonts can be % loaded by font name as well as filename. % % When \identifier{luaotfload} is asked to load a font by font name, it will check % if font names database exists and load it, or generate a new database if non % exists. This is all done automatically without user intervention. When the % asked font is missing from the database, it will attempt to update the % database and try to find the font again, so that the user can install new % fonts without worrying about manually updating the database. % % However, it is sometimes desirable to update the database manually, so % \identifier{luaotfload} provides a |mkluatexfontdb| utility to manually update % the database. |mkluatexfontdb| is a lua script that can be either run % directly or as an argument to |texlua|, depending on your system.\footnote{% % On \abbrev{MS} \identifier{Windows} it can be run either by calling the % wrapper application |mkluatexfontdb.exe| or with % |texlua.exe mkluatexfontdb.lua|. % } % % The first time the database is generated may take quite some time to process % every font on your computer. This is particularly noticeable if it occurs % during a typesetting run. Subsequent runs to update the database will be % quite fast, however. % % \identifier{luaotfload} will parse standard places for fonts in your system to % build the font database. On Linux, it will read |fontconfig| configuration % files to find the font locations; on Windows and Mac~OS~X, it will search in % the standard font locations, |%WINDIR%\Fonts| in Windows and % |~/Library/Fonts|, |/Library/Fonts|, |/System/Library/Fonts|, and % |/Network/Library/Fonts| in Mac~OS~X. % % If you do not wish the standard font locations be searched by default but % would rather specify the exact locations in which to find your fonts, set the % |OSFONTDIR| environment variable instead. When this variable is set, only the % specified directories will be searched. % % |mkluatexfontdb.lua --help| provides a brief summary of the functionality of % the script and includes some advanced options that we have not mentioned % here. % % \subsection{Blacklisting fonts} % % Some fonts are problematic in \LUATEX, if you found that your document takes % too long to compile, or eats all the free memory, you can find the culprit % file by running |mkluatexfontdb| utility with |-v| option to see which font % file it is stuck with. You can then instruct \identifier{luaotfload} to ignore % this font by adding it to the blacklist configuration file. % % Simply, create a file named |otfl-blacklist.cnf| and added the to be % blacklisted files, one per line. Then put the file some where \identifier{kpse} % can find. You can either use the base name or the full path. Any thing after % a |%| sign is ignored. \identifier{luaotfload} reads all files named named % |otfl-blacklist.cnf|, so you can add your own fonts to the global blacklist % by creating a local file |otfl-blacklist.cnf| with the entries you need. You % can also remove a font from this blacklist by prepending the name with a dash % (|-|). % % \begin{verbatim} % % example otf-blacklist.cnf % /Library/Fonts/GillSans.ttc % luaotfload ignores this font % -/Library/Fonts/Optima.ttc % it is usable again, even if it % % is blacklisted somewhere else % \end{verbatim} % % \section{Used \CONTEXT files} % % This package is a wrapper for several files taken from the \CONTEXT macro % package. The philosophy is to let \CONTEXT do all the implementation and % update these files from time to time. So we try not to modify the files taken % from \CONTEXT as far as possible, but we changed their names to prevent name % clashes. % % The \CONTEXT files are renamed by adding the prefix |otfl-| to them (|otfl| % as |OTF L|oad). The files are: % % \begin{multicols}{3} % \begin{itemize*} % \item |data-con.lua| % \item |font-cid.lua| % \item |font-con.lua| % \item |font-def.lua| % \item |font-ini.lua| % \item |font-map.lua| % \item |font-ota.lua| % \item |font-otb.lua| % \item |font-otc.lua| % \item |font-otf.lua| % \item |font-oti.lua| % \item |font-otn.lua| % \item |node-inj.lua| % \item |luatex-fonts-cbk.lua| % \item |luatex-fonts-enc.lua| % \item |luatex-fonts-ext.lua| % \item |luatex-fonts-lua.lua| % \item |luatex-fonts-tfm.lua| % \item |luatex-basics-gen.lua| % \item |luatex-basics-nod.lua| % \item |font-age.lua|\footnote{% % Not renamed as it is loaded directly from % |fonts-enc.lua|. % } % \end{itemize*} % \end{multicols} % % The following files have been written for this package: % \begin{itemize*} % \item |otfl-font-clr.lua| % \item |otfl-font-nms.lua| % \item |otfl-luat-ovr.lua| % \item |otfl-font-ltx.lua|\footnote{% % A heavily modified version of |luatex-fonts-def.lua|. % } % \end{itemize*} % % \section{Troubleshooting} % % If you encounter problems with some fonts, please first update to the latest % version of this package before reporting a bug, as this package is under % active development. % % A very common problem is the lack of features for some OpenType fonts even % when specified. It can be related to the fact that some fonts do not provide % features for the |dflt| script, which is the default one in this package, so % you may have to specify the script in the command line, for example: % % |\font\test=file:MyFont.otf:script=latn;+liga;| % % \part{\fileent{luaotfload.lua}} % % \iffalse %<*lua> % \fi % \begin{macrocode} module("luaotfload", package.seeall) luaotfload.module = { name = "luaotfload", version = 2.2, date = "2013/04/15", description = "OpenType layout system.", author = "Elie Roux & Hans Hagen", copyright = "Elie Roux", license = "CC0" } local luatexbase = luatexbase local type, next, dofile = type, next, dofile local stringfind = string.find local find_file = kpse.find_file 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 % \end{macrocode} % % No final decision has been made on how to handle font definition. At % the moment, there are three candidates: The \identifier{generic} % callback as hard-coded in the font loader, the \identifier{old} % wrapper, and a simplified version of the latter (\identifier{patch}) % that does nothing besides applying font patches. % % \begin{macrocode} luaotfload.font_definer = "patch" --- | “generic” | “old” local error, warning, info, log = luatexbase.provides_module(luaotfload.module) % \end{macrocode} % % This is a necessary initalization in order not to rebuild an existing % font. % Maybe 600 should be replaced by \texmacro{pdfpkresolution} %% (why?) % or \luafunction{texconfig.pk_dpi} (and it should be replaced % dynamically), but we don't have access (yet) to the % \identifier{texconfig} table, so we let it be 600. % Anyway, it does still work fine even if \texmacro{pdfpkresolution} is % changed. % % \begin{macrocode} kpse.init_prog("", 600, "/") % \end{macrocode} % % We set the minimum version requirement for \LUATEX to v0.74, as it was % the first version to include version 5.2 of the \LUA interpreter. % % \begin{macrocode} local luatex_version = 74 if tex.luatexversion < luatex_version then warning("LuaTeX v%.2f is old, v%.2f is recommended.", tex.luatexversion/100, luatex_version /100) end % \end{macrocode} % % \subsection{Module loading} % % We load the files imported from \CONTEXT with this function. % It automatically prepends the prefix \fileent{otfl-} to its argument, % so we can refer to the files with their actual \CONTEXT name. % % \begin{macrocode} local fl_prefix = "otfl" -- “luatex” for luatex-plain local loadmodule = function (name) local tofind = fl_prefix .."-"..name local found = find_file(tofind,"tex") if found then log("loading file %s.", found) dofile(found) else error("file %s not found.", tofind) end end % \end{macrocode} % % Virtual fonts are resolved via a callback. % \luafunction{find_vf_file} derives the name of the virtual font file % from the filename. % (NB: \CONTEXT handles this likewise in \fileent{font-vf.lua}.) % % \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 = find_file(name, "ovf") if not fullname then --fullname = find_file(file.removesuffix(name), "ovf") fullname = find_file(lpegmatch(p_removesuffix, name), "ovf") end if fullname then log("loading virtual font file %s.", fullname) end return fullname end --[[-- keep --]] --- from Hans (all merged): --- file name modified include name --- × basics-gen.lua t luat-basics-gen --- × font-def -> fonts-def t luatex-font-def (there’s also the normal font-def!) --- × fonts-enc f luatex-font-enc --- × fonts-ext t luatex-fonts-ext --- × fonts-lua f luatex-fonts-lua --- fonts-tfm f luatex-fonts-tfm --- × fonts-cbk f luatex-fonts-lua --- from Hans (unmerged): --- font-otc.lua -> otfl-font-otc.lua --- from luaotfload: --- otfl-luat-ovr.lua -- override some luat-dum functions --- otfl-font-clr.lua --- otfl-font-ltx.lua --- otfl-font-nms.lua --- otfl-font-pfb.lua -- ? --[[-- new --]] --- basics-nod (merged as fonts-nod !) --- fonts-demo-vf-1.lua --- fonts-syn (merged) --[[-- merged, to be dropped --]] --- otfl-data-con.lua --- otfl-font-cid.lua --- otfl-font-con.lua --- otfl-font-ini.lua --- otfl-font-ota.lua --- otfl-font-otb.lua --- otfl-font-otf.lua --- otfl-font-oti.lua --- otfl-font-otn.lua % \end{macrocode} % % % \subsection{Preparing the Font Loader} % We treat the fontloader as a black box so behavior is consistent % between formats. % The wrapper file is \fileent{otfl-fonts.lua} which we imported from % \href{http://standalone.contextgarden.net/current/context/experimental/tex/generic/context/luatex/}{\LUATEX-Plain}. % It has roughly two purposes: % % \begin{enumerate} % % \item insert the functionality required for fontloader; and % % \item put it in place via the respective callbacks. % % \end{enumerate} % % How the first step is executed depends on the presence on the % \emph{merged font loader code}. % In \identifier{luaotfload} this is contained in the file % \fileent{otfl-fonts-merged.lua}. % If this file cannot be found, the original libraries from \CONTEXT of % which the merged code was composed are loaded instead. % % Hans provides two global tables to control the font loader: % % \begin{itemize} % \item \luafunction{generic_context}: % encapsulation mechanism, callback functions % \item \luafunction{non generic_context}: % customized code insertion % \end{itemize} % % With \luafunction{non_generic_context} we can tailor the font loader % insertion to our file naming habits (key \luafunction{load_before}). % Additionally, \luafunction{skip_loading} can be unset to force loading % of the original libraries as though the merged code was absent. % Another key, \luafunction{load_after} is called at the time when the % font loader is actually inserted. % In combination with the option \luafunction{no_callbacks_yet} in % \luafunction{generic_context}, we can insert our own, % \identifier{luatexbase}-style callback handling here. % % \begin{macrocode} if not _G. generic_context then _G. generic_context = { } end if not _G.non_generic_context then _G.non_generic_context = { } end local generic_context = generic_context local non_generic_context =non_generic_context generic_context.no_callbacks_yet = true _G.non_generic_context = { luatex_fonts = { load_before = "otfl-fonts-merged.lua", -- load_after = nil, --- TODO, this is meant for callbacks skip_loading = true, }} % \end{macrocode} % % 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. % % \begin{macrocode} local trapped_register = callback.register callback.register = dummy_function % \end{macrocode} % % Now that things are sorted out we can finally load the fontloader. % % \begin{macrocode} loadmodule"fonts.lua" % \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{otfl@}” to % avoid name clashes. % % \begin{macrocode} do local new_attribute = luatexbase.new_attribute local the_attributes = luatexbase.attributes _G.attributes = _G.attributes or { } _G.attributes.private = function (name) local attr = "otfl@" .. name local number = the_attributes[attr] if not number then number = new_attribute(attr) end return number end end % \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 \emph{node processor}. % % \begin{macrocode} add_to_callback("pre_linebreak_filter", generic_context.callback_pre_linebreak_filter, "luaotfload.node_processor", 1) add_to_callback("hpack_filter", generic_context.callback_hpack_filter, "luaotfload.node_processor", 1) add_to_callback("find_vf_file", find_vf_file, "luaotfload.find_vf_file") loadmodule"font-otc.lua" -- TODO check what we can drop from otfl-features loadmodule"lib-dir.lua" -- required by font-nms loadmodule"luat-ovr.lua" if fonts and fonts.readers.tfm then -------------------------------------------------------------------- --- OFM; read this first -------------------------------------------------------------------- --- I can’t quite make out whether this is still relevant --- as those ofm fonts always fail, even in the 2011 version --- (mktexpk: don't know how to create bitmap font for omarabb.ofm) --- the font loader appears to read ofm like tfm so if this --- hack was supposed achieve that, we should excise it anyways fonts.readers.ofm = fonts.readers.tfm fonts.handlers.ofm = fonts.handlers.tfm --- empty anyways fonts.formats.ofm = fonts.formats.tfm --- “type1” --- fonts.readers.sequence[#fonts.readers.sequence+1] = "ofm" -------------------------------------------------------------------- end % \end{macrocode} % % % Now we load the modules written for \identifier{luaotfload}. % % \begin{macrocode} loadmodule"font-pfb.lua" --- new in 2.0, added 2011 loadmodule"font-nms.lua" loadmodule"font-clr.lua" loadmodule"font-ltx.lua" --- new in 2.0, added 2011 % \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} % % % This is a wrapper for the imported font loader. % As of 2013, everything it does appear to be redundand, so we won’t use % it unless somebody points out a cogent reason. % Nevertheless, it has been adapted to work with the current structure of % font data objects and will stay here for reference / until breakage is % reported. % % \emphasis{TODO} % This one also enables patching fonts. % The current fontloader apparently comes with a dedicated mechanism for % that already: enhancers. % How those work remains to be figured out. % % \begin{macrocode} local define_font_wrapper = function (...) --- we use “tfmdata” (not “fontdata”) for consistency with the --- font loader local tfmdata = fonts.definers.read(...) if type(tfmdata) == "table" and tfmdata.shared then local metadata = tfmdata.shared.rawdata.metadata local mathdata = metadata.math --- do all fonts have this field? if mathdata then local mathconstants = { } --- why new hash, not modify in place? local units_per_em = metadata.units_per_em local size = tfmdata.size for k,v in next, mathdata do --- afaics this is alread taken care of by --- definers.read if stringfind(k, "Percent") then -- keep percent values as is print(k,v) mathconstants[k] = v else mathconstants[k] = v / units_per_em * size end end --- for \overwithdelims --- done by definers.read as well mathconstants.FractionDelimiterSize = 1.01 * size --- fontloader has 2.4 × size mathconstants.FractionDelimiterDisplayStyleSize = 2.39 * size tfmdata.MathConstants = mathconstants end call_callback("luaotfload.patch_font", tfmdata) end return tfmdata end % \end{macrocode} % % % \subsection{\CONTEXT override} % % We provide a simplified version of the original font definition % callback. % % \begin{macrocode} local read_font_file = fonts.definers.read local patch_defined_font = function (...) local tfmdata = read_font_file(...)-- spec -> size -> id -> tmfdata if type(tfmdata) == "table" then call_callback("luaotfload.patch_font", tfmdata) end return tfmdata end caches.compilemethod = "both" reset_callback("define_font") % \end{macrocode} % % Finally we register the callbacks % % \begin{macrocode} if luaotfload.font_definer == "old" then add_to_callback("define_font", define_font_wrapper, "luaotfload.define_font", 1) elseif luaotfload.font_definer == "generic" then add_to_callback("define_font", generic_context.callback_define_font, "luaotfload.define_font", 1) elseif luaotfload.font_definer == "patch" then add_to_callback("define_font", patch_defined_font, "luaotfload.define_font", 1) end loadmodule"features.lua" -- vim:tw=71:sw=4:ts=4:expandtab % \end{macrocode} % % \iffalse % % \fi % % \part{\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/04/16 v2.2 OpenType layout system] \RequirePackage{luatexbase} \fi \RequireLuaModule{lualibs} \RequireLuaModule{luaotfload} \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/04/16 v2.2 OpenType layout system] \RequirePackage{luatexbase} \fi % \end{macrocode} % % %% As soon as we feel the need this file will file will contain an extension % %% to the standard plain register allocation. For the moment we stick to a % %% rather dumb attribute allocator. We start at 256 because we don't want % %% any interference with the attributes used in the font handler. % %%\newcount \lastallocatedattribute \lastallocatedattribute=255 % %%\def\newattribute#1% % %% {\global\advance\lastallocatedattribute 1 % %% \attributedef#1\lastallocatedattribute} % % \begin{macrocode} \RequireLuaModule{luaotfload} \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