Lualatex,在lua中处理图片

Lualatex,在lua中处理图片

我正在尝试了解我可以使用 luatex 的纯 Lua 接口来格式化我的文档到什么程度。为此,我想知道是否可以在纯 lua 中修剪/裁剪图片。我尝试了imglualatex 库,但似乎bbox只适用于 pdf...

谢谢你!

平均能量损失

\documentclass{article}
\usepackage{lipsum}

\begin{document}%
\directlua{
  local a = img.write({ filename = "simpson.jpg"; width="5cm"
    % Trim/clip ?
      })
}  
\end{document}

-- 编辑 -- 我尝试了以下代码,但输出 pdf 包含 0 页。

local image_fixed = img.scan({filename = "simpson.jpg"})
local image     = img.copy(image_fixed)

local a=node.new("whatsit","pdf_literal")
pdf_save = node.new("whatsit","pdf_save")
pdf_restore = node.new("whatsit","pdf_restore")

a.data = string.format("%g %g m %g %g l %g %g l %g %g l W n ",10,10,20,10,20,20,10,20)
i = img.node(image)
node.insert_after(pdf_save,pdf_save,a)
node.insert_after(a,a,i)

顺便说一句,我不确定我应该使用哪个单位,也不确定这些特殊节点a.data到底是什么......whatsit

--编辑2--

感谢您的代码。它运行良好,我只是有些不明白为什么我需要这三个pdf_*节点,但至少它似乎可以工作,而且我也明白单位是英寸/72。我只是有些不明白为什么图片占用的空间比预期的要多。例如,如果我将代码包装\directlua\tcbox{...}(加载\usepackage[most]{tcolorbox}),图片会占用大量空间,对于一张非常小的图片来说:

在此处输入图片描述

谢谢你!

答案1

我把文件分成了 TeX 和 Lua 两个部分。“驱动程序”

\documentclass{article}

\begin{document}%
\fboxsep0pt
a\fbox{\directlua{dofile("foo.lua")}}b
\end{document}

和 Lua 文件(foo.lua当然要调整文件名):

local myimg = img.scan({filename = "hacker.jpg"; width="5cm"})
local imgnode = img.node(myimg)

local pdf_save = node.new("whatsit","pdf_save")
local pdf_restore = node.new("whatsit","pdf_restore")
local pdf_literal = node.new("whatsit","pdf_literal")

-- all in DTP points (1/72 inches)
local x,y,wd,ht = 10, 10, 30, 50

-- This creates a rectangle and uses it (W) as a clipping path.
-- Try S instead of n to see the path
pdf_literal.data = string.format("%g %g m %g %g l %g %g l %g %g l W n ",x,y,x + wd,y,x + wd,y + ht,x,y + ht)

node.insert_after(pdf_save,pdf_save,pdf_literal)
node.insert_after(pdf_literal,pdf_literal,imgnode)
local box = node.hpack(pdf_save)
box.depth = 0
node.insert_after(box,node.tail(box),pdf_restore)
box = node.vpack(box)

local glu1 = node.new("glue")
local glu2 = node.new("glue")

glu1.width = -x * 2^16
glu1 = node.insert_after(glu1,glu1,box)
box = node.hpack(glu1)

glu2.width = -myimg.height  + ( ht + y ) * 2^16
glu2 = node.insert_after(glu2,glu2,box)
box = node.vpack(glu2)

box.height = ht * 2^16
box.width =  wd * 2^16
box.depth = 0



node.write(box)

这样就在物品周围创建了几个盒子pdf_*,并插入胶水以将内容物向上和向左移动。

必须注意这里有两个层。TeX 层和 PDF 层,它们彼此之间没有任何联系。PDF 层用于将图像裁剪到给定路径。TeX 不理解 PDF 操作符,因此 TeX 认为您插入了完整的图像。您必须通过在顶部和左侧插入负胶合或负字距来移动图像,并且必须更改框大小,以便裁剪后的图像出现在正确的位置。

还有其他方法可以做到这一点,但它们与这种方法没有太大区别。

顺便说一句:单位是 DTP 点(1/72 英寸,pdf_*whatsit 节点)和 TeX 点(1/72.27 英寸),因此您必须在它们之间进行转换。我在下面的计算中忽略了差异。

缩放后的图像

我上面所做的是创建传递给 TeX 的 LuaTeX “节点”。节点列表如下所示(点击放大):

在此处输入图片描述

您可以从右下角到左上角(从内到外)阅读此内容。最后一个节点是图像(技术上是规则节点),我将添加到前面pdf_literal以创建视口。在其周围,我添加了一个带有和的 vbox,pdf_savepdf_restore保持 PDF 位置不变。然后我插入胶水以将图像向左和向上移动,传递给 TeX 的结果是包含所有这些的 vbox。

相关内容