如何在使用 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 手册的屏幕截图: