diff options
16 files changed, 1172 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/luatex/luavlna/README.md b/Master/texmf-dist/doc/luatex/luavlna/README.md new file mode 100644 index 00000000000..871d2900b49 --- /dev/null +++ b/Master/texmf-dist/doc/luatex/luavlna/README.md @@ -0,0 +1,119 @@ +# Luavlna, version v0.1b, 2018-05-31 + +# Introduction + +`Luavlna` is a small package for plain LuaTeX and LuaLaTeX. In some languages, +like Czech or Polish, there should be no single letter words at the +line end, according to the typographical norms. There exists some +external commands (like `vlna`) or packages (`encxvlna` for encTeX, +`xevlna` for XeTeX, `impnattypo` for LuaLaTeX). + +Other feature of this package is including of non-breakable space after initials, +like in personal names, after or before academic degrees +and between numbers and units (SI and others). + +The code is modified version of Patrick Gundlach’s answer on +TeX.sx[^1]. The difference is that it is possible to specify which +single letters should be taken into account for different +languages. +The support for degrees and units was added as well. + +# Usage + +The usage is simple: + + \input ucode + \uselanguage{czech} + %% in the case of luacsplain, use instead: + %% \chyph + %% but language code for Czech is different than in LaTeX or normal + %% LuaTeX, so you will need to set single letters with somethinh like: + %% \singlechars{5}{AIiVvOoUuSsZzKk} + \input luavlna + \preventsingledebugon + \input luaotfload.sty + \font\hello={name:Linux Libertine O:+rlig;+clig;+liga;+tlig} at 12pt + \hsize=3in + \hello + Příliš žluťoučký kůň úpěl ďábelské ódy. + Text s krátkými souhláskami a samohláskami i dalšími jevy + z nabídky možností (v textu možnými). + + I začátek odstavce je třeba řešit, i když výskyt zalomení není pravděpodobný. + + Co třeba í znaky š diakritikou? + + Různé možnosti [v závorkách <i jiných znacích + + Podpora iniciál a titulů: M. J. Hegel, Ing. Běháková, Ph.D., Ž. Zíbrt. + + Podpora jednotek: 100,5 MN\cdot{}s, 100.5 kJ, 200 µA, $-1$ dag, 12 MiB, 1 m$^3$/s. + + \preventsingledebugoff + \bye + + +It is also possible to use the package with lua, just use + + \usepackage{luavlna} + +in the preamble. + +# Commands + + \singlechars{language name}{letters} + +Enable this feature for certain letters in given language. + +Default values: + + %% only Czech and Slovak are supported out of the box + \singlechars{czech}{AIiVvOoUuSsZzKk} + \singlechars{slovak}{AIiVvOoUuSsZzKk} + + \compoundinitials{language name}{compounds} + +Declare compound letters for given language. Second argument should be comma +separated list of compound letters, in exact form in which they can appear. + +Default values: + + \compoundinitials{czech}{Ch} + +##Turning off language switching + +By default, language of the nodes is taken into account. If you want to use +settings for one language for a whole document, you can use following command: + + \preventsinglelang{language name} + +##Turning off processing + +If you want to stop processing of the spaces in the document you can use +command + + \preventsingleoff + +To resume processing, use + + \preventsingleon + +## Debugging commands + + \preventsingledebugon + \preventsingledebugoff + +Insert debugging marks on/off. Default off. + +# Authors + +Michal Hoftich +Miro Hrončok + +# License + +Permission is granted to copy, distribute and/or modify this software +under the terms of the LaTeX Project Public License, version 1.3. + +[^1]: + <http://tex.stackexchange.com/a/28128/2891> diff --git a/Master/texmf-dist/doc/luatex/luavlna/luavlna-doc.pdf b/Master/texmf-dist/doc/luatex/luavlna/luavlna-doc.pdf Binary files differnew file mode 100644 index 00000000000..b96633d362b --- /dev/null +++ b/Master/texmf-dist/doc/luatex/luavlna/luavlna-doc.pdf diff --git a/Master/texmf-dist/doc/luatex/luavlna/luavlna-doc.tex b/Master/texmf-dist/doc/luatex/luavlna/luavlna-doc.tex new file mode 100644 index 00000000000..7a4ac630657 --- /dev/null +++ b/Master/texmf-dist/doc/luatex/luavlna/luavlna-doc.tex @@ -0,0 +1,269 @@ +\documentclass[12pt]{ltxdoc} +%\documentclass{article} +%\usepackage[utf8]{luainputenc} +\usepackage{fontspec} +\setmainfont[Ligatures=TeX]{Linux Libertine O} +\usepackage[czech,english]{babel} +\usepackage{luacode} +\usepackage{amsfonts} +%\usepackage[]{polyglossia} +%\setmainlanguage{english} +%\setotherlanguage{czech} +%\usepackage{url} +\usepackage{hyperref} +%\input prevent-single +%\usepackage[]{prevent-single} +\usepackage[]{luavlna} +%\input prevent-single +%\def\preventsingledebugon{} +\newenvironment{mycode}{ + %\leavevmode% + \medskip% + \parindent=0pt% +}{\medskip} + +\ifdefined\version\else + \def\version{{{VERSION}}} + \let\gitdate\date +\fi + +\begin{document} +\title{The \verb|luavlna| package} +\author{Michal Hoftich (\url{michal.h21@gmail.com})\\Miro Hrončok (\url{miro@hroncok.cz})} +\date{Version \version\\\gitdate} +\maketitle +\tableofcontents +\section{Introduction} + + +This is a small package for plain Lua\TeX and Lua\LaTeX. In some languages, like +Czech or Polish, there should be no single letter words at the line +end, according to the typographical norms. There exists some +external commands (like \verb!vlna!) or packages (\verb!encxvlna! +for enc\TeX, \verb!xevlna! for Xe\TeX, +\verb!impnattypo! for Lua\LaTeX). %This package is for plain +%lua\TeX and for lua\LaTeX. + +Other feature of this package is including of non-breakable space after +initials, like in personal names, after or before academic degrees +and between numbers and units (SI and others). + +The code is modified version of Patrick Gundlach's answer on +TeX.sx\footnote{\url{http://tex.stackexchange.com/a/28128/2891}}. +The difference is that it is possible to specify which single letters +should be taken into account for different languages. +The support for degrees and units was added as well. +% The code works also for single letters at the beginning of the brackets. + + +\section{Usage} + +The usage is simple: + +\begin{verbatim} +\input ucode +\uselanguage{czech} +%% in the case of luacsplain, use instead: +%% \chyph +\input luavlna +\preventsingledebugon +\input luaotfload.sty +\font\hello={name:Linux Libertine O:+rlig;+clig;+liga;+tlig} at 12pt +\hsize=3in +\hello +Příliš žluťoučký kůň úpěl ďábelské ódy. +Text s krátkými souhláskami a samohláskami i dalšími jevy +z nabídky možností (v textu možnými). + +I začátek odstavce je třeba řešit, i když výskyt zalomení +není pravděpodobný. + +Co třeba í znaky š diakritikou? + +Různé možnosti [v závorkách <i jiných znacích + +Podpora iniciál a titulů: M. J. Hegel, Ing. Běháková, Ph.D., Ž. Zíbrt. + +Podpora jednotek: 100,5 MN\cdot{}s, 100.5 kJ, 200 µA, $-1$ dag, +12 MiB, 1 m$^3$/s. + +Uvnitř matematiky by mělo být zpracování vypnuté: $k \in \mathbb N$. +Pokračujeme v příkladu. + +\preventsingledebugoff +\bye +\end{verbatim} + +%\noindent\parbox{3in}{% + +\noindent +\begin{minipage}{3in} +\preventsingledebugon +\selectlanguage{czech} +Příliš \textit{žluťoučký kůň} úpěl ďábelské ódy. +Text s krátkými souhláskami a samohláskami i dalšími jevy z nabídky možností (v textu možnými). + +I začátek odstavce je třeba řešit, i když výskyt zalomení není pravděpodobný. + +Co třeba í znaky š diakritikou? + +Různé možnosti [v závorkách \textless i jiných znacích + +Podpora iniciál a titulů: M. J. Hegel, Ing. Běháková, Ph.D., Ž. Zíbrt. + +Podpora jednotek: 100,5 MN\cdot{}s, 100.5 kJ, 200 µA, $-1$ dag, 12 MiB, 1 m$^3$/s. + +Uvnitř matematiky by mělo být zpracování vypnuté: $k \in \mathbb N$. Pokračujeme v příkladu. + +\preventsingledebugoff +%} +\end{minipage} + +\selectlanguage{english} +\bigskip +It is also possible to use the package with Lua\LaTeX, just use + +\begin{verbatim} + \usepackage{luavlna} +\end{verbatim} + +in the preamble. + +\section{Commands} + +\begin{mycode} +\cmd{\singlechars}\marg{language name}\marg{letters} +\end{mycode} + +Enable this feature for certain letters in given language. +%Language code is internall \TeX\ code for the language, it is $0$ for English, +%$16$ for Czech. Please note that in \verb|csplain|, language code for Czech +%is $5$ and you will have to set it yourself. + +Default values: + +\begin{mycode} +\begin{verbatim} +%% only Czech and Slovak are supported out of the box +\singlechars{czech}{AIiVvOoUuSsZzKk} +\singlechars{slovak}{AIiVvOoUuSsZzKk} +\end{verbatim} +\end{mycode} + +%By default, all +%single letters are processed, this command can be used to pass a +%string of characters, which should be processed only. + +\begin{mycode} +\cmd{\compoundinitials}\marg{language name}\marg{compounds} +\end{mycode} + +Declare compound letters for given language. Second argument should be comma +separated list of compound letters, in exact form in which they can appear. + +Default values: + +\begin{mycode} +\begin{verbatim} +\compoundinitials{czech}{Ch,CH} +\end{verbatim} +\end{mycode} + +\subsection{Turning off language switching} + +By default, language of the nodes is taken into account. If you want to use +settings for one language for a whole document, you can use following command: + +\begin{mycode} +\cmd{\preventsinglelang}\marg{language name} +\end{mycode} + +\subsection{Turning off processing} + +If you want to stop processing of the spaces in the document you can use command + +\begin{mycode} +\cmd{\preventsingleoff} +\end{mycode} + +To resume processing, use + +\begin{mycode} +\cmd{\preventsingleon} +\end{mycode} + +You can also disable units and degrees processing: + +\begin{mycode} + \cmd{\nounits}\\ + \cmd{\nopredegrees}\\ + \cmd{\nosufdegrees} +\end{mycode} + +\subsection{Debugging commands} +\begin{mycode} +\cmd{\preventsingledebugon}\par +\cmd{\preventsingledebugoff} +\end{mycode} + +Insert debugging marks on/off. Default off. + +\section{Lua module \texttt{luavlna-langno.lua}} + +When we process glyph nodes with Lua\TeX\ callbacks, there are \verb|lang| +fields available. These are numerical codes of languages, but no information +about language names easily accesible from Lua side is available.\footnote{% + Language names are stored in \TeX macros like \verb|\string\l@langname|, but + different formats use different naming of these macros} +These numbers are format dependent, majority of formats like +Lua\LaTeX use \verb|language.dat| file provided by \verb|babel| +for assign numbers to languages, but for example \verb|csplain| +use its own system. + +To allow easy setting of language dependent parameters, \verb|langno| module +was created. It's purpose is to translate language code to language name and +the other way. Lua\LaTeX, Lua\TeX\ and CSplain formats are supported at the moment. + +\subsection{Recognized languages} +\subsubsection{Lua\TeX\ and Lua\LaTeX} + +File \verb|language.dat| is processed to load language names, aliases and assigned numbers. These language names are the same as supported by \verb|babel| package. + +\begin{quotation} + \small\noindent +\begin{luacode*} + langno = require "luavlna-langno" + function print_format_lang(fmt) + local luatex = langno.load_languages(fmt) + local t = {} + for k, v in pairs(luatex.names) do + t[#t+1]=k + end + table.sort(t) + tex.print(table.concat(t,", ")) + end + print_format_lang("luatex") +\end{luacode*} +\end{quotation} + +\subsubsection{CSplain} + +Different method is used. File \verb|hyphen.lan| is included in CSplain, where +language numbers are assigned to ISO-639-1 or ISO-639-2 language codes. +These language codes were then normalized to names used vy \verb|babel|, or +standard English language names. + +\begin{quotation} + \small\noindent + \begin{luacode*} + print_format_lang("csplain") + \end{luacode*} +\end{quotation} + + +\section{License} + +Permission is granted to copy, distribute and/or modify this software +under the terms of the LaTeX Project Public License, version 1.3. + +\end{document} diff --git a/Master/texmf-dist/doc/luatex/luavlna/luavlna.tex b/Master/texmf-dist/doc/luatex/luavlna/luavlna.tex new file mode 100644 index 00000000000..33134a800c9 --- /dev/null +++ b/Master/texmf-dist/doc/luatex/luavlna/luavlna.tex @@ -0,0 +1,104 @@ +% detect LaTeX and use the correct method for luatexbase inclusion +\ifx\RequirePackage\undefined + \input{luatexbase.sty}% +\else + \RequirePackage{luatexbase} +\fi + +\newluatexattribute\preventsinglestatus +% Modify pre_linebreak_filter callback so the spaces can be inserted +\directlua{% +luavlna = require "luavlna" +langno = require "luavlna-langno" +luatexbase.add_to_callback("pre_linebreak_filter", luavlna.preventsingle," ") + +local languages = langno.load_languages() +local get_lang_id = function(lang) + local langid = lang + if not tonumber(lang) then + langid = languages:get_number(lang) + end + return langid +end + +% Process string and make table of enabled single letters +% By default, spaces for all single letters are inserted +% This can be modified with \singlechars macro +set_singlechars = function(lang,chars) + local utf_gmatch = unicode.utf8.gmatch + % local langnumbers = languages.names + local langid = get_lang_id(lang) + if not langid then return nil, "Cannot find language number for: "..lang end + local chars = chars or "" + local singlechars = {} + local percent = string.char(37) + local alpha = percent .. "a" + for char in utf_gmatch(chars,"("..alpha..")") do + singlechars[char] = true + end + luavlna.singlechars(langid,singlechars) +end + +% set compound characters for initials handling +% useful for Czech "Ch" etc. +% comma separated list of compounds +set_compounds = function(lang, compounds) + local langid = get_lang_id(lang) + if not langid then return nil, "Cannot find language number for: "..lang end + local c = compounds:explode(",+") % match multiple colons as one + local compoundstable = {} + for _, compound in pairs(c) do + compoundstable[compound] = true + end + luavlna.initials(langid, compoundstable) +end + +set_main_language = function(lang) + local langid = languages:get_number(lang) + if not langid then return nil, "Cannot find language number for: "..lang end + luavlna.set_main_language(langid) +end +} + +% Set letters which are prevented from breaking +\def\singlechars#1#2{% +\directlua{set_singlechars("#1","#2")} +} + +% Define compound initials +\def\compoundinitials#1#2{% +\directlua{set_compounds("#1","#2")} +} +% Enable inserting of visual marks for debugging +\def\preventsingledebugon{% +\directlua{luavlna.debug(true)} +} + +\def\preventsinglelang#1{% + \directlua{set_main_language("#1")} +} + +\def\preventsingleon{% + \preventsinglestatus=2 +} + +\def\preventsingleoff{ + \preventsinglestatus=1 +} +% Disable inserting of visual marks for dewbugging +\def\preventsingledebugoff{% +\directlua{luavlna.debug(false)} +} + +% disable processing of units or degrees + +\def\nopredegrees{\directlua{luavlna.no_predegrees = true}} +\def\nosufdegrees{\directlua{luavlna.no_sufdegrees = true}} +\def\nounits{\directlua{luavlna.no_unit = true}} + +\ifdefined\nosingledefaults\else + \singlechars{czech}{AIiVvOoUuSsZzKk} + \singlechars{slovak}{AIiVvOoUuSsZzKk} + \compoundinitials{czech}{Ch,CH} +\fi + diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-csplain-langs.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-csplain-langs.lua new file mode 100644 index 00000000000..b061bee4297 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-csplain-langs.lua @@ -0,0 +1,59 @@ +return { +["spanish; castilian"]={26, 126}, +["magyar; hungarian"]={30, 130}, +["english; usenglish; american"]={100}, +["icelandic"]={42, 142}, +["basque"]={33, 133}, +["coptic"]={205}, +["catalan; valencian"]={204}, +["welsh"]={24, 124}, +["irish"]={34, 134}, +["armenian"]={210}, +["chinese"]={41, 141}, +["danish"]={25, 125}, +["turkish"]={31, 131}, +["interlingua "]={103}, +["slovak"]={6, 16, 116}, +["english; ukenglish; british"]={101}, +["ukrainian"]={209}, +["turkmen"]={47, 147}, +["sanskrit"]={207}, +["hindi"]={212}, +["lao"]={214}, +["finnish"]={29, 129}, +["assamese"]={211}, +["greek; polutonikogreek"]={203}, +["czech"]={5, 15, 115}, +["tamil"]={221}, +["italian"]={102}, +["french; francais; canadien; acadian"]={22, 122}, +["telugu"]={222}, +["croatian"]={40, 140}, +["panjabi; punjabi"]={220}, +["oriya"]={219}, +["russian"]={208}, +["malayalam"]={217}, +["marathi"]={218}, +["uppersorbian"]={43, 143}, +["portuges; portuguese; brazilian; brazil"]={38, 138}, +["galician"]={45, 145}, +["latvian"]={215}, +["afrikaans"]={44, 144}, +["lithuanian"]={216}, +["slovenian;slovene"]={28, 128}, +["mongolian"]={206}, +["greek; polutonikogreek"]={202}, +["latin"]={48, 148}, +["indonesian; indon; bahasai; bahasam; malay; meyalu"]={104}, +["polish"]={23, 123}, +["bokmål"]={35, 135}, +["dutch; flemish"]={37, 137}, +["greek; polutonikogreek"]={201}, +["norsk; nynorsk; norwegian"]={36, 136}, +["kannada"]={213}, +["estonian"]={32, 132}, +["english; usenglish; american; ukenglish; british; canadian; australian; newzealand"]={0}, +["romanian; moldavian; moldovan"]={39, 139}, +["german; germanb; ngerman; naustrian"]={21, 121}, +["kurdish"]={46, 146}, +} diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua new file mode 100644 index 00000000000..f4c654ff5fa --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-langno.lua @@ -0,0 +1,120 @@ +-- langno.lua +-- library for working with luatex's language numbers +-- glyph nodes have numerical lang field, but the language names for +-- these numbers aren't saved. +-- +-- this library tries to find language names by parsing `language.dat` file +-- + +local M = {} + +local tex = tex or {} + +local format = tex.formatname -- or "luatex" + +-- languages object +local lang_obj = function(names, numbers) + local obj = {} + obj.__index = obj + local self = setmetatable({},obj) + self.names = names + self.numbers = numbers + -- get language name by number + self.get_name = function(self, number) + return self.numbers[number] + end + -- get language number by name + self.get_number = function(self, name) + return self.names[name] + end + return self +end + + +-- default language loader, language.dat file is parsed +local load_lang_dat = function(start) + -- languages are saved in the file language.dat + local lang_dat = kpse.find_file("language.dat") + if not lang_dat then + return nil, "Cannot load file language.dat" + end + local f = io.open(lang_dat, "r") + local i = start or 0 + local numlang = {} -- return language name + local langnum = {} -- return language number + for line in f:lines() do + -- match comment, equal sign and first word on a line + local first, language = line:match("%s*([%%%=]?)([%a]*)") + if first ~="%" then -- ignore comments + langnum[language] = i + if first ~="=" then -- on lines starting with eq are language synonyms + --print(i, language) + numlang[i] = language + i = i + 1 + end + end + end + return lang_obj(langnum, numlang)--{numbers = numlang, names = langnum} +end + +local load_lang_dat_lualatex = function() + return load_lang_dat(1) +end + +local load_csplain= function() + local l = require "luavlna-csplain-langs" + local langnum = {} + local numlang = {} + for k, v in pairs(l) do + local first = k:gsub(" *;.*","") + --print(first) + langnum[first] = v + for _,i in ipairs(v) do + numlang[i] = first + end + end + return lang_obj(langnum, numlang) +end + + +-- because different formats may use different ways to load languages +-- driver mechanism is provided. +local drivers = {} +drivers["lualatex"] = load_lang_dat_lualatex +drivers["luatex"] = load_lang_dat +drivers["default"] = load_lang_dat +drivers["csplain"] = load_csplain +drivers["pdfcsplain"] = load_csplain +drivers["luaplain"] = load_csplain + +local load_languages = function(name) + local name = name or format + print ("Load driver: "..name) + local func = drivers[name] or drivers["default"] + if not func then return nil, "Cannot find driver function "..name end + return func() +end + +-- only load_languages function is provided to the outside world +M.load_languages = load_languages + +return M +--[[ + +-- sample usage: +local j = load_languages() +print(j:get_name(16)) +print(j:get_number("slovak")) +for k, v in pairs(j.numbers) do + print(k,v) +end +--]] + +-- this may be used in future, if I find a way how does local language.dat +-- affect language loading +-- load local language.dat +--[[ +local loc = kpse.var_value('TEXMFLOCAL') .. "tex/generic/config/language.dat" +local f, msg = io.open(loc, "r") +f:read("*all") +--]] diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-predegrees.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-predegrees.lua new file mode 100644 index 00000000000..995b00558f4 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-predegrees.lua @@ -0,0 +1,65 @@ +return { + "ak.", + "akad.", + "arch.", + "arm.", + "art.", + "Bc.", + "BcA.", + "brig.", + "čet.", + "des.", + "Dipl.-Ing.", + "doc.", + "dr.", + "Dr.", + "Dr.-Ing.", + "gen.", + "genmjr.", + "genplk.", + "genpor.", + "ICDr.", + "ing.", + "Ing.", + "JUDr.", + "kpt.", + "mal.", + "MDDr.", + "MgA.", + "Mgr.", + "mjr.", + "MSDr.", + "MUDr.", + "MVDr.", + "npor.", + "nprap.", + "nrtm.", + "nstržm.", + "PaedDr.", + "PharmDr.", + "PhDr.", + "PhMr.", + "plk.", + "por.", + "pplk.", + "ppor.", + "pprap.", + "prap.", + "prof.", + "RCDr.", + "RNDr.", + "RSDr.", + "RTDr.", + "rtm.", + "rtn.", + "soch.", + "stržm.", + "sv.", + "svob.", + "šprap.", + "št.", + "ThDr.", + "ThLic.", + "ThMgr.", + "voj.", +} diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-presi.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-presi.lua new file mode 100644 index 00000000000..99ff5285b69 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-presi.lua @@ -0,0 +1,30 @@ +return { + "Y", + "Yi", + "Z", + "Zi", + "E", + "Ei", + "P", + "Pi", + "T", + "Ti", + "G", + "Gi", + "M", + "Mi", + "k", + "Ki", + "h", + "da", + "d", + "c", + "m", + "µ", + "n", + "p", + "f", + "a", + "z", + "y", +} diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-si.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-si.lua new file mode 100644 index 00000000000..166eb7a1d25 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-si.lua @@ -0,0 +1,38 @@ +return { + "A", + "b", + "B", + "Bq", + "C", + "°C", + "cd", + "dag", + "eV", + "F", + "°F", + "g", + "Gy", + "H", + "Hz", + "J", + "K", + "kat", + "kg", + "lm", + "lx", + "m", + "mg", + "mol", + "N", + "Pa", + "rad", + "s", + "S", + "sr", + "Sv", + "T", + "V", + "W", + "Wb", + "Ω", +} diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna-sufdegrees.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna-sufdegrees.lua new file mode 100644 index 00000000000..0c326cc180c --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna-sufdegrees.lua @@ -0,0 +1,21 @@ +return { + "BBA", + "BLaw", + "BPA", + "BSc.", + "B.Th.", + "CSc.", + "DiS.", + "DSc.", + "LL.B.", + "LL.M.", + "MBA", + "MLaw", + "MMed.", + "MPA", + "MSc.", + "M.Th.", + "PhD.", + "Ph.D.", + "Th.D.", +} diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna.4ht b/Master/texmf-dist/tex/luatex/luavlna/luavlna.4ht new file mode 100644 index 00000000000..960e9e4de8a --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna.4ht @@ -0,0 +1,5 @@ +\directlua{ +luavlna.set_tex4ht() +} + +\endinput diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna.lua b/Master/texmf-dist/tex/luatex/luavlna/luavlna.lua new file mode 100644 index 00000000000..ce596bc2588 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna.lua @@ -0,0 +1,316 @@ +-- Module luavlna +-- code originally created by Patrick Gundlach +-- http://tex.stackexchange.com/q/27780/2891 +-- The code was adapted for plain TeX and added some more features +-- 1. It is possible to turn this functionality only for some letters +-- 2. Code now works even for single letters after brackets etc. +-- +local M = {} +local utf_match = unicode.utf8.match +local utf_char = unicode.utf8.char +local utf_len = unicode.utf8.len + +local glue_id = node.id "glue" +local glyph_id = node.id "glyph" +local hlist_id = node.id "hlist" +local vlist_id = node.id "vlist" +local math_id = node.id "math" +local period_char = string.byte(".") + +local alpha = string.char(37).."a" -- alpha class, entering +-- percent char directly caused error +local alphas = {} +local match_char = function(x) return utf_match(x,alpha) end +local match_table = function(x, chars) + local chars=chars or {} + return chars[x] +end +local singlechars = {} -- {a=true,i=true,z=true, v=true, u=true, o = true} + +local initials = {} + +local main_language = nil + +-- when main_language is set, we will not use lang info in the nodes, but +-- main language instead +local get_language = function(lang) + return main_language or lang +end + +local set_main_language = function(lang) + main_language = lang +end + +local debug = false +local tex4ht = false +-- Enable processing only for certain letters +-- must be table in the {char = true, char2=true} form +local set_singlechars= function(lang,c) + --print("Set single chars lua") + print(type(lang), lang) + if type(lang) == "table" then + for _,l in pairs(lang) do + print("language: ",l) + singlechars[l] = c + end + else + local lang = tonumber(lang) + print("language: ",lang) + -- for k,_ in pairs(c) do print(k) end + singlechars[lang] = c + end +end + +local set_initials = function(lang,c) + if type(lang) == "table" then + for _,l in pairs(lang) do + initials[l] = c + end + else + local lang = tonumber(lang) + initials[lang]=c + end +end + + +local debug_tex4ht = function(head,p) + --[[ local w = node.new("glyph") + w.lang = tex.lang + w.font = font.current() + w.char = 64 + ]] + --node.remove(head,node.prev(p)) + local w = node.new("whatsit", "special") + w.data = "t4ht=<span style='background-color:red;width:2pt;'> </span>" + return w, head +end + +local debug_node = function(head,p) + local w + if tex4ht then + w, head = debug_tex4ht(head,p) + else + w = node.new("whatsit","pdf_literal") + w.data = "q 1 0 1 RG 1 0 1 rg 0 0 m 0 5 l 2 5 l 2 0 l b Q" + end + node.insert_after(head,head,w) + node.insert_after(head,w,p) + -- return w +end + + +local set_debug= function(x) + debug = x +end + +local set_tex4ht = function() + tex4ht = true +end + +local insert_penalty = function(head) + local p = node.new("penalty") + p.penalty = 10000 + local debug = debug or false + if debug then + local w = debug_node(head,p) + else + node.insert_after(head,head,p) + end + return head +end + +local replace_with_thin_space = function(head) + local gluenode = node.new(node.id("glue")) + local gluespec = node.new(node.id("glue_spec")) + gluenode.width = tex.sp("0.2em") + -- gluenode.spec = gluespec + gluenode.next = head.next + gluenode.prev = head.prev + gluenode.next.prev = gluenode + gluenode.prev.next = gluenode + return gluenode +end + +local is_alpha = function(c) + local status = alphas[c] + if not status then + status = utf_match(c, alpha) + alphas[c] = status + end + return status +end + +-- find whether letter is uppercase +local up_table = {} +local is_uppercase= function(c) + if not is_alpha(c) then return false end + local status = up_table[c] + if status ~= nil then + return status + end + status = unicode.utf8.upper(c) == c + up_table[c] = status + return status +end + +local is_number = function(word) + return tonumber(string.sub(word, -1)) ~= nil +end + +local init_buffer = "" +local is_initial = function(c, lang) + return is_uppercase(c) +end + +local cut_off_end_chars = function(word, dot) + local last = string.sub(word, -1) + while word ~= "" and (not dot or last ~= ".") and not is_alpha(last) do + word = string.sub(word, 1, -2) -- remove last char + last = string.sub(word, -1) + end + return word +end + +local part_until_non_alpha = function(word) + for i = 1, #word do + local c = word:sub(i,i) + if not is_alpha(c) then + word = string.sub(word, 1, i-1) + break + end + end + return word +end + + +function Set (list) + local set = {} + for _, l in ipairs(list) do set[l] = true end + return set +end + + +local presi = (require "luavlna-presi") +local si = Set(require "luavlna-si") + +local is_unit = function(word) + if M.no_unit==true then return false end + word = part_until_non_alpha(word) + if si[word] then + return true + end + for _, prefix in pairs(presi) do + s, e = string.find(word, prefix) + if s == 1 then + local unit = string.sub(word, e+1) + if si[unit] then + return true + end + end + end + return false +end + +local predegrees = Set (require "luavlna-predegrees") +local sufdegrees = Set (require "luavlna-sufdegrees") + +local function prevent_single_letter (head) + local singlechars = singlechars -- or {} + -- match_char matches all single letters, but this method is abbandoned + -- in favor of using table with enabled letters. With this method, multiple + -- languages are supported + local test_fn = match_table -- singlechars and match_table or match_char + local space = true + local init = false + local anchor = head + local wasnumber = false + local word = "" + local no_predegrees = M.no_predegrees + local no_sufdegrees = M.no_sufdegrees + local in_math = false + while head do + local id = head.id + local nextn = head.next + local skip = node.has_attribute(head, luatexbase.attributes.preventsinglestatus) + if id == math_id then + if head.subtype == 0 then + word = "" + in_math = true + else + in_math = false + if is_number(word) then wasnumber = true end + word = "" + end + end + if skip ~= 1 and not in_math then + if id == glue_id then + if wasnumber then + if word ~= "" then + wasnumber = false + word = cut_off_end_chars(word, false) + if is_unit(word) then + anchor = replace_with_thin_space(anchor) + insert_penalty(anchor.prev) + end + end + elseif is_number(word) then + wasnumber = true + else + word = cut_off_end_chars(word, true) + if no_predegrees ~= true and predegrees[word] then + insert_penalty(head.prev) + elseif no_sufdegrees ~= true and sufdegrees[word] then + insert_penalty(anchor.prev) + end + end + space=true + anchor = head + word = "" + init = is_initial " " -- reset initials + elseif space==true and id == glyph_id and is_alpha(utf_char(head.char)) then -- a letter + local lang = get_language(head.lang) + local char = utf_char(head.char) + word = char + init = is_initial(char,lang) + local s = singlechars[lang] or {} -- load singlechars for node's lang + --[[ + for k, n in pairs(singlechars) do + for c,_ in pairs(n) do + --print(type(k), c) + end + end + --]] + if test_fn(char, s) and nextn ~= nil and nextn.id == glue_id then -- only if we are at a one letter word + head = insert_penalty(head) + end + space = false + -- handle initials + -- uppercase letter followed by period (code 46) + elseif init and head.id == glyph_id and head.char == period_char and nextn.id == glue_id and utf_len(word) == 1 then + head = insert_penalty(head) + elseif head.id == glyph_id then + local char = utf_char(head.char) + word = word .. char + init = is_initial(char, head.lang) + -- hlist support + elseif head.id == hlist_id then + prevent_single_letter(head.head) + -- vlist support + elseif head.id == vlist_id then + prevent_single_letter(head.head) + end + elseif id == glyph_id and in_math then + word = word .. utf_char(head.char) + end + head = head.next + end + return true +end + +M.preventsingle = prevent_single_letter +M.singlechars = set_singlechars +M.initials = set_initials +M.set_tex4ht = set_tex4ht +M.debug = set_debug +M.set_main_language = set_main_language +return M diff --git a/Master/texmf-dist/tex/luatex/luavlna/luavlna.sty b/Master/texmf-dist/tex/luatex/luavlna/luavlna.sty new file mode 100644 index 00000000000..059c260ea11 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/luavlna/luavlna.sty @@ -0,0 +1,24 @@ +\ProvidesPackage{luavlna}[2017/09/30 luavlna] + +\def\nosingledefaults{\relax} +\input luavlna + +\def\singlechars#1#2{% + \ifcsname l@#1\endcsname% + \expandafter\directlua\expandafter{set_singlechars("\the\csname l@#1\endcsname","#2")}% + \fi% +} + +% Define compound initials +\def\compoundinitials#1#2{% + \ifcsname l@#1\endcsname% + \expandafter\directlua\expandafter{set_compounds("\the\csname l@#1\endcsname","#2")}% + \fi% +} + +\AtBeginDocument{% + \singlechars{czech}{AIiVvOoUuSsZzKk} + \singlechars{slovak}{AIiVvOoUuSsZzKk} + \compoundinitials{czech}{Ch,CH} +} +\endinput diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index e4ebfdd704e..68f28607dd5 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -406,7 +406,7 @@ my @TLP_working = qw( lualatex-math lualibs luamesh luamplib luaotfload luapackageloader luasseq luatex85 luatexbase luatexja luatexko luatextra - luatodonotes luaxml + luatodonotes luavlna luaxml lwarp lxfonts ly1 lyluatex m-tx macros2e macroswap mafr magaz mailing mailmerge make4ht makebarcode makebase makebox makecell makecirc makecmds diff --git a/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc b/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc index d53edfc101e..503e04f9a3f 100644 --- a/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc @@ -32,6 +32,7 @@ depend luatex85 depend luatexbase depend luatexko depend luatextra +depend luavlna depend luaxml depend nodetree depend odsfile diff --git a/Master/tlpkg/tlpsrc/luavlna.tlpsrc b/Master/tlpkg/tlpsrc/luavlna.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/luavlna.tlpsrc |