summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/lua-ul/lua-ul.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/lua-ul/lua-ul.dtx')
-rw-r--r--macros/luatex/latex/lua-ul/lua-ul.dtx100
1 files changed, 99 insertions, 1 deletions
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}
%</gobble>
% \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}
+%</gobble>
+%<*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
+%</preserve-attr>
+%<*gobble>
+\end{docstrip-luacode}
+%</gobble>
+% \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
%</luacode>
%<*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.