LuaLaTeX: 노드 라이브러리를 사용하여 멀티콜 환경(일련의 vbox)의 실제 높이 찾기

LuaLaTeX: 노드 라이브러리를 사용하여 멀티콜 환경(일련의 vbox)의 실제 높이 찾기

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.tailLua 명령 앞에 삽입된 마지막 노드 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를 사용할 때 포함되지만 원시 상자를 볼 때는 포함되지 않는 일부 공백을 삽입하기 때문입니다.

관련 정보