%EC%9D%98%20%EC%8B%A4%EC%A0%9C%20%EB%86%92%EC%9D%B4%20%EC%B0%BE%EA%B8%B0.png)
LuaTeX 노드 라이브러리를 사용하여 미니 페이지에서 다중 열 환경 내용의 실제 높이(및 기타 치수)를 찾는 방법은 무엇입니까? 지금까지 luatex 노드 라이브러리를 사용한 실험에서 post_linebreak_filter를 사용하여 hlist 노드를 사용할 수 있었지만 vlist 노드에 액세스하고 쿼리하는 방법을 모릅니다. luatex 매뉴얼에서 node.dimensions(<node> n)
. multicols 환경의 vboxes 출력에 도달하기 위해 미니페이지의 내용을 탐색하는 방법을 모르지만. 이를 탐색함으로써 실제 높이를 결정하기 위해 vbox 사이의 최대 높이를 잠재적으로 찾을 수 있습니다.
누군가가 노드 목록 시각화 도구인지 여부/방법을 제안할 수 있다면 추가적인 도움이 될 것입니다. https://gist.github.com/pgundlach/556247미니페이지의 내용을 시각화하는 데 사용할 수 있습니다. (참고: 외부 링크에 대해 양해해 주시기 바랍니다. 이것은 일종의 표준 시각화 도구인 것처럼 보이지만 ctan에서는 패키지로 사용할 수 없습니다.)
여기 제 테스트 코드가 있습니다. 아래는 출력 스크린샷입니다. 다중 열 환경을 둘러싼 미니페이지(4인치)의 지정된 값 크기와 다른 3열 텍스트의 실제 크기를 찾을 수 있기를 기대하고 있습니다.
% 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}
답변1
라이브러리 에 대해 논의하기 전에 node
이러한 측정을 수행하는 훨씬 쉬운 방법은 페이지 전후의 위치를 비교하는 것입니다.
% 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}
노드 라이브러리를 사용하려면 tex.nest.top.tail
Lua 명령 앞에 삽입된 마지막 노드 TeX에 액세스하는 데 사용하는 것이 좋습니다. 이는 찾고 있는 노드를 찾을 때까지 다시 검색하기 위한 시작점으로 사용될 수 있습니다. 예를 들면 다음과 같습니다. (여기서 우리는 hlist
세 개의 s를 모두 포함하는 것을 측정하고 있으며 vlist
이는 최대 vlist의 높이에 해당합니다.)
% 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}
여기에서 hlist의 `.head 멤버를 사용하여 그 안에 숨겨진 vlist에 액세스할 수도 있습니다.
% 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}
특히 첫 번째 버전이 더 높은 가치를 제공한다는 것을 알 수 있습니다. 그 이유는 multicols가 points와 getvpos를 사용할 때 포함되지만 원시 상자를 볼 때는 포함되지 않는 일부 공백을 삽입하기 때문입니다.