%20usando%20la%20biblioteca%20de%20nodos.png)
¿Cómo encontrar la altura real (y otras dimensiones) del contenido del entorno multicols en una minipágina utilizando la biblioteca de nodos LuaTeX? Hasta ahora, en mis experimentos con la biblioteca de nodos luatex, he podido usar post_linebreak_filter para jugar con los nodos hlist, pero no sé cómo acceder a los nodos vlist y consultarlos. En el manual de luatex, veo que se pueden consultar las dimensiones de un nodo usando node.dimensions(<node> n)
. Aunque no sé cómo recorrer el contenido de la minipágina para llegar a los vboxes generados por el entorno multicols. Al atravesarlos, podría encontrar la altura máxima entre los vboxes para determinar la altura real.
Sería de ayuda adicional si alguien pudiera sugerir si y cómo funciona la herramienta de visualización de listas de nodos. https://gist.github.com/pgundlach/556247se puede utilizar para visualizar el contenido de la minipágina. (Nota: disculpe el enlace externo, parece ser una especie de herramienta de visualización estándar, pero no está disponible en ctan como paquete)
Aquí está mi código de prueba, debajo está la captura de pantalla del resultado, y espero encontrar las dimensiones reales del texto de 3 columnas que es diferente del tamaño del valor especificado de la minipágina (4 pulgadas) que rodea el entorno multicols.
% lualatex vboxdimensions.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage{lua-visual-debug}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{multicol}
\begin{document}
\blindtext[1]\vspace{\baselineskip}
\noindent\begin{minipage}[t][4in][t]{\textwidth}%
% STARTPOINT for dimension measurement
\begin{multicols}{3}%
\blindtext[2]
\end{multicols}%
% ENDPOINT for dimension measurement
\end{minipage}
\blindtext[1]
\end{document}
Respuesta1
Antes de hablar de la node
biblioteca, la forma mucho más sencilla de realizar dichas mediciones es simplemente comparando la posición en la página antes y después:
% lualatex vboxdimensions.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage{lua-visual-debug}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{multicol}
\begin{document}
\showoutput
\blindtext[1]\vspace{\baselineskip}
\noindent\begin{minipage}[t][4in][t]{\textwidth}%
% STARTPOINT for dimension measurement
\latelua{
assert(measurement_y == nil, "global variable already in use")
measurement_y = pdf.getvpos()
}%
\begin{multicols}{3}%
\blindtext[2]
\end{multicols}%
\latelua{
texio.write_nl(string.format("\csstring\%fin measured\string\n", (measurement_y - pdf.getvpos()) / tex.sp'1in'))
measurement_y = nil
}%
% ENDPOINT for dimension measurement
\end{minipage}
\blindtext[1]
\end{document}
Si desea utilizar la biblioteca de nodos, le sugeriría que utilice tex.nest.top.tail
TeX para acceder al último nodo insertado antes de algún comando Lua. Esto se puede utilizar como punto de partida para escanear hacia atrás hasta encontrar el nodo que está buscando. Por ejemplo: (Aquí estamos midiendo el hlist
contenido de las tres vlist
s, esto corresponde a la altura de la vlist máxima).
% lualatex vboxdimensions.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage{lua-visual-debug}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{multicol}
\begin{document}
\showoutput
\blindtext[1]\vspace{\baselineskip}
\noindent\begin{minipage}[t][4in][t]{\textwidth}%
% STARTPOINT for dimension measurement
\begin{multicols}{3}%
\blindtext[2]
\end{multicols}%
\directlua{
local hlist_id = node.id'hlist' % The id we are looking for
local last_tail = tex.nest.top.tail % Start at the end of the list TeX is working on
while last_tail.id \string~= hlist_id do last_tail = last_tail.prev end % Move to the previous node until a hlist is found
texio.write_nl(string.format("\csstring\%fin measured\string\n", (last_tail.height+last_tail.depth) / tex.sp'1in'))}%
% ENDPOINT for dimension measurement
\end{minipage}
\blindtext[1]
\end{document}
Desde aquí, también puedes usar el miembro `.head de hlist para acceder a las vlists ocultas allí:
% lualatex vboxdimensions.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage{lua-visual-debug}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{multicol}
\begin{document}
\showoutput
\blindtext[1]\vspace{\baselineskip}
\noindent\begin{minipage}[t][4in][t]{\textwidth}%
% STARTPOINT for dimension measurement
\begin{multicols}{3}%
\blindtext[2]
\end{multicols}%
\directlua{
local hlist_id = node.id'hlist' % The id we are looking for
local last_tail = tex.nest.top.tail % Start at the end of the list TeX is working on
while last_tail.id \string~= hlist_id do last_tail = last_tail.prev end % Move to the previous node until a hlist is found
% Now last_tail is the hlist containing the vlists.
for n in node.traverse_id(node.id'vlist', last_tail.head) do
% Now n is one of the inner vlists.
texio.write_nl(string.format("Found column of height \csstring\%fin.",(n.height+n.depth)/tex.sp'1in'))
end}%
% ENDPOINT for dimension measurement
\end{minipage}
\blindtext[1]
\end{document}
Podrías notar que especialmente la primera versión otorga un valor más alto. La razón de esto es que multicols inserta algo de espacio que se incluye cuando se usan puntos y getvpos, pero no se incluye cuando se miran cuadros sin formato.