summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/showhyphenation/showhyphenation.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/showhyphenation/showhyphenation.tex')
-rw-r--r--macros/luatex/latex/showhyphenation/showhyphenation.tex412
1 files changed, 412 insertions, 0 deletions
diff --git a/macros/luatex/latex/showhyphenation/showhyphenation.tex b/macros/luatex/latex/showhyphenation/showhyphenation.tex
new file mode 100644
index 0000000000..d0c376bf80
--- /dev/null
+++ b/macros/luatex/latex/showhyphenation/showhyphenation.tex
@@ -0,0 +1,412 @@
+\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 showhyphenation package},
+ pdfsubject={Marking of hyphenation points},
+ pdfauthor={Thomas Kelkel},
+ pdfkeywords={tex, latex, hyphenation}
+}
+
+\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
+
+\RedeclareSectionCommand[%
+ afterskip=1.3ex plus .2ex,%
+ beforeskip=-2.5ex plus -1ex minus -.2ex,%
+ font=\superlarge%
+]%
+{section}
+
+\RedeclareSectionCommand[%
+ beforeskip=.5\baselineskip%
+]%
+{paragraph}
+
+\usepackage{showhyphenation}
+
+\hyphenation{package}
+
+\begin{document}
+
+\title{The showhyphenation package\vspace{.25\baselineskip}\\\superlarge{}\directlua{luatexbase.remove_from_callback ( "post_linebreak_filter", "show hyphenation points in postline" ) luatexbase.remove_from_callback ( "hpack_filter", "show hyphenation points in hpack" )}Marking of hyphenation points}%
+\author{\sublarge{}Thomas Kelkel\vspace{-.25\baselineskip}\\\sublarge{}kelkel@emaileon.de\vspace{-.25\baselineskip}}%
+\date{\addfontfeature{LetterSpace=2}\sublarge{}2022/05/31\quad{}v0.1}%
+\maketitle
+
+\hyphenation{pack-age}
+
+\section{Introduction}
+
+This package shows the hyphenation points in the document.% Optionally either by markers below the baseline, or by explicit hyphens in the text.
+
+There is already the \mono{showhyphens} package by Patrick Gundlach, which provides similar functionality. However, the \mono{showhyphenation} package differs by a number of improvements and enhancements:
+
+\paragraph{Visibility}
+
+The size of the markers adjusts to the font size. Furthermore, the markers do not cover the glyphs.
+
+\paragraph{Ligatures}
+
+The markers are correctly placed even within ligatures and there are no issues with kern nodes next to ligatures.
+
+\paragraph{Explicit hyphens}
+
+The \mono{make} option allows the user to have the hyphenation points typeset as explicit hyphens in the text.
+
+%The hyphenation package offers the feature to typeset the hyphenation points as explicit hyphens in the text.
+
+\section{Basic usage}
+
+To load the package, simply add the following line to the preamble of the document:
+
+\begin{quote}
+ \mono{\textbackslash{}usepackage\{showhyphenation\}}
+\end{quote}
+
+\section{Package options}
+
+Options can be loaded by adding them comma separated within square brackets:
+
+\begin{quote}
+ \mono{\textbackslash{}usepackage[\textit{<option1>,<option2>,…}]\{showhyphenation\}}
+\end{quote}
+
+\addcontentsline{toc}{subsection}{make}
+
+\textnote{make}By default, hyphenation points are marked by triangles below the baseline. Loading this option will typeset them as hyphens instead.
+
+\addcontentsline{toc}{subsection}{ontop}
+
+\textnote{ontop}By default, the triangles are placed behind the glyphs. With this option they are in front of them.
+
+\addcontentsline{toc}{subsection}{lime}
+
+\textnote{lime}Changes the color of the markers from raspberry to lime.
+
+\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