From ad4e4e52ae85ee5957d6a67c251a965b93679298 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 13 May 2021 03:01:14 +0000 Subject: CTAN sync 202105130301 --- macros/luatex/latex/lua-ul/docstrip-luacode.sty | 2 +- macros/luatex/latex/lua-ul/lua-ul.dtx | 100 +++++++++++++++++++++++- macros/luatex/latex/lua-ul/lua-ul.pdf | Bin 101260 -> 103958 bytes 3 files changed, 100 insertions(+), 2 deletions(-) (limited to 'macros/luatex/latex/lua-ul') diff --git a/macros/luatex/latex/lua-ul/docstrip-luacode.sty b/macros/luatex/latex/lua-ul/docstrip-luacode.sty index fe5c1b4f75..f3a2136a6a 100644 --- a/macros/luatex/latex/lua-ul/docstrip-luacode.sty +++ b/macros/luatex/latex/lua-ul/docstrip-luacode.sty @@ -13,7 +13,7 @@ \NeedsTeXFormat{LaTeX2e} \ProvidesPackage {docstrip-luacode} - [2021/04/25 v0.1.3 Directly execute Lua code from DocStrip files] + [2021/05/12 v0.1.4 Directly execute Lua code from DocStrip files] \expanded{% \def\noexpand\docstrip@luacode@argscanner#1\directlua{ tex.sprint(\the\catcodetable@string, "\string\\end{docstrip-luacode}") diff --git a/macros/luatex/latex/lua-ul/lua-ul.dtx b/macros/luatex/latex/lua-ul/lua-ul.dtx index dde61f9636..edaf0f3ca4 100644 --- a/macros/luatex/latex/lua-ul/lua-ul.dtx +++ b/macros/luatex/latex/lua-ul/lua-ul.dtx @@ -29,6 +29,7 @@ \generate{% \file{lua-ul.lua}{\from{lua-ul.dtx}{luacode}}% \file{pre_append_to_vlist_filter.lua}{\from{lua-ul.dtx}{callback}}% + \file{lua-ul-patches-preserve-attr.lua}{\from{lua-ul.dtx}{preserve-attr}}% } \let\MetaPrefix\DoubleperCent \generate{\file{lua-ul.sty}{\from{lua-ul.dtx}{package}}} @@ -277,6 +278,98 @@ luatexbase.create_callback('pre_append_to_vlist_filter', \end{docstrip-luacode} % % \fi +% +% \changes{0.1.4}{2021-05-12}{Add \texttt{lua-ul-patches-preserve-attr}} +% \changes{0.1.4}{2021-05-12}{Patch \texttt{\protect\string\protect\sw@slant}} +% Additionally we have a module \verb+lua-ul-patches-preserve-attr+ for patches of +% external code to make it more compatible with attribute usage. +% +% Currently this only caontains redefinitions of kernel commands. +% \iffalse +%<*gobble> +\begin{docstrip-luacode}{lua-ul-patches-preserve-attr} +% +%<*preserve-attr> +% \fi +% First some local definitions +% \begin{macrocode} +local getfont = font.getfont + +local direct = node.direct + +local getattr = direct.getattributelist +local getid = direct.getid +local getpenalty = direct.getpenalty +local getprev = direct.getprev +local getwidth = direct.getwidth + +local setattr = direct.setattributelist +local setkern = direct.setkern + +local insert_after = direct.insert_after +local is_glyph = direct.is_glyph +local newnode = direct.new +local todirect = direct.todirect +local tonode = direct.tonode + +local glue_id = node.id'glue' +local kern_t = node.id'kern' +local penalty_id = node.id'penalty' + +local italcorr_sub +for i, n in next, node.subtypes'kern' do + if n == 'italiccorrection' then italcorr_sub = i break end +end +assert(italcorr_sub) + +local nests = tex.nest + +% \end{macrocode} +% +% Now we come to the interesting part: We redefine \verb+\sw@slant+ from the +% \LaTeX\ kernel. The original definition uses \verb+\unskip+ and +% \verb+\unpenalty+ to remove glue and penalties and then inserts italic +% correction before them. Then it inserts the removed penalty and skip again. +% This looses the right subtype, attributes and properties of the removed +% nodes, so we insert the italic correction kern directly at the right position +% instead. When the character does not exists we still add a 0pt italic +% correction to stay as compatible as possible with the \verb+\/+ primitive +% used in the original implementation. +% \begin{macrocode} +local funcid = luatexbase.new_luafunction'sw@slant' +token.set_lua('sw@slant', funcid, 'protected') +lua.get_functions_table()[funcid] = function() + local nest = nests.top + local tail, after = todirect(nest.tail), nil + local id = getid(tail) + if id == glue_id then + if getwidth(tail) == 0 then return end + tail, after = getprev(tail), tail + id = getid(tail) + end + if id == penalty_id then + if getpenalty(tail) == 0 then return end + tail, after = getprev(tail), tail + end + local cid, fontid = is_glyph(tail) + if not cid then return end + local fontdir = getfont(fontid) + local characters = fontdir and fontdir.characters + local char = characters and characters[cid] + local kern = newnode(kern_t, italcorr_sub) + setkern(kern, char and char.italic or 0) + setattr(kern, getattr(tail)) +% We lie about the head and ignore the return value since tail is never nil + insert_after(tail, tail, kern) + if not after then nest.tail = tonode(kern) end +end +% \end{macrocode} +% \iffalse +% +%<*gobble> +\end{docstrip-luacode} +% +% \fi % \subsection{Lua module} % Now we can define our main Lua module: % \iffalse @@ -818,6 +911,11 @@ luatexbase.add_to_callback('vpack_filter', return tonode(head) end, 'add underlines to list') % \end{macrocode} +% \changes{0.1.4}{2021-05-12}{Load \texttt{lua-ul-patches-preserve-attr}} +% Finally load \texttt{lua-ul-patches-preserve-attr}. +% \begin{macrocode} +require'lua-ul-patches-preserve-attr' +% \end{macrocode} % \iffalse % %<*gobble> @@ -831,7 +929,7 @@ luatexbase.add_to_callback('vpack_filter', \NeedsTeXFormat{LaTeX2e} \ProvidesPackage {lua-ul} - [2021/04/25 v0.1.3 Underlining and related functionality for LuaTeX] + [2021/05/12 v0.1.4 Underlining and related functionality for LuaTeX] % \fi % Only \LuaLaTeX{} is supported. diff --git a/macros/luatex/latex/lua-ul/lua-ul.pdf b/macros/luatex/latex/lua-ul/lua-ul.pdf index 537315bdf4..b59518bd9e 100644 Binary files a/macros/luatex/latex/lua-ul/lua-ul.pdf and b/macros/luatex/latex/lua-ul/lua-ul.pdf differ -- cgit v1.2.3