我正在尝试了解我可以使用 luatex 的纯 Lua 接口来格式化我的文档到什么程度。为此,我想知道是否可以在纯 lua 中修剪/裁剪图片。我尝试了img
lualatex 库,但似乎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_save
以pdf_restore
保持 PDF 位置不变。然后我插入胶水以将图像向左和向上移动,传递给 TeX 的结果是包含所有这些的 vbox。