luatex 节点库:添加 pdf_setmatrix 节点后将 pdf 转换矩阵恢复到原始状态

luatex 节点库:添加 pdf_setmatrix 节点后将 pdf 转换矩阵恢复到原始状态

如何在使用 pdf_setmatrix whatsit 节点更改 pdf 转换矩阵后将其恢复到原始状态?恢复节点应与 vlist/hlist/word/glyph 配合使用。以下是我尝试将 pdf 转换矩阵仅应用于段落第 3 行时的完整代码、意外行为的屏幕截图(似乎转换已应用于第 3 行以后的所有行,正确的解决方案将在第 3 行末尾将 pdf 转换矩阵恢复到其原始状态)以及来自PDF 1.7 参考手册

注意:我谈论的 pdf 转换在 8.3 节中有解释PDF 1.7 参考手册,示例见第 118、119 页的图 13 和图 14;pdf 变换矩阵的概念解释见第 8.3.4 节。

我的尝试的输出: 我破碎的输出

完整代码:

\documentclass[notitlepage,letterpaper]{article}
\usepackage[letterpaper,left=2in,right=2in,top=1in,bottom=1in]{geometry}
\usepackage{blindtext}

\directlua{
    function my_post_lb_filter(head,groupcode)
      local linenumber=1;
      local HLIST = node.id("hlist")
      local WHATSIT = node.id("whatsit")
      for n in node.traverse(head) do
        if n.id==HLIST then
          if linenumber==3 then
            local matrix = node.new(WHATSIT,"pdf_setmatrix");
            matrix.data = "1 0 0 1 1 0";
            n.head=node.insert_before(n.list,n.head,matrix);
            % NOTE: Append node to the end of n.list to restore the state pdf matrix back to original (the way it was supposed to be before I appended node matrix at the beginning of line)
          end
        linenumber=linenumber+1;
        end
      end
      return head
    end
  luatexbase.add_to_callback('post_linebreak_filter', my_post_lb_filter, 'Play with luatex node library')
}

\begin{document}
  \blindtext[1]
\end{document}

PDF 1.7 手册的屏幕截图:

当前变换矩阵

相关内容