如何从 lua 直接使用 mplib?

如何从 lua 直接使用 mplib?

我正在尝试通过从 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}

和分别%\避免虚假空格和没有空格所必需的。

相关内容