summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/doc/luatex/luaotfload/NEWS22
-rw-r--r--Master/texmf-dist/doc/luatex/luaotfload/README95
-rw-r--r--Master/texmf-dist/doc/luatex/luaotfload/luaotfload.pdfbin271792 -> 313280 bytes
-rwxr-xr-xMaster/texmf-dist/scripts/luaotfload/mkluatexfontdb.lua42
-rw-r--r--Master/texmf-dist/source/luatex/luaotfload/Makefile7
-rw-r--r--Master/texmf-dist/source/luatex/luaotfload/luaotfload.dtx699
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/luaotfload.lua18
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty16
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-data-con.lua2
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-def.lua6
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-dum.lua25
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ini.lua60
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-map.lua4
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-nms.lua562
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otc.lua29
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otf.lua63
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otn.lua49
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ott.lua4
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-tfm.lua27
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-font-xtx.lua1
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-luat-ovr.lua12
-rw-r--r--Master/texmf-dist/tex/luatex/luaotfload/otfl-node-res.lua2
22 files changed, 1272 insertions, 473 deletions
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/NEWS b/Master/texmf-dist/doc/luatex/luaotfload/NEWS
index 129a2b0e5fd..a09e8ef9778 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/NEWS
+++ b/Master/texmf-dist/doc/luatex/luaotfload/NEWS
@@ -1,6 +1,24 @@
- History of the luaotfload bundle
+Change History
+--------------
-Currrent git, luaotfload v1.07:
+2010/05/28, luaotfload v1.08a:
+ * revert experimental code that was committed by mistake
+
+2010/05/28, luaotfload v1.08:
+ * fix misc. bugs with system fonts scanning
+ * parse fontconfig configuration directly, no longer dependant on 'fc-list'
+ * now if no font names database is found, luaotfload will generate it, also
+ it will force an update of the database if the asked font can not be
+ found
+ * avoid loading non-tfm fonts when the user asks for tfm font
+ * update the documentation
+ * blacklist .ttc and LastResort font on mac.
+ * sync with ConTeXt beta 2010.05.22
+ * fix attribute handling
+ * clarify license
+ * misc. bug fixes
+
+2010/05/10, luaotfload v1.07:
* using the new luatexbase package
* synchronizing with latest ConTeXt stable 2010.05.08
* adding support for microtypography
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/README b/Master/texmf-dist/doc/luatex/luaotfload/README
index 94096480e7a..bf6b0a8fc63 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/README
+++ b/Master/texmf-dist/doc/luatex/luaotfload/README
@@ -1,12 +1,33 @@
- The luaotfload generic package
+ The luaotfload package
+Luaotfload is an adaptation of the ConTeXt font loading system for Plain and
+LaTeX. It allows OpenType fonts to be loaded with OpenType features accessible
+through the XeTeX font syntax.
-luaotfload is the adaptation of the ConTeXt OTF loading system for Plain and
-LaTeX. It allows to open OTF fonts with almost all features available through
-the XeTeX font syntax.
+It may be loaded in Plain LuaTeX with "\input luaotfload.sty" and in LuaLaTeX
+with "\usepackage{luaotfload}". LuaLaTeX users may be interested in the
+fontspec package which provides a high-level interface to the functionality
+provided by this package.
+
+Please see the documentation luaotfload.pdf for more information.
+
+This package is developed on <http://github.com/khaledhosny/luaotfload>.
+Please report bugs at the Github address above.
+
+Discussion of development for LuaLaTeX is held in the lualatex-dev mailing
+list. See <http://www.tug.org/mailman/listinfo/lualatex-dev> to join or to
+view the archives.
+
+
+Responsible Persons
+-------------------
+
+The following people have contributed to this package.
+
+Khaled Hosny <khaledhosny@eglug.org>
+Elie Roux <elie.roux@telecom-bretagne.eu>
+Will Robertson <will.robertson@latex-project.org>
-This package is developed on <http://github.com/khaledhosny/luaotfload>, see the
-'NEWS' file for version history.
Installation
@@ -17,10 +38,10 @@ Here are the recommended installation methods (preferred first).
1. If you are using TeX Live 2008 or later, use 'tlmgr install luaotfload'.
Alternatively, try your (TeX or Linux) distribution's package management system.
-2. a. Grab luaotfload.tds.zip on the CTAN.
+2. a. Download luaotfload.tds.zip from CTAN.
b. Unzip it at the root of one or your TDS trees.
c. You may need to update some filename database after, see your TeX
-distribution's manual for details.
+ distribution's manual for details.
3. a. Grab the sources from CTAN or github.
b. Run 'make install TEXMFROOT=/path/to/texmf'.
@@ -32,6 +53,8 @@ distribution's manual for details.
Manifest
--------
+The following files are part of the luaotfload package.
+
Source files:
luaotfload.dtx single file source & doc for the package
mkluatexfontdb.lua script using otfl-font-nms.lua
@@ -66,28 +89,15 @@ Derived files:
luaotfload.sty TeX & LaTeX package
luaotfload.lua Lua code for the package
+
License
-------
-This work is distributed under the GNU GPLv2 license. Please see COPYING file
-for more details about the license.
-
-The files otfl-*.lua are under the GNU GPLv2 license. Their legal notice
-starts by:
-
-"
-Copyright 2008 PRAGMA ADE / ConTeXt Development Team
-"
-
-for otf-*.lua files except otfl-font-clr.lua and otfl-luat-ovr.lua, and
-
-"
-Copyright 2010 Luaotfload Development Team
-"
-
-for otfl-font-clr.lua, otfl-font-nms and otfl-luat-ovr.lua, and continues by:
+The luaotfload bundle is distributed under the GNU GPLv2 license:
+ <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
+This license requires the license itself to be distributed with the work.
+It may be located within the documentation luaotfload.pdf.
-"
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
@@ -98,22 +108,27 @@ 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.
-"
+All non-ConTeXt source files in this bundle,
+ luaotfload.dtx
+ mkluatexfontdb.lua
+ otfl-data-con.lua
+ otfl-font-clr.lua
+and derived files
+ luaotfload.pdf
+ luaotfload.sty
+ luaotfload.lua
+are copyright 2010 by the luaotfload development team (see above).
+These files may be modified and distributed under the terms and conditions
+of the CC0 license: <http://creativecommons.org/publicdomain/zero/1.0>
+The source files otfl-luat-ovr.lua and otfl-luat-nms.lua are copyright 2010 by
+the luaotfload development team and are derived from ConTeXt sources. They are
+distributed under the terms and conditions of the GNU General Public License
+v2.
-The file luaotfload.dtx and the derived files
- luaotfload.pdf
- luaotfload.sty
- luaotfload.lua
-
-as well as the file mkluatexfontdb.lua are under the CC0 license. You can find
-the CC0 license full text at
+The ConTeXt files otfl-*.lua (as indicated above) are distributed under the
+terms and conditions of the GNU General Public License v2. The contents of
+these files is copyright 2008 by PRAGMA ADE and the ConTeXt Development Team.
-http://creativecommons.org/publicdomain/zero/1.0/legalcode
-and a FAQ at
-http://wiki.creativecommons.org/CC0
diff --git a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.pdf b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.pdf
index a85639692e6..1cc623b7754 100644
--- a/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.pdf
+++ b/Master/texmf-dist/doc/luatex/luaotfload/luaotfload.pdf
Binary files differ
diff --git a/Master/texmf-dist/scripts/luaotfload/mkluatexfontdb.lua b/Master/texmf-dist/scripts/luaotfload/mkluatexfontdb.lua
index 161080d740d..5eac9ae06af 100755
--- a/Master/texmf-dist/scripts/luaotfload/mkluatexfontdb.lua
+++ b/Master/texmf-dist/scripts/luaotfload/mkluatexfontdb.lua
@@ -16,11 +16,10 @@ require("alt_getopt")
local name = 'mkluatexfontdb'
local version = '1.07' -- same version number as luaotfload
-mkluatexfontdb = { } -- just for now, elie is rewriting it anyway
local names = fonts.names
-- the directory in which the database will be saved, can be overwritten
-mkluatexfontdb.directory = names.path.localdir
+local output_directory = names.path.localdir
local log = logs.report
@@ -43,6 +42,24 @@ Valid options:
-V --version print version and exit
-h --help print this message
+Fonts are found on Windows or Linux with fontconfig (i.e., using fc-list).
+
+On Mac OS X, only fonts located in the following standard font locations are
+included in the font database:
+ ~/Library/Fonts /Library/Fonts
+ /System/Library/Fonts /Network/Library/Fonts
+In particular, fonts installed in other locations with "Font Book" will not
+be available.
+
+Rather than using fontconfig or, in Mac OS X, searching the default font
+locations, you may specify where fonts are located by setting the OSFONTDIR
+environment variable. Doing so will override the use of fontconfig or
+scanning the system font locations. If you wish to continue to include them
+while also including other font locations, simply include them in the list.
+For example (using a bash shell),
+
+ export OSFONTDIR='/path/to/other/fonts:/Users/will/Library/Fonts:...'
+
The output database file is named otfl-fonts.lua. By default it is placed
in $TEXMFVAR/luatex/generic/luaotfload/names.
]], name))
@@ -112,36 +129,28 @@ local function process_cmdline()
help_msg()
os.exit(0)
elseif v == "d" then
- mkluatexfontdb.directory = optarg [i]
+ output_directory = optarg [i]
elseif v == "f" then
force_reload = 1
elseif v == "fc-cache" then
run_fc_cache = 1
elseif v == "sys" then
- mkluatexfontdb.directory = names.path.systemdir
+ output_directory = names.path.systemdir
end
end
if string.match(arg[0], '-sys') then
- mkluatexfontdb.directory = names.path.systemdir
+ output_directory = names.path.systemdir
end
- mkluatexfontdb.directory = fonts.path_normalize(mkluatexfontdb.directory)
+ output_directory = fonts.path_normalize(output_directory)
names.set_log_level(log_level)
end
process_cmdline()
do_run_fc_cache(run_fc_cache)
--- the status table is containing correspondances between absolute path and last modification
--- timestamp, it's uses to save time during update, by not reparsing unchanged fonts.
-local status = nil
-local status_file = mkluatexfontdb.directory .. "/otfl-names-status.lua"
-if not force_reload and file.isreadable(status_file) then
- status = dofile(status_file)
-end
-
local function generate(force)
log("generating font names database.")
- local savepath = mkluatexfontdb.directory
+ local savepath = output_directory
if not lfs.isdir(savepath) then
log("creating directory %s", savepath)
dir.mkdirs(savepath)
@@ -163,11 +172,10 @@ local function generate(force)
else
fontnames = nil
end
- fontnames, status = names.update(fontnames, status, force)
+ fontnames = names.update(fontnames, force)
log("%s fonts in the database", #fontnames.mappings)
io.savedata(savepath, table.serialize(fontnames, true))
log("saved font names database in %s\n", savepath)
- io.savedata(status_file, table.serialize(status, true))
end
generate(force_reload)
diff --git a/Master/texmf-dist/source/luatex/luaotfload/Makefile b/Master/texmf-dist/source/luatex/luaotfload/Makefile
index 6a1363073dc..488537445c3 100644
--- a/Master/texmf-dist/source/luatex/luaotfload/Makefile
+++ b/Master/texmf-dist/source/luatex/luaotfload/Makefile
@@ -4,15 +4,16 @@ NAME = luaotfload
DOC = $(NAME).pdf
DTX = $(NAME).dtx
OTFL = $(wildcard otfl-*.lua)
+SCRIPT = mkluatexfontdb.lua
# Files grouped by generation mode
COMPILED = $(DOC)
UNPACKED = luaotfload.sty luaotfload.lua
GENERATED = $(COMPILED) $(UNPACKED)
-SOURCE = $(DTX) $(OTFL) README Makefile NEWS mkluatexfontdb.lua
+SOURCE = $(DTX) $(OTFL) README Makefile NEWS $(SCRIPT)
# Files grouped by installation location
-SCRIPTFILES = mkluatexfontdb.lua
+SCRIPTFILES = $(SCRIPT)
RUNFILES = $(UNPACKED) $(OTFL)
DOCFILES = $(DOC) README NEWS
SRCFILES = $(DTX) Makefile
@@ -23,7 +24,7 @@ ALL_FILES = $(GENERATED) $(SOURCE)
# Installation locations
FORMAT = luatex
-SCRIPTDIR = $(TEXMFROOT)/scripts/mkluatexfontdb
+SCRIPTDIR = $(TEXMFROOT)/scripts/$(NAME)
RUNDIR = $(TEXMFROOT)/tex/$(FORMAT)/$(NAME)
DOCDIR = $(TEXMFROOT)/doc/$(FORMAT)/$(NAME)
SRCDIR = $(TEXMFROOT)/source/$(FORMAT)/$(NAME)
diff --git a/Master/texmf-dist/source/luatex/luaotfload/luaotfload.dtx b/Master/texmf-dist/source/luatex/luaotfload/luaotfload.dtx
index 8c2de488978..bb2bd3eab1d 100644
--- a/Master/texmf-dist/source/luatex/luaotfload/luaotfload.dtx
+++ b/Master/texmf-dist/source/luatex/luaotfload/luaotfload.dtx
@@ -1,6 +1,7 @@
% \iffalse meta-comment
%
-% Copyright (C) 2009 by Elie Roux <elie.roux@telecom-bretagne.eu>
+% Copyright (C) 2009-2010 by Elie Roux <elie.roux@telecom-bretagne.eu>
+% and Khaled Hosny <khaledhosny@eglug.org>
%
% This work is under the CC0 license.
%
@@ -34,7 +35,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: luaotfload 2010/05/10 v1.07 ConTeXt font loading system}
+\Msg{* Package: luaotfload 2010/05/28 v1.08a ConTeXt font loading system}
\Msg{************************************************************************}
\keepsilent
@@ -45,7 +46,8 @@
\preamble
This is a generated file.
-Copyright (C) 2009 by Elie Roux <elie.roux@telecom-bretagne.eu>
+Copyright (C) 2009-2010 by by Elie Roux <elie.roux@telecom-bretagne.eu>
+ and Khaled Hosny <khaledhosny@eglug.org>
This work is under the CC0 license.
@@ -100,7 +102,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{luaotfload.drv}%
- [2010/05/10 v1.07 ConTeXt font loading system]%
+ [2010/05/28 v1.08a ConTeXt font loading system]%
\documentclass{ltxdoc}
\usepackage{metalogo,multicol,mdwlist,fancyvrb}
\usepackage[colorlinks=true]{hyperref}
@@ -138,100 +140,118 @@ and the derived files
% \GetFileInfo{luaotfload.drv}
%
% \title{The \textsf{luaotfload} package}
-% \date{2010/05/10 v1.07}
-% \author{ Elie Roux \footnote{\texttt{elie.roux@telecom-bretagne.eu}}
-% \and Khaled hosny \footnote{\texttt{khaledhosny@eglug.org}}}
+% \date{2010/05/28 v1.08a}
+% \author{ Elie Roux\footnote{\texttt{elie.roux@telecom-bretagne.eu}}
+% \and Khaled Hosny\footnote{\texttt{khaledhosny@eglug.org}}}
%
% \maketitle
%
% \begin{abstract}
-% Adaptation of \ConTeXt\ font loading system, providing the ability to load
-% \textsf{OpenType} fonts with a lot of features, and extended font loading
-% syntax.
+% This package is an adaptation of the \ConTeXt\ font loading system,
+% providing the ability to load \textsf{OpenType} fonts with extended font
+% loading syntax supporting a large selection of OpenType font features.
% \end{abstract}
%
% \tableofcontents
%
-% \section{Documentation}
+% \section{Introduction}
%
-% \subsection{Introduction}
+% Font management and installation has always been painful with \TeX.
+% A lot of files are needed for one font (tfm, pfb, map, fd, 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 \emph{smart font} technologies like
+% \textsf{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 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.
%
-% Font management and installation has always been painful with \TeX\ (and
-% even more with \LaTeX). A lot of files are needed for one font (tfm, pfb,
-% map, fd, vf), and they are limited to 256 characters. But the font world has
-% evolved since, and new standard types of fonts have appeared, like
-% \textsf{TrueType} and \textsf{OpenType} fonts. These fonts can contain a lot
-% of characters, and have some functionalities (ligatures, old-style numbers,
-% small capitals, etc.). They are everywhere, as the system fonts and most
-% modern text softwares fonts are of this type. Until now the (almost) only
-% way to use them with \TeX\ was to use 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.
%
-% Unlike \XeTeX , \LuaTeX\ does not provide facilities for these fonts by
-% default, but it provides a way to hook lua code in some points of the \TeX\
-% algorithm, for instance we can improve the font loading system; this is what
-% we do in this package.
+% \section{Loading fonts}
%
-% This package is quite low-level, and should be loaded directly in the macro
-% package, like it is in \ConTeXt. Sadly, Plain and \LaTeX\ are frozen and
-% it's even impossible to adapt them to the new engines.
-%
-% \subsection{Loading fonts}
-%
-% \textsf{luaotfload} supports an extended font loading syntax which looks like:
+% \textsf{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}
%
-% The curly brackets are optional and are used for escaping spaces in font names
-% (\XeTeX-like double quotes can also used for the same purpose).
+% \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}
%
-% Can be either \texttt{file:} or \texttt{name:} and are used to select between
-% filename based or font name based search mechanisms.
-% Loading fonts based on filename is restricted to files found by
-% \textsf{kpathsea} (typically in the \textsc{texmf} tree). Surrounding font
-% name with square brackets is synonym to using \texttt{file:} prefix (for
-% compatibility with \XeTeX).
-% This is usually used for loading old \textsc{tfm} fonts.
-% Accessing fonts by fontname allows loading system installed fonts as well as
-% \textsc{texmf} ones, and requires a font names database that can be generated
-% using the bundled |mkluatexfontdb.lua| script.
-% \footnote{run |mkluatexfontdb.lua --help| for help and usage information}
+% The \meta{prefix} be either \texttt{file:} or \texttt{name:}, which specify
+% whether to use a select the font from its filename or font name,
+% respectively. If no prefix is specified, then \texttt{file:} is assumed.
%
-% If no prefix is specified, then \texttt{file:} is assumed.
+% For compatibility with \XeTeX, surrounding the \meta{font name}
+% with square brackets is synonymous to using the \texttt{file:} prefix.
+%
+% Accessing fonts by fontname allows loading system installed fonts as well as
+% \textsc{texmf} ones, and requires a font names database that must be
+% pre-generated; see Section~\ref{sec:fontdb} for more information.
%
% \paragraph{Font name}
%
-% Font name can be either a font filename or actual font name; based on the
-% prefix specified.
+% 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 \textsf{kpathsea} is used to locate the font
+% (which will typically be in the \textsc{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}
%
-% Font features are a semicolon separated list of items, which are either
+% \meta{font features} are a list of items separated by semi-colons,
+% which are either
% |key=value| font parameters, or switches to enable/disable certain font
-% features, in the form of |+feat|/|-feat|.
+% features in the form of |+feat|/|-feat|.
% The supported keys are:
% \begin{description}
% \item [mode] \hfill \\
-% \textsf{luaotfload} has two OpenType processing modes; \texttt{base} mode
-% which supports only a subset of OpenType features and works by mapping those
-% features to traditional \TeX\ ligaturing and kerning mechanisms and is a bit
-% faster, and \texttt{node} mode which, hopefully, supports OpenType fully and
-% works by direct processing of node list at lua end and is a bit slower.
-% Note that \texttt{node} mode doesn't work inside math.
-%
-% By default, \texttt{base} mode is used, however it is advisable to always
+% \textsf{luaotfload} has two OpenType processing modes;
+% \texttt{base} or \texttt{node}.
+% Using \texttt{mode=base}
+% only supports a subset of OpenType features and works by mapping those
+% features to traditional \TeX\ ligature and kerning mechanisms and is a bit
+% faster
+% Using \texttt{mode=node} hopefully supports OpenType fully and
+% works by direct processing of the node list with Lua; it is slower and
+% is not designed to work in math mode.
+%
+% By default \texttt{mode=base} is used, but it is advisable to always
% enable \texttt{node} made, except for math fonts, otherwise many OpenType
% features will not function properly or even not work at all, especially for
% advanced scripts like Arabic.
%
% \item [script] \hfill \\
% OpenType script string, default value is |dflt|. Some fonts don't assign
-% features to |dflt| script, in this case script need to be set explicitly.
+% features to the |dflt| script, in which case the script need to be set
+% explicitly.
%
-% \item [language] \hfill \\ OpenType language string, default value is |latn|.
+% \item [language] \hfill \\
+% OpenType language string, default value is |latn|.
%
% \item [featurefile] \hfill \\
% feature files are textual representation of OpenType tables and can be used to
@@ -246,9 +266,9 @@ and the derived files
% |\font\lmr=Latin Modern Roman:featurefile=mykern.fea;+tkrn|
%
% \item [color] \hfill \\
-% font color, defined as a triplet of two-digit Hex RGB values, with optionally
-% another value for the transparency (where |00| is completely transparent and
-% |FF| is opaque.)
+% 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:
%
@@ -257,7 +277,7 @@ and the derived files
% \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 bottom of
+% Lua tables of protrusion and expansion values; see the end of
% \texttt{otfl-font-dum.lua} file for an example of such tables. The only
% predefined value is |default|.
%
@@ -280,7 +300,42 @@ and the derived files
% \item \texttt{trep}: applies legacy \TeX\ replacements (|`'"|).
% \end{itemize*}
%
-% \subsection{\ConTeXt\ files needed}
+% (For \XeTeX\ users: these last two are the equivalent of writing
+% \texttt{mapping=text-tex} using \XeTeX's input remapping feature.)
+%
+%
+% \section{Maintaining the font database}
+% \label{sec:fontdb}
+%
+% As introduced in the previous section, \textsf{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.
+%
+% This font database must be maintained as you add (and remove) fonts to your
+% system. To update the database, run the script |mkluatexfontdb.lua| that is
+% included with this package. If you have not run it before, it may take quite
+% some time to process every font on your computer. Subsequent runs to update
+% the database will be quite fast, however.
+%
+% In \TeX~Live~2010, there will be a button in the \TeX~Live package manager
+% to run |mkluatexfontdb.lua|.
+%
+% The script will parse standard places for fonts in your system to build the
+% font database. On Windows and Linus, it will use |fc-list| to find the
+% fonts; on Mac~OS~X, it will search in the standard font locations
+% |~/Library/Fonts|, |/Library/Fonts|, |/System/Library/Fonts|, and
+% |/Network/Library/Fonts|,
+%
+% If you do not wish the script to locate fonts automatically but would rather
+% specify the exact locations in which to find your fonts, set the |OSFONTDIR|
+% environment variable instead. When this variable is set, the script will
+% only search in those directories.
+%
+% |mkluatexfontdb.lua --help| provides a brief summary of the functionality of
+% the script and includes some advanced options that we have not mentioned
+% here.
+%
+% \section{Required \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
@@ -319,7 +374,16 @@ and the derived files
% \end{itemize*}
% \end{multicols}
%
-% \subsection{Troubleshooting}
+% The following files have been written for this package:
+% \begin{multicols}{3}
+% \begin{itemize*}
+% \item \texttt{font-clr.lua}
+% \item \texttt{font-nms.lua}
+% \item \texttt{luat-ovr.lua}
+% \end{itemize*}
+% \end{multicols}
+%
+% \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
@@ -333,10 +397,10 @@ and the derived files
%
% |\font\myfont = MyFont.otf:script=latn;+liga;|
%
-% Also, some feature like contextual substitution, |calt|, will only work with
-% |node| mode.
+% Also remember to set |mode=node| as most OpenType features
+% (such as contextual substitution, |calt|), will not work without it.
%
-% \section{\texttt{luaotfload.lua}}
+% \part{\texttt{luaotfload.lua}}
%
% \iffalse
%<*lua>
@@ -349,8 +413,8 @@ module('luaotfload', package.seeall)
luaotfload.module = {
name = "luaotfload",
- version = 1.07,
- date = "2010/05/10",
+ version = 1.08a,
+ date = "2010/05/28",
description = "ConTeXt font loading system.",
author = "Elie Roux & Hans Hagen",
copyright = "Elie Roux",
@@ -434,38 +498,39 @@ luaotfload.loadmodule('node-ini.lua')
% \end{macrocode}
%
-% By default \ConTeXt\ takes some private attributes for internal use. With
-% Plain and \LaTeX\ we can't do so, we use |\newluaattribute|. This
-% functions overrides a function defined in the previous module that
-% returns the number of a private attribute. We allocate new attributes in
-% the \texttt{.sty} file, and this function returns their number. Like this
-% we don't need any private attribute, and this package is compatible with
-% the others. We use the |otfl@| prefix for attributes.
+% By default \ConTeXt\ takes some private attributes for internal use. To
+% avoide attribute clashes with other packages, we override the function
+% that allocates new attributes, making it a wraper around
+% |luatexbase.new_attribute()|. We also prefix attributes with |otfl@| to
+% avoid possiple name clashes.
%
% \begin{macrocode}
function attributes.private(name)
- local number = luatexbase.attributes['otfl@'..name]
+ local attr = 'otfl@' .. name
+ local number = luatexbase.attributes[attr]
if not number then
- error('asking for attribute %s, but not declared. '
- ..'Please report to the maintainer of luaotfload.',
- name)
+ number = luatexbase.new_attribute(attr)
end
return number
end
% \end{macrocode}
%
-% Some more modules. We don't load neither \texttt{font-enc.lua} nor
-% \texttt{font-afm.lua} as it will never be used here.
-%
-% We also remove a warning from \texttt{node-fnt.lua} as it is \ConTeXt\
+% A hack to remove a warning from \texttt{node-fnt.lua} as it is \ConTeXt\
% specific.
%
% \begin{macrocode}
tex.attribute[0] = 0
+% \end{macrocode}
+%
+% Some more modules. We don't load neither \texttt{font-enc.lua} nor
+% \texttt{font-afm.lua} as it will never be used here.
+%
+% \begin{macrocode}
+
luaotfload.loadmodule('node-res.lua')
luaotfload.loadmodule('node-inj.lua')
luaotfload.loadmodule('node-fnt.lua')
@@ -491,6 +556,14 @@ luaotfload.loadmodule('font-clr.lua')
% \end{macrocode}
%
+% Here we override some defaults set in \ConTeXt\ code.
+%
+% \begin{macrocode}
+
+fonts.mode = "node"
+
+% \end{macrocode}
+%
% Finally two functions
%
% \begin{macrocode}
@@ -526,7 +599,7 @@ end
%</lua>
% \fi
%
-% \section{\texttt{luaotfload.sty}}
+% \part{\texttt{luaotfload.sty}}
%
% \iffalse
%<*package>
@@ -543,7 +616,7 @@ end
\else
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{luaotfload}%
- [2010/05/10 v1.07 ConTeXt font loading system]
+ [2010/05/28 v1.08a ConTeXt font loading system]
\RequirePackage{luatextra}
\fi
@@ -555,23 +628,6 @@ end
% \end{macrocode}
%
-% The attributes are allocated here. The |otfl@| prefix is added to prevent
-% name collision.
-%
-% \begin{macrocode}
-
-\newluatexattribute\otfl@state
-\newluatexattribute\otfl@markbase
-\newluatexattribute\otfl@markdone
-\newluatexattribute\otfl@markmark
-\newluatexattribute\otfl@cursbase
-\newluatexattribute\otfl@curscurs
-\newluatexattribute\otfl@cursdone
-\newluatexattribute\otfl@kernpair
-\newluatexattribute\otfl@color
-
-% \end{macrocode}
-%
% Two small macros to register or unregister the callbacks. Without the
% callbacks this package is totally turned off.
%
@@ -600,5 +656,438 @@ end
% \iffalse
%</package>
% \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
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.lua b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.lua
index 6e76fa57f8f..7033d24d970 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.lua
@@ -7,7 +7,8 @@
-- luaotfload.dtx (with options: `lua')
-- This is a generated file.
--
--- Copyright (C) 2009 by Elie Roux <elie.roux@telecom-bretagne.eu>
+-- Copyright (C) 2009-2010 by by Elie Roux <elie.roux@telecom-bretagne.eu>
+-- and Khaled Hosny <khaledhosny@eglug.org>
--
-- This work is under the CC0 license.
--
@@ -19,8 +20,8 @@ module('luaotfload', package.seeall)
luaotfload.module = {
name = "luaotfload",
- version = 1.07,
- date = "2010/05/10",
+ version = 1.08a,
+ date = "2010/05/28",
description = "ConTeXt font loading system.",
author = "Elie Roux & Hans Hagen",
copyright = "Elie Roux",
@@ -75,11 +76,10 @@ luaotfload.loadmodule('node-ini.lua')
function attributes.private(name)
- local number = luatexbase.attributes['otfl@'..name]
+ local attr = 'otfl@' .. name
+ local number = luatexbase.attributes[attr]
if not number then
- error('asking for attribute %s, but not declared. '
- ..'Please report to the maintainer of luaotfload.',
- name)
+ number = luatexbase.new_attribute(attr)
end
return number
end
@@ -87,6 +87,7 @@ end
tex.attribute[0] = 0
+
luaotfload.loadmodule('node-res.lua')
luaotfload.loadmodule('node-inj.lua')
luaotfload.loadmodule('node-fnt.lua')
@@ -111,6 +112,9 @@ luaotfload.loadmodule('font-nms.lua')
luaotfload.loadmodule('font-clr.lua')
+fonts.mode = "node"
+
+
function luaotfload.register_callbacks()
luatexbase.add_to_callback('pre_linebreak_filter',
nodes.simple_font_handler,
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty
index e2ec4bba711..0883e086d8c 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty
+++ b/Master/texmf-dist/tex/luatex/luaotfload/luaotfload.sty
@@ -7,7 +7,8 @@
%% luaotfload.dtx (with options: `package')
%% This is a generated file.
%%
-%% Copyright (C) 2009 by Elie Roux <elie.roux@telecom-bretagne.eu>
+%% Copyright (C) 2009-2010 by by Elie Roux <elie.roux@telecom-bretagne.eu>
+%% and Khaled Hosny <khaledhosny@eglug.org>
%%
%% This work is under the CC0 license.
%%
@@ -23,7 +24,7 @@
\else
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{luaotfload}%
- [2010/05/10 v1.07 ConTeXt font loading system]
+ [2010/05/28 v1.08a ConTeXt font loading system]
\RequirePackage{luatextra}
\fi
@@ -34,17 +35,6 @@
\catcode64 11
-\newluatexattribute\otfl@state
-\newluatexattribute\otfl@markbase
-\newluatexattribute\otfl@markdone
-\newluatexattribute\otfl@markmark
-\newluatexattribute\otfl@cursbase
-\newluatexattribute\otfl@curscurs
-\newluatexattribute\otfl@cursdone
-\newluatexattribute\otfl@kernpair
-\newluatexattribute\otfl@color
-
-
\def\otfl@off{
\directlua{luaotfload.unregister_callbacks()}
}
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-data-con.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-data-con.lua
index f06dba5b5e5..fabe0baa1b7 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-data-con.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-data-con.lua
@@ -74,7 +74,7 @@ end
function containers.is_valid(container, name)
if name and name ~= "" then
local storage = container.storage[name]
- return storage and not table.is_empty(storage) and storage.cache_version == container.version
+ return storage and storage.cache_version == container.version
else
return false
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-def.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-def.lua
index f64bae5636e..0add703ba48 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-def.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-def.lua
@@ -501,14 +501,14 @@ a helper function.</p>
function define.check(features,defaults) -- nb adapts features !
local done = false
- if table.is_empty(features) then
- features, done = table.fastcopy(defaults), true
- else
+ if features and next(features) then
for k,v in next, defaults do
if features[k] == nil then
features[k], done = v, true
end
end
+ else
+ features, done = table.fastcopy(defaults), true
end
return features, done -- done signals a change
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-dum.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-dum.lua
index 5224ae187e7..2de1ae15d01 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-dum.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-dum.lua
@@ -55,11 +55,14 @@ fonts.names.old_to_new = { }
local data, loaded = nil, false
+local fileformats = { "lua", "tex", "other text files" }
+
function fonts.names.resolve(name,sub)
if not loaded then
local basename = fonts.names.basename
if basename and basename ~= "" then
- for _, format in ipairs { "lua", "tex", "other text files" } do
+ for i=1,#fileformats do
+ local format = fileformats[i]
local foundname = resolvers.find_file(basename,format) or ""
if foundname ~= "" then
data = dofile(foundname)
@@ -356,3 +359,23 @@ fonts.otf.meanings.normalize = fonts.otf.meanings.normalize or function(t)
t.rand = "random"
end
end
+
+-- bonus
+
+function fonts.otf.name_to_slot(name)
+ local tfmdata = fonts.ids[font.current()]
+ if tfmdata and tfmdata.shared then
+ local otfdata = tfmdata.shared.otfdata
+ local unicode = otfdata.luatex.unicodes[name]
+ return unicode and (type(unicode) == "number" and unicode or unicode[1])
+ end
+end
+
+function fonts.otf.char(n)
+ if type(n) == "string" then
+ n = fonts.otf.name_to_slot(n)
+ end
+ if type(n) == "number" then
+ tex.sprint("\\char" .. n)
+ end
+end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ini.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ini.lua
index b9988687d68..e4514978175 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ini.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ini.lua
@@ -70,54 +70,26 @@ fonts.define.specify.synonyms = fonts.define.specify.synonyms or { }
-- tracing
-fonts.color = fonts.color or { }
+if not fonts.color then
-local attribute = attributes.private('color')
-local mapping = (attributes and attributes.list[attribute]) or { }
+ fonts.color = {
+ set = function() end,
+ reset = function() end,
+ }
-local set_attribute = node.set_attribute
-local unset_attribute = node.unset_attribute
-
-function fonts.color.set(n,c)
- local mc = mapping[c]
- if not mc then
- unset_attribute(n,attribute)
- else
- set_attribute(n,attribute,mc)
- end
-end
-function fonts.color.reset(n)
- unset_attribute(n,attribute)
end
--- this will change ...
-
-function fonts.show_char_data(n)
- local tfmdata = fonts.ids[font.current()]
- if tfmdata then
- if type(n) == "string" then
- n = utf.byte(n)
- end
- local chr = tfmdata.characters[n]
- if chr then
- write_nl(format("%s @ %s => U%04X => %s => ",tfmdata.fullname,tfmdata.size,n,utf.char(n)) .. serialize(chr,false))
- end
- end
-end
+-- format identification
-function fonts.show_font_parameters()
- local tfmdata = fonts.ids[font.current()]
- if tfmdata then
- local parameters, mathconstants = tfmdata.parameters, tfmdata.MathConstants
- local hasparameters, hasmathconstants = parameters and next(parameters), mathconstants and next(mathconstants)
- if hasparameters then
- write_nl(format("%s @ %s => parameters => ",tfmdata.fullname,tfmdata.size) .. serialize(parameters,false))
- end
- if hasmathconstants then
- write_nl(format("%s @ %s => math constants => ",tfmdata.fullname,tfmdata.size) .. serialize(mathconstants,false))
- end
- if not hasparameters and not hasmathconstants then
- write_nl(format("%s @ %s => no parameters and/or mathconstants",tfmdata.fullname,tfmdata.size))
- end
+fonts.formats = { }
+
+function fonts.fontformat(filename,default)
+ local extname = file.extname(filename)
+ local format = fonts.formats[extname]
+ if format then
+ return format
+ else
+ logs.report("fonts define","unable to detemine font format for '%s'",filename)
+ return default
end
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-map.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-map.lua
index 208ad50a873..299508764a1 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-map.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-map.lua
@@ -252,7 +252,7 @@ fonts.map.add_to_unicode = function(data,filename)
end
end
if trace_unimapping then
- for index, glyph in table.sortedpairs(data.glyphs) do
+ for index, glyph in table.sortedhash(data.glyphs) do
local toun, name, unic = tounicode[index], glyph.name, glyph.unicode or -1 -- play safe
if toun then
logs.report("load otf","internal: 0x%05X, name: %s, unicode: 0x%05X, tounicode: %s",index,name,unic,toun)
@@ -302,7 +302,7 @@ end
--
-- function fonts.map.flush(backend) -- will also erase the accumulated data
-- local flushline = fonts.map.line[backend or "pdftex"] or fonts.map.line.pdftex
--- for _, e in pairs(fonts.map.data) do
+-- for _, e in next, fonts.map.data do
-- flushline(e)
-- end
-- fonts.map.data = { }
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-nms.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-nms.lua
index fd31bac0832..e75b6c94b18 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-nms.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-nms.lua
@@ -3,15 +3,29 @@ if not modules then modules = { } end modules ['font-nms'] = {
comment = "companion to luaotfload.lua",
author = "Khaled Hosny and Elie Roux",
copyright = "Luaotfload Development Team",
- license = "GPL"
+ license = "GNU GPL v2"
}
+-- This is a patch for otfl-font-def.lua, that defines a reader for ofm fonts,
+-- this is necessary if we set the forced field of the specification to 'ofm'
+-- we use it only when using luaotfload, not mkluatexfontdb.
+if fonts and fonts.tfm and fonts.tfm.readers then
+ fonts.tfm.readers.ofm = fonts.tfm.readers.tfm
+end
+
+-- This is a necessary initalization in order not to rebuild an existing font.
+-- Maybe 600 should be replaced by \pdfpkresolution
+-- or texconfig.pk_dpi (and it should be replaced dynamically), but we don't
+-- have access (yet) to the texconfig table, so we let it be 600. Anyway, it
+-- does still work fine even if \pdfpkresolution is changed.
+kpse.init_prog('', 600, '/')
+
fonts = fonts or { }
fonts.names = fonts.names or { }
local names = fonts.names
local names_dir = "/luatex/generic/luaotfload/names/"
-names.version = 2.007 -- not the same as in context
+names.version = 2.009 -- not the same as in context
names.data = nil
names.path = {
basename = "otfl-names.lua",
@@ -20,15 +34,30 @@ names.path = {
}
-local splitpath, expandpath, glob, basename = file.split_path, kpse.expand_path, dir.glob, file.basename
-local upper, lower, format, gsub, match = string.upper, string.lower, string.format, string.gsub, string.match
-local rpadd = string.rpadd
-local utfgsub = unicode.utf8.gsub
+local splitpath, expandpath = file.split_path, kpse.expand_path
+local glob, basename = dir.glob, file.basename
+local upper, lower, format = string.upper, string.lower, string.format
+local gsub, match, rpadd = string.gsub, string.match, string.rpadd
+local gmatch, sub = string.gmatch, string.sub
+local utfgsub = unicode.utf8.gsub
+local trace_short = false --tracing adapted to rebuilding of the database inside a document
local trace_progress = true --trackers.register("names.progress", function(v) trace_progress = v end)
local trace_search = false --trackers.register("names.search", function(v) trace_search = v end)
local trace_loading = false --trackers.register("names.loading", function(v) trace_loading = v end)
+
+-- Basic function from <http://stackoverflow.com/questions/2282444/how-to-check-if-a-table-contains-an-element-in-lua>
+function table.contains(table, element)
+ for _, value in pairs(table) do
+ if value == element then
+ return true
+ end
+ end
+ return false
+end
+
+
local function sanitize(str)
if str then
return utfgsub(lower(str), "[^%a%d]", "")
@@ -37,54 +66,127 @@ local function sanitize(str)
end
end
+local function fontnames_init()
+ return {
+ mappings = { },
+ status = { },
+ version = names.version,
+ }
+end
+
function names.load()
+ -- this sets the output of the database building accordingly.
+ names.set_log_level(-1)
local localpath = names.path.localdir .. names.path.basename
local systempath = names.path.systemdir .. names.path.basename
local kpsefound = kpse.find_file(names.path.basename)
+ local foundname
local data
if kpsefound and file.isreadable(kpsefound) then
data = dofile(kpsefound)
+ foundname = kpsefound
elseif file.isreadable(localpath) then
data = dofile(localpath)
+ foundname = localpath
elseif file.isreadable(systempath) then
data = dofile(systempath)
+ foundname = systempath
end
if data then
- if trace_loading then
- logs.report("load font", "loaded font names database: %s", foundname)
- end
- return data
+ logs.report("load font",
+ "loaded font names database: %s", foundname)
+ else
+ logs.report("load font",
+ "no font names database found, generating new one")
+ data = names.update()
+ names.save(data)
end
+ return data
end
-local loaded = false
-
local synonyms = {
- regular = {normal=true, roman=true, plain=true, book=true, medium=true},
- italic = {regularitalic=true, normalitalic=true, oblique=true, slant=true},
- bolditalic = {boldoblique=true, boldslant=true},
+ regular = {
+ normal = true,
+ roman = true,
+ plain = true,
+ book = true,
+ medium = true,
+ },
+ italic = {
+ regularitalic = true,
+ normalitalic = true,
+ oblique = true,
+ slant = true,
+ },
+ bolditalic = {
+ boldoblique = true,
+ boldslant = true,
+ },
}
--- a small hack to get the log message "no font names database loaded" only
--- once in the log
-local log_message_shown = false
+local loaded = false
+local reloaded = false
function names.resolve(specification)
- local tfm = resolvers.find_file(specification.name, "ofm")
- local name = sanitize(specification.name)
- local style = sanitize(specification.style) or "regular"
- local size = tonumber(specification.optsize) or specification.size and specification.size / 65536
+ local tfm = resolvers.find_file(specification.name, "tfm")
+ local ext = lower(file.extname(specification.name))
+
if tfm then
-- is a tfm font, skip names database
- return specification.name, false
+ if ext == 'tfm' then
+ return specification.name, false
+ else
+ return specification.name..'.tfm', false
+ end
+ elseif resolvers.find_file(specification.name, "ofm") then
+ if ext == 'ofm' then
+ return specification.name, false
+ else
+ return specification.name..'.ofm', false
+ end
+ end
+
+ local name = sanitize(specification.name)
+ local style = sanitize(specification.style) or "regular"
+
+ local size
+ if specification.optsize then
+ size = tonumber(specification.optsize)
+ elseif specification.size then
+ size = specification.size / 65536
end
+
+
if not loaded then
- names.data = names.load()
- loaded = true
+ names.data = names.load()
+ loaded = true
end
- local data = names.data
+
+ local data = names.data
if type(data) == "table" and data.version == names.version then
if data.mappings then
+ -- if the specified name ends like a font file, we first look for
+ -- it through kpse, and if we don't find it, we look for it in
+ -- the database.
+ if table.contains(font_extensions_lc, ext) then
+ local fname = specification.name
+ -- for absolute and relative path, kpse will find them, so
+ -- there shouldn't be any problem
+ local path = resolvers.find_file(fname, "opentype fonts")
+ if not path then
+ path = resolvers.find_file(fname, "truetype fonts")
+ end
+ if path then
+ return path -- or fname ?
+ else
+ for _,face in ipairs(data.mappings) do
+ if basename(face.filename[1]) == fname then
+ return face.filename[1], face.filename[2]
+ end
+ end
+ end
+ return specification.name
+ end
local found = { }
for _,face in ipairs(data.mappings) do
local family = sanitize(face.names.family)
@@ -97,13 +199,15 @@ function names.resolve(specification)
if #face.size > 0 then
optsize = face.size
dsnsize = optsize[1] and optsize[1] / 10
- maxsize = optsize[2] and optsize[2] / 10 or dsnsize -- can be nil
- minsize = optsize[3] and optsize[3] / 10 or dsnsize -- can be nil
+ -- can be nil
+ maxsize = optsize[2] and optsize[2] / 10 or dsnsize
+ minsize = optsize[3] and optsize[3] / 10 or dsnsize
end
if name == family then
if subfamily == style then
if optsize then
- if dsnsize == size or (size > minsize and size <= maxsize) then
+ if dsnsize == size
+ or (size > minsize and size <= maxsize) then
found[1] = face
break
else
@@ -115,7 +219,8 @@ function names.resolve(specification)
end
elseif synonyms[style] and synonyms[style][subfamily] then
if optsize then
- if dsnsize == size or (size > minsize and size <= maxsize) then
+ if dsnsize == size
+ or (size > minsize and size <= maxsize) then
found[1] = face
break
else
@@ -129,9 +234,13 @@ function names.resolve(specification)
found[1] = face
end
else
- if name == fullname or name == pfullname or name == fontname or name == psname then
+ if name == fullname
+ or name == pfullname
+ or name == fontname
+ or name == psname then
if optsize then
- if dsnsize == size or (size > minsize and size <= maxsize) then
+ if dsnsize == size
+ or (size > minsize and size <= maxsize) then
found[1] = face
break
else
@@ -172,19 +281,37 @@ function names.resolve(specification)
return closest.filename[1], closest.filename[2]
end
end
- -- no font found so far, fallback to filename
+ -- no font found so far
+ if not reloaded then
+ -- try reloading the database
+ names.data = names.update(names.data)
+ names.save(names.data)
+ reloaded = true
+ return names.resolve(specification)
+ else
+ -- else, fallback to filename
+ return specification.name, false
+ end
+ end
+ else
+ if not reloaded then
+ names.data = names.update()
+ names.save(names.data)
+ reloaded = true
+ return names.resolve(specification)
+ else
return specification.name, false
end
- elseif not log_message_shown then
- logs.report("load font", "no font names database loaded")
- log_message_shown = true
end
end
-names.resolvespec = names.resolve -- only supported in mkiv
+names.resolvespec = names.resolve
function names.set_log_level(level)
- if level == 2 then
+ if level == -1 then
+ trace_progress = false
+ trace_short = true
+ elseif level == 2 then
trace_progress = false
trace_loading = true
elseif level >= 3 then
@@ -193,7 +320,7 @@ function names.set_log_level(level)
trace_search = true
end
end
-
+
local lastislog = 0
function log(fmt, ...)
@@ -203,6 +330,7 @@ end
logs = logs or { }
logs.report = logs.report or log
+logs.info = logs.info or log
local log = names.log
@@ -229,7 +357,13 @@ end
local function font_fullinfo(filename, subfont, texmf)
local t = { }
local f = fontloader.open(filename, subfont)
- local m = f and fontloader.to_table(f)
+ if not f then
+ if trace_loading then
+ logs.report("error: failed to open %s", filename)
+ end
+ return nil
+ end
+ local m = fontloader.to_table(f)
fontloader.close(f)
collectgarbage('collect')
-- see http://www.microsoft.com/typography/OTSPEC/features_pt.htm#size
@@ -244,11 +378,13 @@ local function font_fullinfo(filename, subfont, texmf)
for _,v in pairs(m.names) do
if v.lang == "English (US)" then
t.names = {
- -- see http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html
- fullname = v.names.compatfull or v.names.fullname, -- 18, 4
- family = v.names.preffamilyname or v.names.family, -- 17, 1
- subfamily = t.fontstyle_name or v.names.prefmodifiers or v.names.subfamily, -- opt. style, 16, 2
- psname = v.names.postscriptname --or t.fontname
+ -- see
+ -- http://developer.apple.com/textfonts/
+ -- TTRefMan/RM06/Chap6name.html
+ fullname = v.names.compatfull or v.names.fullname,
+ family = v.names.preffamilyname or v.names.family,
+ subfamily= t.fontstyle_name or v.names.prefmodifiers or v.names.subfamily,
+ psname = v.names.postscriptname
}
end
end
@@ -266,49 +402,72 @@ local function font_fullinfo(filename, subfont, texmf)
m.design_range_top ~= 0 and m.design_range_top or nil,
m.design_range_bottom ~= 0 and m.design_range_bottom or nil,
}
-
return t
end
-local function load_font(filename, fontnames, status, newfontnames, newstatus, texmf)
- local mappings = newfontnames and newfontnames.mappings or { }
- local oldmappings = fontnames.mappings or { }
+local function load_font(filename, fontnames, newfontnames, texmf)
+ local newmappings = newfontnames.mappings
+ local newstatus = newfontnames.status
+ local mappings = fontnames.mappings
+ local status = fontnames.status
+ local basefile = texmf and basename(filename) or filename
if filename then
local timestamp, db_timestamp
- db_timestamp = status[filename] and status[filename].timestamp
+ db_timestamp = status[basefile] and status[basefile].timestamp
timestamp = lfs.attributes(filename, "modification")
- newstatus[filename] = { }
- newstatus[filename].timestamp = timestamp
- newstatus[filename].index = {}
- if db_timestamp == timestamp then
- for _,v in ipairs(status[filename].index) do
- mappings[#mappings+1] = oldmappings[v]
- newstatus[filename].index[#newstatus[filename].index+1] = #mappings
+
+ local index_status = newstatus[basefile] or (not texmf and newstatus[basename(filename)])
+ if index_status and index_status.timestamp == timestamp then
+ -- already indexed this run
+ return
+ end
+
+ newstatus[basefile] = newstatus[basefile] or { }
+ newstatus[basefile].timestamp = timestamp
+ newstatus[basefile].index = newstatus[basefile].index or { }
+
+ if db_timestamp == timestamp and not newstatus[basefile].index[1] then
+ for _,v in ipairs(status[basefile].index) do
+ local index = #newstatus[basefile].index
+ newmappings[#newmappings+1] = mappings[v]
+ newstatus[basefile].index[index+1] = #newmappings
end
if trace_loading then
- logs.report("font already indexed: %s", filename)
+ logs.report("font already indexed: %s", basefile)
end
return
end
if trace_loading then
- logs.report("loading font: %s", filename)
+ logs.report("loading font: %s", basefile)
end
local info = fontloader.info(filename)
if info then
if type(info) == "table" and #info > 1 then
for i in ipairs(info) do
local fullinfo = font_fullinfo(filename, i-1, texmf)
- mappings[#mappings+1] = fullinfo
- newstatus[filename].index[#newstatus[filename].index+1] = #mappings
+ local index = newstatus[basefile].index[i]
+ if newstatus[basefile].index[i] then
+ index = newstatus[basefile].index[i]
+ else
+ index = #newmappings+1
+ end
+ newmappings[index] = fullinfo
+ newstatus[basefile].index[i] = index
end
else
local fullinfo = font_fullinfo(filename, false, texmf)
- mappings[#mappings+1] = fullinfo
- newstatus[filename].index[#newstatus[filename].index+1] = #mappings
+ local index
+ if newstatus[basefile].index[1] then
+ index = newstatus[basefile].index[1]
+ else
+ index = #newmappings+1
+ end
+ newmappings[index] = fullinfo
+ newstatus[basefile].index[1] = index
end
else
if trace_loading then
- logs.report("failed to load %s", filename)
+ logs.report("failed to load %s", basefile)
end
end
end
@@ -316,66 +475,108 @@ end
local function path_normalize(path)
--[[
- path normalization:
- - a\b\c -> a/b/c
- - a/../b -> b
- - /cygdrive/a/b -> a:/b
+ path normalization:
+ - a\b\c -> a/b/c
+ - a/../b -> b
+ - /cygdrive/a/b -> a:/b
+ - reading symlinks under non-Win32
+ - using kpse.readable_file on Win32
--]]
if os.type == "windows" or os.type == "msdos" or os.name == "cygwin" then
+ path = kpse.readable_file(path)
path = path:gsub('\\', '/')
path = path:lower()
- -- for cygwin cases...
path = path:gsub('^/cygdrive/(%a)/', '%1:/')
end
+ if os.type ~= "windows" and os.type ~= "msdos" then
+ local dest = lfs.readlink(path)
+ if dest then
+ if kpse.readable_file(dest) then
+ path = dest
+ elseif kpse.readable_file(file.join(file.dirname(path), dest)) then
+ path = file.join(file.dirname(path), dest)
+ else
+ -- broken symlink?
+ end
+ end
+ end
path = file.collapse_path(path)
return path
end
fonts.path_normalize = path_normalize
-local function scan_dir(dirname, fontnames, status, newfontnames, newstatus, recursive, texmf)
+if os.name == "macosx" then
+ -- While Mac OS X 10.6 has a problem with TTC files, ignore them globally:
+ font_extensions = {
+ "otf", "ttf", "dfont", "OTF", "TTF", "DFONT"
+ }
+ font_extensions_lc = { "otf", "ttf", "dfont" }
+else
+ font_extensions = {
+ "otf", "ttf", "ttc", "dfont", "OTF", "TTF", "TTC", "DFONT"
+ }
+ font_extensions_lc = { "otf", "ttf", "ttc", "dfont" }
+end
+
+local function scan_dir(dirname, fontnames, newfontnames, texmf)
--[[
this function scans a directory and populates the list of fonts
with all the fonts it finds.
- dirname is the name of the directory to scan
- names is the font database to fill
- - recursive is whether we scan all directories recursively (always false
- in this script)
- - texmf is a boolean saying if we are scanning a texmf directory (always
- true in this script)
+ - texmf is a boolean saying if we are scanning a texmf directory
--]]
local list, found = { }, { }
local nbfound = 0
- for _,ext in ipairs { "otf", "ttf", "ttc", "dfont" } do
- if recursive then pat = "/**." else pat = "/*." end
- if trace_search then
- logs.report("scanning '%s' for '%s' fonts", dirname, ext)
- end
- found = glob(dirname .. pat .. ext)
+ if trace_search then
+ logs.report("scanning '%s'", dirname)
+ end
+ for _,ext in ipairs(font_extensions) do
+ found = glob(dirname .. "/**." .. ext)
-- note that glob fails silently on broken symlinks, which happens
-- sometimes in TeX Live.
if trace_search then
- logs.report("%s fonts found", #found)
+ logs.report("%s '%s' fonts found", #found, ext)
end
nbfound = nbfound + #found
table.append(list, found)
- if trace_search then
- logs.report("scanning '%s' for '%s' fonts", dirname, upper(ext))
- end
- found = glob(dirname .. pat .. upper(ext))
- table.append(list, found)
- nbfound = nbfound + #found
end
if trace_search then
logs.report("%d fonts found in '%s'", nbfound, dirname)
end
+ list = remove_ignore_fonts(list) -- fixme: general solution required
for _,fnt in ipairs(list) do
fnt = path_normalize(fnt)
- load_font(fnt, fontnames, status, newfontnames, newstatus, texmf)
+ load_font(fnt, fontnames, newfontnames, texmf)
end
end
-local function scan_texmf_tree(fontnames, status, newfontnames, newstatus)
+-- Temporary until a general solution is implemented:
+if os.name == "macosx" then
+ ignore_fonts = {
+ -- this font kills the indexer:
+ "/System/Library/Fonts/LastResort.ttf"
+ }
+ function remove_ignore_fonts(fonts)
+ for N,fnt in ipairs(fonts) do
+ if table.contains(ignore_fonts,fnt) then
+ if trace_search then
+ logs.report("ignoring font '%s'", fnt)
+ end
+ table.remove(fonts,N)
+ end
+ end
+ return fonts
+ end
+-- This function is only necessary, for now, on Mac OS X.
+else
+ function remove_ignore_fonts(fonts)
+ return fonts
+ end
+end
+
+local function scan_texmf_fonts(fontnames, newfontnames)
--[[
The function that scans all fonts in the texmf tree, through kpathsea
variables OPENTYPEFONTS and TTFONTS of texmf.cnf
@@ -386,110 +587,149 @@ local function scan_texmf_tree(fontnames, status, newfontnames, newstatus)
else
logs.report("scanning TEXMF and OS fonts:")
end
+ elseif trace_short then
+ if expandpath("$OSFONTDIR"):is_empty() then
+ logs.info("scanning TEXMF fonts...")
+ else
+ logs.info("scanning TEXMF and OS fonts...")
+ end
end
- local fontdirs = expandpath("$OPENTYPEFONTS")
- fontdirs = fontdirs .. gsub(expandpath("$TTFONTS"), "^\.", "")
+ local fontdirs = expandpath("$OPENTYPEFONTS"):gsub("^\.", "")
+ fontdirs = fontdirs .. expandpath("$TTFONTS"):gsub("^\.", "")
if not fontdirs:is_empty() then
- local explored_dirs = {}
fontdirs = splitpath(fontdirs)
- -- hack, don't scan current dir
- table.remove(fontdirs, 1)
count = 0
for _,d in ipairs(fontdirs) do
- if not explored_dirs[d] then
- count = count + 1
- progress(count, #fontdirs)
- scan_dir(d, fontnames, status, newfontnames, newstatus, false, true)
- explored_dirs[d] = true
- end
+ count = count + 1
+ progress(count, #fontdirs)
+ scan_dir(d, fontnames, newfontnames, true)
end
end
end
-local function read_fcdata(data)
- --[[
- this function takes raw data returned by fc-list, parses it, normalizes the
- paths and makes a list out of it.
- --]]
- local list = { }
- for line in data:lines() do
- line = line:gsub(": ", "")
- local ext = lower(match(line,"^.+%.([^/\\]-)$"))
- if ext == "otf" or ext == "ttf" or ext == "ttc" or ext == "dfont" then
- list[#list+1] = path_normalize(line:gsub(": ", ""))
- end
- end
- return list
-end
+--[[
+ For the OS fonts, there are several options:
+ - if OSFONTDIR is set (which is the case under windows by default but
+ not on the other OSs), it scans it at the same time as the texmf tree,
+ in the scan_texmf_fonts.
+ - if not:
+ - under Windows and Mac OSX, we take a look at some hardcoded directories
+ - under Unix, we read /etc/fonts/fonts.conf and read the directories in it
-local function scan_os_fonts(fontnames, status, newfontnames, newstatus)
- --[[
- This function scans the OS fonts through fontcache (fc-list), it executes
- only if OSFONTDIR is empty (which is the case under most Unix by default).
- If OSFONTDIR is non-empty, this means that the system fonts it contains have
- already been scanned, and thus we don't scan them again.
- --]]
- if expandpath("$OSFONTDIR"):is_empty() then
- if trace_progress then
- logs.report("scanning OS fonts:")
- end
- if trace_search then
- logs.report("executing 'fc-list : file' and parsing its result...")
- end
- local data = io.popen("fc-list : file", 'r')
- local list = read_fcdata(data)
- data:close()
- if trace_search then
- logs.report("%d fonts found", #list)
- end
- count = 0
- for _,fnt in ipairs(list) do
- count = count + 1
- progress(count, #list)
- load_font(fnt, fontnames, status, newfontnames, newstatus, false)
+ This means that if you have fonts in fancy directories, you need to set them
+ in OSFONTDIR.
+]]
+
+--[[
+ This function parses /etc/fonts/fonts.conf and returns all the dir it finds.
+ The code is minimal, please report any error it may generate.
+]]
+
+local function read_fonts_conf()
+ local f = io.open("/etc/fonts/fonts.conf")
+ if not f then
+ error("Cannot open the file /etc/fonts/fonts.conf")
+ end
+ local results = {}
+ local incomments = false
+ for line in f:lines() do
+ -- spaghetti code... hmmm...
+ if incomments and sub(line, 1, 3) == '-->' then
+ incomments = false
+ elseif sub(line, 1, 4) == '<!--' then
+ incomments = true
+ else
+ for dir in gmatch(line, '<dir>([^<]+)</dir>') do
+ -- now we need to replace ~ by kpse.expand_path('~')
+ if sub(dir, 1, 1) == '~' then
+ dir = kpse.expand_path('~') .. sub(dir, 2)
+ end
+ results[#results+1] = dir
+ end
end
end
+ f:close()
+ return results
end
-local function fontnames_init()
- return {
- mappings = { },
- version = names.version,
- }
+local function get_os_dirs()
+ if os.name == 'macosx' then
+ return {
+ kpse.expand_path('~') .. "/Library/Fonts",
+ "/Library/Fonts",
+ "/System/Library/Fonts",
+ "/Network/Library/Fonts",
+ }
+ elseif os.type == "windows" or os.type == "msdos" or os.name == "cygwin" then
+ local windir = os.getenv("WINDIR")
+ return {windir..'\\Fonts',}
+ else
+ return read_fonts_conf()
+ end
end
-local function status_init()
- return {
- version = names.version,
- }
+local function scan_os_fonts(fontnames, newfontnames)
+ --[[
+ This function scans the OS fonts through
+ - fontcache for Unix (reads the fonts.conf file and scans the directories)
+ - a static set of directories for Windows and MacOSX
+ --]]
+ if trace_progress then
+ logs.report("scanning OS fonts:")
+ elseif trace_short then
+ logs.info("scanning OS fonts...")
+ end
+ if trace_search then
+ logs.info("searching in static system directories...")
+ end
+ count = 0
+ local os_dirs = get_os_dirs()
+ for _,d in ipairs(os_dirs) do
+ count = count + 1
+ progress(count, #os_dirs)
+ scan_dir(d, fontnames, newfontnames, false)
+ end
end
-local function update(fontnames, status, force)
+local function update_names(fontnames, force)
--[[
The main function, scans everything
- fontnames is the final table to return
- force is whether we rebuild it from scratch or not
- - status is a table containing the current status of the database
--]]
+ if trace_short then
+ logs.info("Updating the font names database:")
+ end
if force then
fontnames = fontnames_init()
- status = status_init()
else
- if not fontnames or not fontnames.version or fontnames.version ~= names.version
- or not status or not status.version or status.version ~= names.version then
+ if not fontnames
+ or not fontnames.version
+ or fontnames.version ~= names.version then
fontnames = fontnames_init()
- status = status_init()
if trace_search then
- logs.report("no font names database or old one found, generating new one")
+ logs.report("no font names database or old one found, "
+ .."generating new one")
end
end
end
local newfontnames = fontnames_init()
- local newstatus = status_init()
- scan_texmf_tree(fontnames, status, newfontnames, newstatus)
- scan_os_fonts (fontnames, status, newfontnames, newstatus)
- return newfontnames, newstatus
+ scan_texmf_fonts(fontnames, newfontnames)
+ if expandpath("$OSFONTDIR"):is_empty() then
+ scan_os_fonts(fontnames, newfontnames)
+ end
+ return newfontnames
+end
+
+local function save_names(fontnames)
+ local savepath = names.path.localdir
+ if not lfs.isdir(savepath) then
+ dir.mkdirs(savepath)
+ end
+ io.savedata(savepath .. names.path.basename,
+ table.serialize(fontnames, true))
end
names.scan = scan_dir
-names.update = update
+names.update = update_names
+names.save = save_names
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otc.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otc.lua
index 64e09f8b117..551696f2cbf 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otc.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otc.lua
@@ -9,8 +9,6 @@ if not modules then modules = { } end modules ['font-otc'] = {
local format, insert = string.format, table.insert
local type, next = type, next
-local ctxcatcodes = tex.ctxcatcodes
-
-- we assume that the other otf stuff is loaded already
local trace_loading = false trackers.register("otf.loading", function(v) trace_loading = v end)
@@ -217,30 +215,3 @@ fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight
fonts.initializers.base.otf.compose = fonts.initializers.common.compose
fonts.initializers.node.otf.compose = fonts.initializers.common.compose
-
--- bonus function
-
-function otf.name_to_slot(name) -- todo: afm en tfm
- local tfmdata = fonts.ids[font.current()]
- if tfmdata and tfmdata.shared then
- local otfdata = tfmdata.shared.otfdata
- local unicode = otfdata.luatex.unicodes[name]
- if not unicode then
- return string.byte("?") -- nil
- elseif type(unicode) == "number" then
- return unicode
- else
- return unicode[1]
- end
- end
- return nil
-end
-
-function otf.char(n) -- todo: afm en tfm
- if type(n) == "string" then
- n = otf.name_to_slot(n)
- end
- if n then
- tex.sprint(ctxcatcodes,format("\\char%s ",n))
- end
-end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otf.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otf.lua
index 29c56cd0012..d68137c96e6 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otf.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otf.lua
@@ -80,7 +80,7 @@ otf.features.default = otf.features.default or { }
otf.enhancers = otf.enhancers or { }
otf.glists = { "gsub", "gpos" }
-otf.version = 2.645 -- beware: also sync font-mis.lua
+otf.version = 2.650 -- beware: also sync font-mis.lua
otf.pack = true -- beware: also sync font-mis.lua
otf.syncspace = true
otf.notdef = false
@@ -576,7 +576,10 @@ end
otf.enhancers["merge cid fonts"] = function(data,filename)
-- we can also move the names to data.luatex.names which might
-- save us some more memory (at the cost of harder tracing)
- if data.subfonts and table.is_empty(data.glyphs) then
+ if data.subfonts then
+ if data.glyphs and next(data.glyphs) then
+ logs.report("load otf","replacing existing glyph table due to subfonts")
+ end
local cidinfo = data.cidinfo
local verbose = fonts.verbose
if cidinfo.registry then
@@ -1355,7 +1358,7 @@ end
function otf.set_features(tfmdata,features)
local processes = { }
- if not table.is_empty(features) then
+ if features and next(features) then
local lists = {
fonts.triggers,
fonts.processors,
@@ -1430,14 +1433,14 @@ function otf.otf_to_tfm(specification)
--~ print(cache_id)
if not tfmdata then
local otfdata = otf.load(filename,format,sub,features and features.featurefile)
- if not table.is_empty(otfdata) then
+ if otfdata and next(otfdata) then
otfdata.shared = otfdata.shared or {
featuredata = { },
anchorhash = { },
initialized = false,
}
tfmdata = otf.copy_to_tfm(otfdata,cache_id)
- if not table.is_empty(tfmdata) then
+ if tfmdata and next(tfmdata) then
tfmdata.unique = tfmdata.unique or { }
tfmdata.shared = tfmdata.shared or { } -- combine
local shared = tfmdata.shared
@@ -1490,6 +1493,11 @@ end
-- we cannot share descriptions as virtual fonts might extend them (ok, we could
-- use a cache with a hash
+fonts.formats.dfont = "truetype"
+fonts.formats.ttc = "truetype"
+fonts.formats.ttf = "truetype"
+fonts.formats.otf = "opentype"
+
function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder the tma to unicode (nasty due to one->many)
if data then
local glyphs, pfminfo, metadata = data.glyphs or { }, data.pfminfo or { }, data.metadata or { }
@@ -1562,13 +1570,15 @@ function otf.copy_to_tfm(data,cache_id) -- we can save a copy when we reorder th
designsize = 100
end
local spaceunits = 500
- tfm.units = metadata.units_per_em or 1000
- -- we need a runtime lookup because of running from cdrom or zip, brrr
- tfm.filename = resolvers.findbinfile(luatex.filename,"") or luatex.filename
- tfm.fullname = metadata.fullname
+ -- we need a runtime lookup because of running from cdrom or zip, brrr (shouldn't we use the basename then?)
+ tfm.filename = fonts.tfm.checked_filename(luatex)
tfm.fontname = metadata.fontname
+ tfm.fullname = metadata.fullname or tfm.fontname
tfm.psname = tfm.fontname or tfm.fullname
+ tfm.name = tfm.filename or tfm.fullname or tfm.fontname
+ tfm.units = metadata.units_per_em or 1000
tfm.encodingbytes = 2
+ tfm.format = fonts.fontformat(tfm.filename,"opentype")
tfm.cidinfo = data.cidinfo
tfm.cidinfo.registry = tfm.cidinfo.registry or ""
tfm.type = "real"
@@ -1653,6 +1663,7 @@ function tfm.read_from_open_type(specification)
local s = specification.size
local m = otfdata.metadata.math
if m then
+ -- this will move to a function
local f = specification.features
if f then
local f = f.normal
@@ -1681,33 +1692,13 @@ function tfm.read_from_open_type(specification)
end
end
tfmtable = tfm.scale(tfmtable,s,specification.relativeid)
- -- here we resolve the name; file can be relocated, so this info is not in the cache
- local filename = (otfdata and otfdata.luatex and otfdata.luatex.filename) or specification.filename
- if not filename then
- -- try to locate anyway and set otfdata.luatex.filename
- end
- if filename then
- tfmtable.encodingbytes = 2
- tfmtable.filename = resolvers.findbinfile(filename,"") or filename
- tfmtable.fontname = tfmtable.fontname or otfdata.metadata.fontname
- tfmtable.fullname = tfmtable.fullname or otfdata.metadata.fullname or tfmtable.fontname
- local order = otfdata and otfdata.metadata.order2
- if order == 0 then
- tfmtable.format = 'opentype'
- elseif order == 1 then
- tfmtable.format = 'truetype'
- else
- tfmtable.format = specification.format
- end
- tfmtable.name = tfmtable.filename or tfmtable.fullname or tfmtable.fontname
- if tfm.fontname_mode == "specification" then
- -- not to be used in context !
- local specname = specification.specification
- if specname then
- tfmtable.name = specname
- if trace_defining then
- logs.report("define font","overloaded fontname: '%s'",specname)
- end
+ if tfm.fontname_mode == "specification" then
+ -- not to be used in context !
+ local specname = specification.specification
+ if specname then
+ tfmtable.name = specname
+ if trace_defining then
+ logs.report("define font","overloaded fontname: '%s'",specname)
end
end
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otn.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otn.lua
index 3aa1927d35f..d4f89adc6ec 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otn.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-otn.lua
@@ -123,6 +123,7 @@ results in different tables.</p>
local concat, insert, remove = table.concat, table.insert, table.remove
local format, gmatch, gsub, find, match, lower, strip = string.format, string.gmatch, string.gsub, string.find, string.match, string.lower, string.strip
local type, next, tonumber, tostring = type, next, tonumber, tostring
+local lpegmatch = lpeg.match
local otf = fonts.otf
local tfm = fonts.tfm
@@ -166,7 +167,7 @@ local zwj = 0x200D
local wildcard = "*"
local default = "dflt"
-local split_at_space = lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
+local split_at_space = lpeg.splitters[" "] or lpeg.Ct(lpeg.splitat(" ")) -- no trailing or multiple spaces anyway
local glyph = node.id('glyph')
local glue = node.id('glue')
@@ -2208,11 +2209,11 @@ otf.features.prepare = { }
-- document)
local function split(replacement,original,cache,unicodes)
- -- we can cache this too, but not the same
+ -- we can cache this too, but not the same (although unicode is a unique enough hash)
local o, t, n = { }, { }, 0
for s in gmatch(original,"[^ ]+") do
local us = unicodes[s]
- if type(us) == "number" then
+ if type(us) == "number" then -- tonumber(us)
o[#o+1] = us
else
o[#o+1] = us[1]
@@ -2221,7 +2222,7 @@ local function split(replacement,original,cache,unicodes)
for s in gmatch(replacement,"[^ ]+") do
n = n + 1
local us = unicodes[s]
- if type(us) == "number" then
+ if type(us) == "number" then -- tonumber(us)
t[o[n]] = us
else
t[o[n]] = us[1]
@@ -2579,6 +2580,46 @@ function prepare_contextchains(tfmdata)
end
end
end
+ elseif fmt == "glyphs" then
+ if lookuptype ~= "chainsub" and lookuptype ~= "chainpos" then
+ logs.report("otf process","unsupported coverage %s for %s",lookuptype,lookupname)
+ else
+ local contexts = contextchain[lookupname]
+ if not contexts then
+ contexts = { }
+ contextchain[lookupname] = contexts
+ end
+ local t = { }
+ for nofrules=1,#rules do
+ -- nearly the same as coverage so we could as well rename it
+ local rule = rules[nofrules]
+ local glyphs = rule.glyphs
+ if glyphs and glyphs.names then
+ local fore, back, names, sequence = glyphs.fore, glyphs.back, glyphs.names, { }
+ if fore and fore ~= "" then
+ fore = lpegmatch(split_at_space,fore)
+ uncover(fore,sequence,cache,unicodes)
+ end
+ local start = #sequence + 1
+ names = lpegmatch(split_at_space,names)
+ uncover(names,sequence,cache,unicodes)
+ local stop = #sequence
+ if back and back ~= "" then
+ back = lpegmatch(split_at_space,back)
+ uncover(back,sequence,cache,unicodes)
+ end
+ if sequence[1] then
+ t[#t+1] = { nofrules, lookuptype, sequence, start, stop, rule.lookups }
+ for unic, _ in next, sequence[start] do
+ local cu = contexts[unic]
+ if not cu then
+ contexts[unic] = t
+ end
+ end
+ end
+ end
+ end
+ end
end
end
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ott.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ott.lua
index d26c55f4b82..2be1bf06c00 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ott.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-ott.lua
@@ -672,13 +672,13 @@ local to_scripts = otf.tables.to_scripts
local to_languages = otf.tables.to_languages
local to_features = otf.tables.to_features
-for k, v in pairs(to_features) do
+for k, v in next, to_features do
local stripped = gsub(k,"%-"," ")
to_features[stripped] = v
local stripped = gsub(k,"[^a-zA-Z0-9]","")
to_features[stripped] = v
end
-for k, v in pairs(to_features) do
+for k, v in next, to_features do
to_features[lower(k)] = v
end
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-tfm.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-tfm.lua
index 4b217a3c407..31ae2cae1c2 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-tfm.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-tfm.lua
@@ -279,7 +279,7 @@ t.colorscheme = tfmtable.colorscheme
local characters = tfmtable.characters
local nameneeded = not tfmtable.shared.otfdata --hack
local changed = tfmtable.changed or { } -- for base mode
- local ischanged = not table.is_empty(changed)
+ local ischanged = changed and next(changed)
local indices = tfmtable.indices
local luatex = tfmtable.luatex
local tounicode = luatex and luatex.tounicode
@@ -704,6 +704,31 @@ function tfm.replacements(tfm,value)
-- tfm.characters[0x0060] = tfm.characters[0x2018]
end
+-- checking
+
+function tfm.checked_filename(metadata,whatever)
+ local foundfilename = metadata.foundfilename
+ if not foundfilename then
+ local askedfilename = metadata.filename or ""
+ if askedfilename ~= "" then
+ foundfilename = resolvers.findbinfile(askedfilename,"") or ""
+ if foundfilename == "" then
+ logs.report("fonts","source file '%s' is not found",askedfilename)
+ foundfilename = resolvers.findbinfile(file.basename(askedfilename),"") or ""
+ if foundfilename ~= "" then
+ logs.report("fonts","using source file '%s' (cache mismatch)",foundfilename)
+ end
+ end
+ elseif whatever then
+ logs.report("fonts","no source file for '%s'",whatever)
+ foundfilename = ""
+ end
+ metadata.foundfilename = foundfilename
+ -- logs.report("fonts","using source file '%s'",foundfilename)
+ end
+ return foundfilename
+end
+
-- status info
statistics.register("fonts load time", function()
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-xtx.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-xtx.lua
index 0fa2d696ab0..10062deed95 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-xtx.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-font-xtx.lua
@@ -90,6 +90,7 @@ otf.tables = otf.tables or { }
otf.tables.defaults = {
dflt = {
+ "calt",
"ccmp", "locl", "rlig", "liga", "clig",
"kern", "mark", "mkmk",
},
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-luat-ovr.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-luat-ovr.lua
index af5e05b364f..20d2b73dafc 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-luat-ovr.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-luat-ovr.lua
@@ -3,7 +3,7 @@ if not modules then modules = { } end modules ['luat-ovr'] = {
comment = "companion to luatex-*.tex",
author = "Khaled Hosny and Elie Roux",
copyright = "Luaotfload Development Team",
- license = "GPL"
+ license = "GNU GPL v2"
}
@@ -24,6 +24,16 @@ function logs.report(category,fmt,...)
end
end
+function logs.info(category,fmt,...)
+ if fmt then
+ write_nl(format("%s | %s: %s",name,category,format(fmt,...)))
+ elseif category then
+ write_nl(format("%s | %s",name,category))
+ else
+ write_nl(format("%s |",name))
+ end
+end
+
function logs.simple(fmt,...)
if fmt then
write_nl('log', format("%s | %s",name,format(fmt,...)))
diff --git a/Master/texmf-dist/tex/luatex/luaotfload/otfl-node-res.lua b/Master/texmf-dist/tex/luatex/luaotfload/otfl-node-res.lua
index 2657dfa1e71..a8ea8745a72 100644
--- a/Master/texmf-dist/tex/luatex/luaotfload/otfl-node-res.lua
+++ b/Master/texmf-dist/tex/luatex/luaotfload/otfl-node-res.lua
@@ -24,7 +24,7 @@ nodes.whatsits = { } -- table.swapped(node.whatsits())
local reserved = { }
local whatsits = nodes.whatsits
-for k, v in pairs(node.whatsits()) do
+for k, v in next, node.whatsits() do
whatsits[k], whatsits[v] = v, k -- two way
end