我正在尝试通过从 lualatex 调用 mplib 来绘制一些图形。“标准”方法是使用 luamplib 包和mplibcode
环境。我很好奇,有没有办法直接从 lua 调用 mplib?只要 mplibcode 是一种“简单”和“LaTeX”的方式,就应该是可能的。但是,我找不到有关此主题的任何文档或示例。不幸的是,luamplib 手册中的解释在第 54 行就停止了,在我真正了解其背后的机制之前。似乎很少有人知道如何做到这一点,他们只是没有时间向其他人提供任何文档。
此主题提出了一个看似不自然的解决方案:在环境中有 lua 代码生成 tex 代码,Tikz
然后又通过 lua 调用 mplib。
例子
最小的例子是:
示例.tex:
\documentclass{article}
\usepackage{luamplib}
\begin{document}
\directlua{ dofile('testmplibmin.lua') }
\directlua{ StartMP() }
\end{document}
testmplibmin.lua:
local mpkpse = kpse.new("luatex", "mpost")
local function finder(name, mode, ftype)
if mode == "w" then
return name
else
return mpkpse:find_file(name,ftype)
end
end
function StartMP()
local mplib = require('mplib')
local mpx=mplib.new({find_file=finder,ini_version=true})
local result = mpx:execute('input plain;')
result=mpx:execute('beginfig(1); draw fullcircle scaled 20 withcolor red; endfig;')
local t,e,l = result.term,result.error,result.log
if result.status>0 then
tex.print([[Result of mplib execute is unsuccessfull.]])
else
if result.fig then
tex.sprint('Converted something: \\vrule\\vbox{\\hrule')
local converted=luamplib.convert(result)
tex.sprint('\\hrule}\\vrule')
else
tex.print([[No figure output.]])
tex.print([[Log:]])
tex.print(l)
end
end
mpx:finish()
end
我会尝试进一步改进(=缩短)它。例如,我相信有一种方法可以使用查找器功能luamplib。欢迎发表任何评论。
答案1
metapost 源发行版中的 mplibapi.pdf 文件记录了低级接口。不过,阅读 luamplib 代码可能也是明智之举,因为从 mplib 的返回表(包含图像)到 PDF 文字代码的转换并不是一件简单的事情。 http://www.tug.org/metapost/src/manual/mplibapi.pdf
答案2
我同意luamplib应该至少给出几个例子。下面就是预期的结果
\documentclass[a4paper]{article}
\usepackage{luamplib}
\begin{document}
Some text%
\begin{mplibcode}
beginfig(1);
draw (0,0)--(100,0)--(100,100)--(0,100)--cycle;
endfig;
\end{mplibcode}
\ Some other text
\end{document}
和分别%
是\
避免虚假空格和没有空格所必需的。