\documentclass{article}
\usepackage{graphicx,listings,booktabs,lmodern}

\newcommand*\pgsmall{\fontsize{8.5}{8.7}\selectfont\ttfamily}
\lstset{basicstyle=\pgsmall,
  basewidth=0.55em,
  columns=fullflexible,
  breakautoindent=true,
  breaklines=true,
  prebreak=,
  postbreak=\mbox{$\hookrightarrow$},
}

\begin{document}
\title{The lua-visual-debug package (V1.1)}
\author{Patrick Gundlach, Udi Fogiel}
% \address{patrick@gundla.ch}
\maketitle

\tableofcontents
\section{About}

This package aids debugging your \TeX\ and \LaTeX\ document by drawing 
rectangles around boxes and rules where glue is inserted.
Other items are marked as well: kerns, hyphenation points and penalties.

\section{How to use}

When you load the package \texttt{lua-visual-debug} in your Lua\LaTeX\ document 
(or use \verb|\input lua-visual-debug.sty| in plain \TeX, or \verb|\load[lua-visual-debug]| in OP\TeX),
Lua\TeX\ will highlight boxes, penalties, glues and kerns in the PDF.
This package requires you to process the document with Lua\TeX\ (plain, \LaTeX\ or OP\TeX\ formats).

\section{A \LaTeX\ example}
\lstinputlisting[language=tex]{sample.tex}

\noindent yields \vspace{5mm}

\noindent \includegraphics[width=\textwidth]{sample.pdf}

\section{A plain \TeX\ example}

\lstinputlisting[language=tex]{sample-plain.tex}

\noindent yields \vspace{5mm}

\noindent \includegraphics[width=\textwidth]{sample-plain.pdf}

\section{How to interpret the markers} % (fold)
\label{sec:how_to_interpret_the_markers}

\noindent\includegraphics[width=.9\textwidth]{lvdebugdetail1-num}
\begin{enumerate}
\item A vertical glue. Beginning and end are marked with a small tick. At the mark 1, two vertical glues are connected.
\item A horizontal glue. Blue dashed lines represent stretched glues, magenta lines represent shrunk glues, gray at their natural width.
\item A negative kern. Positive kerns are yellow.
\item A possible hyphenation point.
\item Horizontal and vertical boxes are drawn with a border.
\item Penalties are marked with a square. A penalty of 10,000 is marked with a blank square, a penalty less than 10,000 is filled with a gray square (that will improve in the future, currently it is grayness of penalty / 10000).
\end{enumerate}

A strut box (zero width box) is marked with a red rule:

\noindent\includegraphics[scale=0.8]{strut}

% section how_to_interpret_the_ (end)

\newpage

\section{Configuration}
If the \texttt{luakeyval} package is installed, then you can use the
\verb|\lvdset| macro modifies the markers described in Section~\ref{sec:how_to_interpret_the_markers}.
It accepts a list of space-separated \texttt{key/val} pairs. Most keys accept nested \texttt{key/val} pairs 
enclosed in curly braces. PDF operators (for \texttt{color}, \texttt{negative\_color}, and \texttt{opacity}) 
must be enclosed in curly braces, e.g., \verb|\lvdset{glyph={color={1 0 0 RG}}}|.

\medskip
\noindent
\begin{tabular}{@{}lllp{6cm}@{}}
\toprule
\textbf{Key} & \textbf{Sub-key} & \textbf{Default} & \textbf{Description} \\
\midrule
\texttt{hlist} & \texttt{show} & \texttt{true} & Whether to mark hlists \\
               & \texttt{color} & \texttt{0.5 G} & PDF stroking color operator \\
               & \texttt{width} & \texttt{0.1} & Line width in bp units \\
\midrule
\texttt{vlist} & \texttt{show} & \texttt{true} & Whether to mark vlists \\
               & \texttt{color} & \texttt{0.1 G} & PDF stroking color operator \\
               & \texttt{width} & \texttt{0.1} & Line width in bp units \\
\midrule
\texttt{rule} & \texttt{show} & \texttt{true} & Whether to mark rules \\
              & \texttt{color} & \texttt{1 0 0 RG} & PDF stroking color operator \\
              & \texttt{width} & \texttt{0.4} & Line width in bp units \\
\midrule
\texttt{disc} & \texttt{show} & \texttt{true} & Whether to mark discretionaries \\
              & \texttt{color} & \texttt{0 0 1 RG} & PDF stroking color operator \\
              & \texttt{width} & \texttt{0.3} & Line width in bp units \\
\midrule
\texttt{glue} & \texttt{show} & \texttt{true} & Whether to mark glue \\
\midrule
\texttt{kern} & \texttt{show} & \texttt{true} & Whether to mark kerns \\
              & \texttt{color} & \texttt{1 1 0 rg} & PDF color for positive kerns (stroke and fill) \\
              & \texttt{negative\_color} & \texttt{1 0 0 rg} & PDF color for negative kerns (stroke and fill) \\
              & \texttt{width} & \texttt{1} & Line width in bp units \\
\midrule
\texttt{penalty} & \texttt{show} & \texttt{true} & Whether to mark penalties \\
                 & \texttt{colorfunc} & (see below) & Lua function that accepts the penalty value and returns a PDF color string \\
\midrule
\texttt{glyph} & \texttt{show} & \texttt{false} & Whether to mark glyphs \\
               & \texttt{color} & \texttt{1 0 0 RG} & PDF stroking color operator \\
               & \texttt{width} & \texttt{0.1} & Line width in bp units \\
               & \texttt{baseline} & \texttt{true} & Whether to mark the baseline \\
\midrule
\texttt{onlyglyphs} & — & — & Shortcut to disable all markers except glyphs \\
\midrule
\texttt{opacity} & — & (empty) & PDF graphics state operator for transparency \\
\bottomrule
\end{tabular}

\medskip
\noindent
\textit{Notes:} 
\begin{itemize}
\item The \texttt{kern} key uses both stroke and fill colors, unlike other keys which only use stroking color.
\item The \texttt{onlyglyphs} key is a boolean flag (no value needed) that sets all \texttt{show} keys to \texttt{false} except \texttt{glyph/show}, which is set to \texttt{true}.
\item The \texttt{opacity} key applies to all node types. For fine-tuned opacity control per node type, the \texttt{color} keys can be (ab)used to include graphics state operators.
\end{itemize}

\medskip
\noindent
The default \texttt{colorfunc} for penalties is:
\begin{verbatim}
function(p) 
  local color = "1 g" 
  if p < 10000 then
    color = string.format("%g g", 1 - math.floor(p / 10000))
  end
  return color
end
\end{verbatim}

An example of the usage of the keys is
\lstinputlisting[language=tex]{sample-keys.tex}

\noindent which yields \vspace{5mm}

\noindent \includegraphics[width=\textwidth]{sample-keys.pdf}

You can also access and assign the parameters from lua with the \texttt{params} table.
For example
\begin{verbatim}
local params = require('lua-visual-debug').params
params.hlist.color = "1 0 0 RG"
\end{verbatim}


\section{Copying}

Copyright 2012–2025 Patrick Gundlach (patrick@gundla.ch) and other authors (see Git for information),
licensed under the MIT license. See the \verb|lua-visual-debug.lua| file for details.


\end{document}
