diff options
Diffstat (limited to 'macros/luatex/latex/lua-ul/lua-ul.dtx')
-rw-r--r-- | macros/luatex/latex/lua-ul/lua-ul.dtx | 122 |
1 files changed, 91 insertions, 31 deletions
diff --git a/macros/luatex/latex/lua-ul/lua-ul.dtx b/macros/luatex/latex/lua-ul/lua-ul.dtx index 14aa2fae0a..ad57f41b67 100644 --- a/macros/luatex/latex/lua-ul/lua-ul.dtx +++ b/macros/luatex/latex/lua-ul/lua-ul.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% Copyright (C) 2020 by Marcel Krueger +%% Copyright (C) 2020-2021 by Marcel Krueger %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either @@ -62,7 +62,7 @@ % \duck % \end{tikzpicture}§ % }} -% \newcommand\underDuck[1]{{\beginUnderDuck#1}} +% \NewDocumentCommand\underDuck{m}{{\beginUnderDuck#1}} % \newunderlinetype\beginUnderWavy[\number\dimexpr1ex]{\cleaders\hbox{§ % \setlength\unitlength{.3ex}§ % \begin{picture}(4,0)(0,1) @@ -72,11 +72,11 @@ % \qbezier(2,0)(3,-1)(4,0) % \end{picture}§ % }} -% \newcommand\underWavy[1]{{\beginUnderWavy#1}} +% \NewDocumentCommand\underWavy{m}{{\beginUnderWavy#1}} % \newunderlinetype\beginStrikeThough{\leaders\hbox{§ % \normalfont\bfseries/§ % }} -% \newcommand\StrikeThough[1]{{\beginStrikeThough#1}} +% \NewDocumentCommand\StrikeThough{m}{{\beginStrikeThough#1}} % % \newcommand\Luaul{Lua-UL} % \newcommand\luaul{Lua-UL} @@ -160,7 +160,7 @@ % you will have to define this manually.) % The optional argument provides a \enquote{context}: This \enquote{context} has to expand to a string % (something that can appear in a csname) which changes if the leaders box should be recalculated. -% The leader will be chached and reused whenever the context evaluates to the same string. +% The leader will be cached and reused whenever the context evaluates to the same string. % So if your leaders should depend on the fontsize, % the expansion of the context should contain the font size. If you leaders contain text in the current font, % your context should include \verb+\fontname+. The default context includes the current size of \texttt{1ex} @@ -168,7 +168,7 @@ % % The final argument contains the actual leader command. You should omit the final glue normally passed to \verb+\leaders+, % so e.g.\ write \verb+\leaders\hbox{ . }+ without appending \verb+\hfill+ or \verb+\hskip1pt+ etc. -% In most cases, the height and depth of your underlines is passed on to TeX to ensure that a deep underline does not interept other lines. +% In most cases, the height and depth of your underlines is passed on to TeX to ensure that a deep underline does not intercept other lines. % On the other hand, running dimensions work fine if you use a rule. % % For example, the special underline commands demonstrated above are implemented as @@ -180,7 +180,7 @@ % \duck % \end{tikzpicture}% % }} -% \newcommand\underDuck[1]{{\beginUnderDuck#1}} +% \NewDocumentCommand\underDuck{m}{{\beginUnderDuck#1}} % \newunderlinetype\beginUnderWavy[\number\dimexpr1ex]{\cleaders\hbox{% % \setlength\unitlength{.3ex}% % \begin{picture}(4,0)(0,1) @@ -190,11 +190,11 @@ % \qbezier(2,0)(3,-1)(4,0) % \end{picture}% % }} -% \newcommand\underWavy[1]{{\beginUnderWavy#1}} +% \NewDocumentCommand\underWavy{m}{{\beginUnderWavy#1}} % \newunderlinetype\beginStrikeThough{\leaders\hbox{% % \normalfont\bfseries/% % }} -% \newcommand\StrikeThough[1]{{\beginStrikeThough#1}} +% \NewDocumentCommand\StrikeThough{m}{{\beginStrikeThough#1}} % \end{verbatim} % % Here \verb+\underWavy+ uses a custom context because it doesn't change depending on the current font color. @@ -234,7 +234,7 @@ local callback_define % so we use the debug library to get the ``real'' \verb+callback.define+: % \begin{macrocode} for i=1,5 do - local name, func = debug.getupvalue(luatexbase.disable_callback, i) +local name, func = require'debug'.getupvalue(luatexbase.disable_callback, i) if name == 'callback_register' then callback_define = func break @@ -298,6 +298,7 @@ local has_attribute = node.direct.has_attribute local set_attribute = node.direct.set_attribute local dimensions = node.direct.dimensions local flush_node = node.direct.flush_node +local getattr = node.direct.getattributelist local getboth = node.direct.getboth local getfield = node.direct.getfield local getglue = node.direct.getglue @@ -318,6 +319,7 @@ local setlink = node.direct.setlink local hpack = node.direct.hpack local setfield = node.direct.setfield local slide = node.direct.slide +local setattr = node.direct.setattributelist local setglue = node.direct.setglue local setnext = node.direct.setnext local setshift = node.direct.setshift @@ -358,7 +360,7 @@ end local texnest = tex.nest % \end{macrocode} -% \changes{0.1.0}{2020-07-13}{Ensure that \texttt{\string\everyhbox} doesn't interfere with hlist scanning} +% \changes{0.1.0}{2020-07-13}{Ensure that \texttt{\protect\string\protect\everyhbox} doesn't interfere with hlist scanning} % To avoid influence from \texttt{\string\everyhbox} we reset \texttt{\string\everyhbox} to an empty token list directly before scanning. % As an added complication, we need to use a name which is guaranteed to be the primitive tokenlist and we % might have to restore it before reading the actual argument (There might be a reason why \texttt{\string\everyhbox} was sat after all. @@ -559,7 +561,7 @@ end % \end{macrocode} % \changes{0.0.3}{2020-03-17}{Make streight lines over hboxes} % \changes{0.0.4}{2020-03-31}{Consistently respect height and depth} -% Now the actual undelining +% Now the actual underlining % \begin{macrocode} local add_underline_hlist, add_underline_hbox, add_underline_vbox local function add_underline_vlist(head, attr, outervalue) @@ -658,11 +660,33 @@ function add_underline_hlist(head, attr, outervalue) stretch_order, shrink_order = fil_levels(head) end if last_value then +% \end{macrocode} +% \changes{0.1.1}{2022-02-02}{Set attributes for negative glue node} +% If the value changed and the old one wasn't \texttt{nil}, then we reached +% the end of the previous underlined segment and therefore know it's length. +% Therefore we can finally insert the underline. +% +% Currently both the underline and the corresponding negative glue inherit +% the attributes from when the underline was defined. This makes sure that +% these nodes get consistent attributes (avoiding e.g. that only one of the +% nodes being picked up in a later pass and therefore interfering with the +% underlining) and that these are as much as possible under use control. +% +% We can't really predict what the most sensible value for attributes we +% don't control is, but by using this way any issues should be fixable with +% by adjusting the context argument. +% +% Currently this block gets duplicated a few lines down for the end of the +% list. This should get refactored into it's own function, but I have to be +% careful to handle all the special cases there. +% +% \begin{macrocode} local glue = new_glue_neg_dimensions(first, n, stretch_order, shrink_order) local w, st, sh = getglue(glue) local lead = nodecopy(underline_types[last_value]) setglue(lead, -w, -st, -sh, stretch_order, shrink_order) + setattr(glue, getattr(lead)) if underline_over_flag[last_value] then head = insert_before(head, n, glue) insert_after(head, glue, lead) @@ -690,6 +714,7 @@ function add_underline_hlist(head, attr, outervalue) local w, st, sh = getglue(glue) local lead = nodecopy(underline_types[last_value]) setglue(lead, -w, -st, -sh, stretch_order, shrink_order) + setattr(glue, getattr(lead)) if underline_over_flag[last_value] then insert_before(head, nil, glue) insert_after(head, glue, lead) @@ -791,7 +816,7 @@ luatexbase.add_to_callback('vpack_filter', \NeedsTeXFormat{LaTeX2e} \ProvidesPackage {lua-ul} - [2020/07/13 v0.1.0 Underlining and related functionality for LuaTeX] + [2021/02/02 v0.1.1 Underlining and related functionality for LuaTeX] % \fi % Only \LuaLaTeX{} is supported. @@ -851,6 +876,7 @@ luatexbase.add_to_callback('vpack_filter', \ifluaul@predefined % \end{macrocode} % \changes{0.0.2}{2020-03-15}{Allow \texttt{\protect\string\protect\highLight} color customization} +% \changes{0.1.1}{2022-02-02}{Make color mechanism more generic} % For \verb+\highLight+, the color should be customizable. % There are two cases: If \verb+xcolor+ is not loaded, we just accept % a simple color name. Otherwise, we accept color as documented in @@ -861,15 +887,22 @@ luatexbase.add_to_callback('vpack_filter', \def\luaul@@setcolor\xcolor@#1#2{} \newcommand\luaul@setcolor[1]{% \ifx\XC@getcolor\undefined - \def\luaul@highlight@currentcolor{#1}% + \def\luaul@currentcolor{#1}% \else \begingroup \XC@getcolor{#1}\luaul@tmpcolor \expanded{\endgroup - \def\noexpand\luaul@highlight@currentcolor{% + \def\noexpand\luaul@currentcolor{% \expandafter\luaul@@setcolor\luaul@tmpcolor}}% \fi } + \newcommand\luaul@applycolor{% + \ifx\XC@getcolor\undefined + \color{\luaul@currentcolor}% + \else + \expandafter\XC@undeclaredcolor\luaul@currentcolor + \fi + } % \end{macrocode} % Now a user-level command to set the default color. % \begin{macrocode} @@ -877,27 +910,38 @@ luatexbase.add_to_callback('vpack_filter', \edef\luaul@highlight@color{\IfValueTF{#1}{[#1]{#2}}{#2}}% } % \end{macrocode} +% \changes{0.1.1}{2020-03-15}{Use \texttt{xparse} for all user commands} +% \changes{0.1.1}{2021-02-02}{Optionally color \texttt{\protect\string\protect\strikeThrough}} % The sizes for the predefined commands are stolen from the \enquote{soul} % default values. % \begin{macrocode} - \newunderlinetype\@underLine% - {\leaders\vrule height -.65ex depth .75ex} - \newcommand\underLine[1]{{\@underLine#1}} - \newunderlinetype\@strikeThrough% - {\leaders\vrule height .55ex depth -.45ex} - \newcommand\strikeThrough[1]{{\@strikeThrough#1}} + \newunderlinetype\@underLine{% + \leaders\vrule height -.65ex depth .75ex + } + \NewDocumentCommand\underLine{m}{{\@underLine#1}} + + \newunderlinetype\@strikeThrough{% + \leaders\vrule height .55ex depth -.45ex + } + \newunderlinetype\colored@strikeThrough[\number\dimexpr1ex@% + \luaul@currentcolor]{% + \luaul@applycolor + \leaders\vrule height .55ex depth -.45ex + } + \NewDocumentCommand\strikeThrough{om}{{% + \IfValueTF{#1}{% + \luaul@setcolor{#1}% + \colored@strikeThrough + }\@strikeThrough% + #2% + }} \newunderlinetype\@highLight[\number\dimexpr1ex@% - \luaul@highlight@currentcolor]% - {% - \ifx\XC@getcolor\undefined - \color{\luaul@highlight@currentcolor}% - \else - \expandafter\XC@undeclaredcolor\luaul@highlight@currentcolor - \fi - \leaders\vrule height 1.75ex depth .75ex - } - \newcommand\highLight[2][\luaul@highlight@color]{{% + \luaul@currentcolor]{% + \luaul@applycolor + \leaders\vrule height 1.75ex depth .75ex + } + \NewDocumentCommand\highLight{O{\luaul@highlight@color}m}{{% \luaul@setcolor{#1}% \@highLight#2% }} @@ -933,6 +977,22 @@ luatexbase.add_to_callback('vpack_filter', } \fi % \end{macrocode} +% \changes{0.1.1}{2021-02-02}{Patch \texttt{\protect\string\protect\output}} +% In the output routine, the page box is repacked before \verb+\reset@font+ is +% called, so we have to ensure to reset the attributes before that. This will +% use some awesome output routine hook as soon as that's in the kernel, until +% then manual patching it is. +% +% At the time I am writing this the remaining code of the package contains +% exactly ten times \verb+\expandafter+. Interestingly, that's also exactly +% the number of \verb+\expandafter+s we use here. +% \begin{macrocode} +\output\expandafter\expandafter\expandafter{% + \expandafter\expandafter\expandafter\LuaULResetUnderline + \expandafter\expandafter\expandafter*% + \expandafter\@firstofone\the\output% +} +% \end{macrocode} % \iffalse %</package> % \fi |