texlive[63551] Master: showkerning (11jun22)

commits+karl at tug.org commits+karl at tug.org
Sat Jun 11 22:42:42 CEST 2022


Revision: 63551
          http://tug.org/svn/texlive?view=revision&revision=63551
Author:   karl
Date:     2022-06-11 22:42:42 +0200 (Sat, 11 Jun 2022)
Log Message:
-----------
showkerning (11jun22)

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/lualatex/showkerning/
    trunk/Master/texmf-dist/doc/lualatex/showkerning/DEPENDS.txt
    trunk/Master/texmf-dist/doc/lualatex/showkerning/README.md
    trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.pdf
    trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.tex
    trunk/Master/texmf-dist/tex/lualatex/showkerning/
    trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.lua
    trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.sty
    trunk/Master/tlpkg/tlpsrc/showkerning.tlpsrc

Added: trunk/Master/texmf-dist/doc/lualatex/showkerning/DEPENDS.txt
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/showkerning/DEPENDS.txt	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/lualatex/showkerning/DEPENDS.txt	2022-06-11 20:42:42 UTC (rev 63551)
@@ -0,0 +1 @@
+ifluatex
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/lualatex/showkerning/DEPENDS.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/lualatex/showkerning/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/showkerning/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/lualatex/showkerning/README.md	2022-06-11 20:42:42 UTC (rev 63551)
@@ -0,0 +1,21 @@
+The package displays all kerning values in the form of
+colored bars directly at the respective position in the
+document. Positive values are displayed in green, negative
+values in red. The width of the bars corresponds exactly
+to the respective kerning value.
+By option the bars can be placed behind or in front of the
+glyphs.
+The package requires LuaLaTeX.
+
+Copyright (c) 2022 Thomas Kelkel kelkel at emaileon.de
+
+The files of this package may be distributed and/or
+modified under the conditions of the LaTeX Project
+Public License, either version 1.3c of this license
+or (at your option) any later version. The latest
+version of this license is in
+
+   http://www.latex-project.org/lppl.txt
+
+and version 1.3c or later is part of all distributions
+of LaTeX version 2009/09/24 or later.
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/lualatex/showkerning/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.pdf	2022-06-11 20:42:22 UTC (rev 63550)
+++ trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.pdf	2022-06-11 20:42:42 UTC (rev 63551)

Property changes on: trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.tex
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.tex	2022-06-11 20:42:42 UTC (rev 63551)
@@ -0,0 +1,400 @@
+\documentclass[
+ukenglish,%
+twoside=false,%
+fontsize=10pt,%
+bibliography=totoc,%
+numbers=autoenddot,%
+headings=normalsize,%
+overfullrule,%
+headings=optiontotoc,%
+]
+{scrartcl}
+
+\makeatletter
+\providecommand\@ix{9.6}
+\providecommand\@xi{10.4}
+\providecommand\@xiii{13.15}
+\def\subfootnotesize{%
+    \@setfontsize%
+    \subfootnotesize%
+    {7.6}{8}%
+}
+\def\supernormalsize{%
+    \@setfontsize%
+    \supernormalsize%
+    \@xi{12}%
+}
+\def\subnormalsize{%
+    \@setfontsize%
+    \subnormalsize%
+    \@ix{11}%
+}
+\def\sublarge{%
+    \@setfontsize%
+    \sublarge%
+    {11.2}{13}%
+}
+\def\superlarge{%
+    \@setfontsize%
+    \superlarge%
+    \@xiii{16}%
+}
+\makeatother
+
+\newcommand*{\sectionas}{2.3ex plus .2ex}
+\newcommand*{\sectionbs}{-3.5ex plus -1ex minus -.2ex}
+\newcommand*{\sectiontbs}{3.6pt}
+\newcommand*{\subsectiontbs}{1.2pt}
+\newcommand*{\subsectionas}{1.5ex plus .2ex}
+\newcommand*{\subsectionbs}{-3.25ex plus -1ex minus -.2ex}
+\newcommand*{\subsubsectionas}{\subsectionas}
+\newcommand*{\subsubsectionbs}{\subsectionbs}
+\newcommand*{\paragraphas}{-1em}
+\newcommand*{\paragraphbs}{.8\baselineskip}
+
+\newlength{\tnwsection}
+\newlength{\tnwsubsection}
+\newlength{\tnwsubsubsection}
+\newlength{\tnwparagraph}
+\newlength{\tisection}
+\newlength{\tisubsection}
+\newlength{\tisubsubsection}
+\newlength{\tiparagraph}
+
+\setlength{\tnwsection}{1.2em}
+\addtolength{\tnwsection}{.6em}
+\setlength{\tnwsubsection}{\tnwsection}
+\addtolength{\tnwsubsection}{.75em}
+\setlength{\tnwsubsubsection}{\tnwsubsection}
+\addtolength{\tnwsubsubsection}{.75em}
+\setlength{\tnwparagraph}{\tnwsubsubsection}
+\addtolength{\tnwparagraph}{.75em}
+
+\setlength{\tisection}{0em}
+\setlength{\tisubsection}{\tisection}
+\addtolength{\tisubsection}{\tnwsection}
+\setlength{\tisubsubsection}{\tisubsection}
+\addtolength{\tisubsubsection}{\tnwsubsection}
+\setlength{\tiparagraph}{\tisubsubsection}
+\addtolength{\tiparagraph}{\tnwsubsubsection}
+
+\RedeclareSectionCommands[%
+    tocraggedentrytext=true,%
+]%
+{section,subsection,subsubsection,paragraph}
+
+\RedeclareSectionCommand[%
+    tocindent=\tisection,%
+    tocnumwidth=\tnwsection,%
+    tocbeforeskip=\sectiontbs,%
+    tocentryformat=\supernormalsize\sffamily\bfseries,%
+    tocentrynumberformat=\supernormalsize\sffamily\bfseries,%
+    tocpagenumberformat=\supernormalsize\sffamily\bfseries%
+]%
+{section}
+
+\RedeclareSectionCommand[%
+    tocindent=\tisubsection,%
+    tocnumwidth=\tnwsubsection,%
+    tocbeforeskip=\subsectiontbs,%
+    tocentryformat=\subnormalsize,%
+    tocentrynumberformat=\subnormalsize,%
+    tocpagenumberformat=\subnormalsize%
+]%
+{subsection}
+
+\RedeclareSectionCommand[%
+    tocindent=\tisubsubsection,%
+    tocnumwidth=\tnwsubsubsection,%
+    tocbeforeskip=\sectiontbs%
+]%
+{subsubsection}
+
+\RedeclareSectionCommand[%
+    afterskip=\paragraphas,%
+    beforeskip=\paragraphbs,%
+    tocindent=\tiparagraph,%
+    tocnumwidth=\tnwparagraph,%
+    tocbeforeskip=\sectiontbs%
+]%
+{paragraph}
+
+\linespread{1.1}
+
+\newcommand*{\hs}{\hspace{.45em}}
+
+\usepackage{fontspec}
+
+\directlua{
+
+    fonts.handlers.otf.addfeature {
+        name = "onumkern",
+        type = "kern",
+        data = {
+            ["v"] = { ["zero.taboldstyle"] = 80 },
+            ["two.taboldstyle"] = { ["zero.taboldstyle"] = 30, ["/"] = 50 },
+            ["five.taboldstyle"] = { ["/"] = 20 },
+            ["»"] = { ["I"] = 50 },
+        },
+    }
+
+}
+
+\setmainfont{Tangent}[
+    BoldFont = *-Medium,
+    ItalicFont = *-Italic,
+    Ligatures = {Common, TeX},
+    Numbers = OldStyle,
+    RawFeature = +onumkern
+]
+
+\setsansfont{SegoeUI}[
+    BoldFont = seguisb.ttf,
+    Ligatures = {Discretionary, TeX},
+    Numbers = OldStyle
+]
+
+\setmonofont{Consolas}[
+    ItalicFont = *-Italic,
+    Numbers = OldStyle
+]
+
+\newcommand*{\mono}[1]{%
+    {\subnormalsize\texttt{#1}}%
+}
+
+\usepackage{babel}
+\usepackage[paper=a4paper,marginratio={2:1,3:4}]{geometry}
+\usepackage{spacekern}
+\usepackage{hyperref}
+\usepackage{bookmark}
+\usepackage{microtype}
+
+\hypersetup{%
+    pdflang=en,%
+    unicode=true,%
+	pdfborder={0 0 0},%
+	bookmarksopen=true,%
+    bookmarksopenlevel=0,%
+	bookmarksnumbered=true,%
+    pdftitle={The showkerning package},
+    pdfsubject={Showing kerns in a document},
+    pdfauthor={Thomas Kelkel},
+    pdfkeywords={tex, latex, kerning}
+}
+
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{.4\baselineskip}
+
+\newcommand*{\q}[1]{%
+    ›%
+    #1%
+    ‹%
+}
+\newcommand*{\qq}[1]{%
+    »%
+    #1%
+    «%
+}
+
+\newcommand*{\textnote}[1]{%
+    {%
+        \ttfamily%
+        \char174{}%
+        #1%
+        \char174{}%
+    }%
+}
+
+\usepackage{luacode}
+
+\begin{luacode}
+
+local FLOOR = math.floor
+
+local function round ( num, dec )
+    return FLOOR ( num * 10^dec + 0.5 ) / 10^dec
+end
+
+local p_array = {false, false, false, false, false}
+local p_counter = 0
+local ID = node.id
+local NEW = node.new
+local COPY = node.copy
+local REM = node.remove
+local PREV = node.prev
+local NEXT = node.next
+local TAIL = node.tail
+local T_ID = node.traverse_id
+local T_GLYPH = node.traverse_glyph
+local INS_B = node.insert_before
+local GLYPH = ID ( "glyph" )
+local GLUE = ID ( "glue" )
+local KERN = ID ( "kern" )
+local HLIST = ID ( "hlist" )
+local SWAPPED = table.swapped
+local SUBTYPES = node.subtypes
+local SPACESKIP = SWAPPED ( SUBTYPES ("glue") )["spaceskip"]
+local WIDTH = round ( tex.sp ( "1.6em" ), 0 )
+local ipairs = ipairs
+local page_counter = 0
+local INS_A = node.insert_after
+local p_counter_x = 0
+local ATC = luatexbase.add_to_callback
+
+local function make_marks ( head, char, id, array, counter )
+    for n in T_GLYPH ( head ) do
+        if n.char == char then
+            counter = counter + 1
+            array[counter] = {false, false, false}
+            head = INS_B ( head, n, NEW ( GLYPH ) )
+            PREV ( n ).data = id
+            local NEXT = n.next
+            local inside_counter = 0
+            while NEXT.char ~= char do
+                inside_counter = inside_counter + 1
+                array[counter][inside_counter] = COPY ( NEXT )
+                NEXT = NEXT.next
+                REM ( head, NEXT.prev )
+            end
+            head = REM ( head, NEXT )
+            head = REM ( head, n )
+        end
+    end
+    return head, array, counter
+end
+
+local function mark_notes ( head )
+    head, p_array, p_counter = make_marks ( head, 174, 427956, p_array, p_counter )
+    return head
+end
+
+local function make_margin_notes ( head, id, array, counter )
+    for n in T_ID ( HLIST, head ) do
+        local first_kern = 0
+        local first_width = 0
+        for glyph_node in T_GLYPH ( n.head ) do
+            if glyph_node.data == id then
+                counter = counter + 1
+                local tail_node = TAIL ( n.head )
+                local glue_node = NEW ( GLUE )
+                glue_node.subtype = SPACESKIP
+                glue_node.width = WIDTH
+                local NEXT
+                local switch_counter = 1 -- page_counter
+                n.head = INS_A ( n.head, TAIL ( n.head ), glue_node )
+                if ( switch_counter % 2 == 0 ) then
+                    NEXT = glue_node
+                else
+                    NEXT = tail_node
+                end
+                local kern_value = 0
+                for _, value in ipairs ( array[counter] ) do
+                    if value ~= false then
+                        local NUMBER = COPY ( value )
+                            n.head = INS_A ( n.head, NEXT, NUMBER)
+                            if NEXT.next then
+                                NEXT = NEXT.next
+                            end
+                        if NUMBER.width then
+                            kern_value = kern_value - NUMBER.width
+                        end
+                    end
+                end
+                local kern_node = NEW ( KERN )
+                kern_node.kern = kern_value - glue_node.width
+                if switch_counter % 2 ~= 0  then
+                    kern_node.kern = kern_node.kern - tex.hsize + first_kern
+                    n.head = INS_A ( n.head, tail_node, kern_node )
+                end
+                if ( switch_counter % 2 == 0 ) and ( first_kern < 0 ) then
+                    kern_node.kern = kern_node.kern - first_kern + first_width - kern_value
+                    n.head = INS_A ( n.head, tail_node, kern_node )
+                end
+                first_kern = kern_node.kern
+                first_width = kern_value
+            end
+        end
+    end
+    return head, counter
+end
+
+local function make_text_notes ( head )
+    page_counter = page_counter + 1
+    head, p_counter_x = make_margin_notes ( head, 427956, p_array, p_counter_x )
+    return head
+end
+
+    ATC ( "ligaturing", mark_notes , "mark notes" )
+    ATC ( "pre_output_filter", make_text_notes , "count pages" )
+
+\end{luacode}
+
+\flushbottom
+
+\pagestyle{empty}
+
+\usepackage{showkerning}
+
+\RedeclareSectionCommand[%
+    afterskip=1.3ex plus .2ex,%
+    beforeskip=-2.5ex plus -1ex minus -.2ex,%
+    font=\superlarge%
+]%
+{section}
+
+\begin{document}
+
+\directlua{
+    local function rem_kern ( head )
+        for n in node.traverse ( head ) do
+            if n.id == node.id ( "hlist" ) or n.id == node.id ( "vlist" ) then
+                n.head = rem_kern ( n.head )
+            elseif n.id == node.id ( "glyph" ) then
+                if n.char == 112 then
+                    n.prev.data = ""
+                end
+            end
+        end
+        return head
+    end
+
+    luatexbase.add_to_callback ( "post_linebreak_filter", rem_kern, "remove kern", 1 )
+}
+
+\title{The showk\kern-.1eme\kern.2emrn\kern-.05emin\kern.1emg package\vspace{.25\baselineskip}\\\superlarge{}\directlua{luatexbase.remove_from_callback ( "post_linebreak_filter", "show kerns in postline" ) luatexbase.remove_from_callback ( "hpack_filter", "show kerns in hpack" ) luatexbase.remove_from_callback ( "post_linebreak_filter", "remove kern" )}Showing kerns in a document}%
+\author{\sublarge{}Thomas Kelkel\vspace{-.25\baselineskip}\\\sublarge{}kelkel at emaileon.de\vspace{-.25\baselineskip}}%
+\date{\addfontfeature{LetterSpace=2}\sublarge{}2022/05/31\quad{}v0.1}%
+\maketitle
+
+\thispagestyle{empty}
+
+\section{Introduction}
+
+This package displays all kerning values in the form of colored bars directly at the respective position in the document. Positive values are displayed in green, negative values in red. The width of the bars corresponds exactly to the respective kerning value. The left edge of the bar is always at the position where the kerning node is placed. (This corresponds to the common representation method).
+
+Please note that Lua{\addfontfeature{LetterSpace = 2}\LaTeX} is required to use this package.
+
+\section{Basic usage}
+
+To load the package, simply add the following line to the preamble of the document:
+
+\begin{quote}
+    \mono{\textbackslash{}usepackage\{showkerning\}}
+\end{quote}
+
+\section{Package options}
+
+\addcontentsline{toc}{subsection}{ontop}
+
+\textnote{ontop}By default, the bars are placed behind the glyphs. With this option they are in front of them. It can be loaded in the following way:
+
+\begin{quote}
+    \mono{\textbackslash{}usepackage[ontop]\{showkerning\}}
+\end{quote}
+
+\section{License}
+
+This package is copyright © 2022 Thomas Kelkel. It may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3c of this license or (at your option) any later version. This work has the LPPL maintenance status \qq{author maintained}.
+
+\end{document}
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/lualatex/showkerning/showkerning.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.lua
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.lua	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.lua	2022-06-11 20:42:42 UTC (rev 63551)
@@ -0,0 +1,208 @@
+-- Copyright (c) 2022 Thomas Kelkel kelkel at emaileon.de
+
+-- This file may be distributed and/or modified under the
+-- conditions of the LaTeX Project Public License, either
+-- version 1.3c of this license or (at your option) any later
+-- version. The latest version of this license is in
+
+--    http://www.latex-project.org/lppl.txt
+
+-- and version 1.3c or later is part of all distributions of
+-- LaTeX version 2009/09/24 or later.
+
+-- Version: 0.1
+
+local FLOOR = math.floor
+local ABS = math.abs
+
+local function round ( num, dec )
+    return FLOOR ( num * 10^dec + 0.5 ) / 10^dec
+end
+
+local ID = node.id
+local GLYPH = ID ( "glyph" )
+local DISC = ID ( "disc" )
+local KERN = ID ( "kern" )
+local GLUE = ID ( "glue" )
+local BOUND = ID ( "boundary" )
+local WI = ID ( "whatsit" )
+local HLIST = ID ( "hlist" )
+local VLIST = ID ( "vlist" )
+local USERKERN = table.swapped ( node.subtypes ("kern") )["userkern"]
+local NEW = node.new
+local COPY = node.copy
+local REM = node.remove
+local PREV = node.prev
+local NEXT = node.next
+local TAIL = node.tail
+local HAS_GLYPH = node.has_glyph
+local INS_B = node.insert_before
+local INS_A = node.insert_after
+local T = node.traverse
+local T_ID = node.traverse_id
+local T_GLYPH = node.traverse_glyph
+local WIS = node.whatsits()
+local pdfliteral
+local pairs = pairs
+local ATC = luatexbase.add_to_callback
+
+local on_top = false
+local DIR = PREV
+local AB = INS_B
+local f = 1
+
+for key, value in pairs ( WIS ) do
+    if value == "pdf_literal" then
+        pdfliteral = key
+    end
+end
+
+function showkerning_on_top ()
+    on_top = true
+    DIR = NEXT
+    AB = INS_A
+    f = - 1
+end
+
+local function calc_value ( value )
+    value = round ( value / 65536, 3 )
+    return value
+end
+
+local function find_glyph ( n, d )
+    if d ( n ) then
+        n = d ( n )
+        while n.id ~= GLYPH and not ( n.id == DISC and n.replace and HAS_GLYPH ( n.replace ) ) do
+            if not d ( n ) or n.id == GLUE or n.id == BOUND or ( n.id == KERN and n.subtype == USERKERN ) then return false end
+            n = d ( n )
+        end
+    else
+        return false
+    end
+    local return_value = n
+    if n.id == DISC then
+        for glyph_node in T_GLYPH ( n.replace ) do
+            return_value = glyph_node
+        end
+    end
+    return return_value, n
+end
+
+local function check_glyph ( n, d, has_prev_next_glyph, prev_next_glyph, insert_prev_next )
+    if find_glyph ( n, d ) then
+        prev_next_glyph, insert_prev_next = find_glyph ( n, d )
+        has_prev_next_glyph = true
+    end
+    return has_prev_next_glyph, prev_next_glyph, insert_prev_next
+end
+
+local function get_x_value ( n, x_value )
+    local exp_fac = 1
+    if n.expansion_factor then
+        exp_fac = n.expansion_factor / 1000000 + 1
+    end
+    if n.id == GLYPH and n.width then
+        x_value = x_value + calc_value ( n.width ) * exp_fac
+    elseif n.id == KERN and n.kern then
+        x_value = x_value + calc_value ( n.kern ) * exp_fac
+    end
+    return x_value
+end
+
+local function make_rule ( head, n, kern_node, current_head, disc_list )
+    local color = "0 0 0"
+    local has_prev_glyph = false
+    local has_next_glyph = false
+    local prev_glyph = n
+    local next_glyph = n
+    local insert_prev = n
+    local insert_next = n
+    local insert_point = n
+    local x_value = 0
+    local height = 0
+    local depth = 0
+    local thickness = calc_value ( kern_node.kern )
+    has_prev_glyph, prev_glyph, insert_prev = check_glyph ( n, PREV, has_prev_glyph, prev_glyph, insert_prev )
+    has_next_glyph, next_glyph, insert_next = check_glyph ( n, NEXT, has_next_glyph, next_glyph, insert_next )
+    if not on_top and has_prev_glyph then
+        insert_point = insert_prev
+        x_value = get_x_value ( prev_glyph, x_value )
+        if disc_list and HAS_GLYPH ( current_head ) and TAIL ( current_head ) == kern_node then
+            for some_node in T ( current_head ) do
+                if some_node == TAIL ( current_head ) then break end
+                x_value = get_x_value ( some_node, x_value )
+            end
+        end
+    elseif on_top and has_next_glyph then
+        insert_point = insert_next
+        x_value = get_x_value ( next_glyph, x_value )
+        if disc_list and HAS_GLYPH ( current_head ) and current_head == kern_node then
+            for some_node in T ( current_head ) do
+                if some_node ~= current_head then
+                    x_value = get_x_value ( some_node, x_value )
+                end
+            end
+        end
+    end
+    if disc_list and HAS_GLYPH ( current_head ) then
+        if TAIL ( current_head ) == kern_node then
+            has_prev_glyph = false
+            has_prev_glyph, prev_glyph = check_glyph ( kern_node, PREV, has_prev_glyph, prev_glyph, insert_prev )
+        end
+        if current_head == kern_node then
+            has_next_glyph = false
+            has_next_glyph, next_glyph = check_glyph ( kern_node, NEXT, has_next_glyph, next_glyph, insert_next )
+        end
+    end
+    if has_prev_glyph then
+        height = calc_value ( prev_glyph.height )
+        depth = calc_value ( prev_glyph.depth )
+        if has_next_glyph then
+            if next_glyph.height > prev_glyph.height then height = calc_value ( next_glyph.height ) end
+            if next_glyph.depth > prev_glyph.depth then depth = calc_value ( next_glyph.depth ) end
+        end
+    elseif has_next_glyph then
+        height = calc_value ( next_glyph.height )
+        depth = calc_value ( next_glyph.depth )
+    end
+    if PREV ( kern_node ) and PREV ( kern_node ).id == KERN then
+        thickness = get_x_value ( PREV ( kern_node ), thickness )
+        if PREV ( PREV ( kern_node ) ) and PREV ( PREV ( kern_node ) ).id == KERN then
+            thickness = get_x_value ( PREV ( PREV ( kern_node ) ), thickness )
+        end
+    end
+    if ( thickness ~= 0 ) and ( thickness > calc_value ( tex.hsize ) * - 1 ) then
+        head = AB ( head, insert_point, NEW ( WI, pdfliteral ) )
+        if thickness > 0 then
+            color = "0 1 0"
+        else
+            color = "1 0 0"
+        end
+        x_value = ( x_value + calc_value ( kern_node.expansion_factor ) + thickness * 0.5 ) * f
+        DIR ( insert_point ).mode = 0
+        DIR ( insert_point ).data = "q " .. ABS ( thickness )  .. " w " .. x_value .. " " .. - depth  .. " m  " .. x_value .. " " .. height .. " l " .. color .. " RG S Q"
+    end
+    return head, current_head
+end
+
+local function show_kerns ( head )
+    for n in T ( head ) do
+        if n.id == HLIST or n.id == VLIST then
+            n.head = show_kerns ( n.head )
+        elseif n.id == KERN and not ( NEXT ( n ) and NEXT ( n ).id == KERN ) then
+            head = make_rule ( head, n, n, head, false )
+        elseif n.replace then
+            local REPLACE = n.replace
+            for kern_node in T_ID ( KERN, REPLACE ) do
+                if not ( n.subtype == USERKERN ) and not ( NEXT ( kern_node ) and NEXT ( kern_node ).id == KERN ) then
+                    head, REPLACE = make_rule ( head , n, kern_node, REPLACE, true )
+                end
+            end
+            n.replace = REPLACE
+        end
+    end
+    return head
+end
+
+ATC ( "post_linebreak_filter", show_kerns, "show kerns in postline" )
+ATC ( "hpack_filter", show_kerns, "show kerns in hpack" )
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.lua
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.sty
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.sty	2022-06-11 20:42:42 UTC (rev 63551)
@@ -0,0 +1,24 @@
+% Copyright (c) 2022 Thomas Kelkel kelkel at emaileon.de
+
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any later
+% version. The latest version of this license is in
+
+%    http://www.latex-project.org/lppl.txt
+
+% and version 1.3c or later is part of all distributions of
+% LaTeX version 2009/09/24 or later.
+
+\ProvidesPackage{showkerning}[2022/04/17 v0.1 Showing kerns in a document]
+\RequirePackage{ifluatex,luatexbase}
+
+\ifluatex
+    \directlua{require ( "showkerning.lua" )}
+
+    \DeclareOption{ontop}{\directlua{showkerning_on_top()}}
+    \ProcessOptions
+\else
+    \errhelp{Compile with LuaLaTeX to be able to use the "showkerning" package.}
+    \errmessage{Package "showkerning" error: This package requires LuaLaTeX!}
+\fi
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/lualatex/showkerning/showkerning.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/tlpkg/tlpsrc/showkerning.tlpsrc
===================================================================


More information about the tex-live-commits mailing list.