您可以使用 LuaTeX 做什么的简单示例是什么?

您可以使用 LuaTeX 做什么的简单示例是什么?

我听说使用 LuaTeX,您可以在文档中嵌入 Lua 代码,这些代码可直接与 TeX 内部函数配合使用,从而可以完成一些使用宏难以完成的任务。请举一个使用 LuaTeX 可以轻松完成的任务的具体例子。

(我懂了这里LuaLaTeX 已经在 Debian 上进行测试,您可以编写如下文档:

\documentclass{article}
\usepackage{luacode}

\begin{document}
A random number:
\begin{luacode}
tex.print(math.random())
\end{luacode}
\end{document}

结果是

A random number: 0.135494265234

所以我期望其他有用的、非平凡的事情也是可能的。)

答案1

这是我正在做的事情的一个例子。

我正在编写一个包含很多部分的文档。每个部分的末尾都有一个分数,由 3 个数字组成。第一个数字的范围是 0-10,后两个数字的范围是 0-3。而且第一个数字的范围是倒置的,这意味着 1 是最大的,10 是最小的,但 0 仍然应该是 0。此代码输出每个分数以及它计算的平均分数。

\def\score#1#2#3{
    \directlua{
        s1 = #1;
        s2 = #2;
        s3 = #3;

        if s1 > 0 then
            s1 = 11 - s1
        end

        avgscore = (s1 + (10 * s2 / 3) + (10 * s3 / 3)) / 3;

        tex.print("Score 1: ", s1, ", ")
        tex.print("Score 2: ", s2, ", ")
        tex.print("Score 3: ", s3, ", ")
        tex.print("Combined Score: ", string.format("\%0.2f", avgscore))
    }
}

然后我在我的文档中的多个地方使用它,像这样:

\section{stuff}
....
\score{8}{3}{0}
....
\section{even more stuff}
....
\score{0}{1}{1}

我还将这些分数转储到一个文件中(使用 lua),稍后再读取它们(再次使用 lua),并使用 pgfplots 创建某些事物的图表。可能有更好的方法来做到这一点,但我不愿意花余生学习如何进行一些计算。

答案2

TeX 编程相当复杂,因为它从来就不是通用编程语言(尽管它是图灵完备的)。添加 Lua 使许多编程工作变得容易得多。同时,LuaTeX 人员正在公开 TeX 的内部结构,以便 Lua 可以对其进行更改。这使得许多巧妙的东西成为可能。目前最好的一些示例可以在ConTeXt 维基,因为 ConTeXt 和 LuaTeX 联系非常紧密。

答案3

由 Epub 问题触发:这是您可以使用 luatex 轻松完成的一些有用的事情:

{\catcode`\#=12
\directlua {
local words = io.open('hyphens-' .. tex.jobname .. '.txt', 'w');
local outchar = unicode.utf8.char
local function dumphyphens (head)
   local data = {}
   for v in node.traverse(head) do
       if v.id == node.id('glyph') then
         data[#data+1] = outchar(v.char);
       elseif v.id == node.id('disc') then
          data[#data+1] = '-'
       elseif v.id == node.id('glue') then
         data[#data+1] = outchar(32)
       elseif v.id == node.id('hlist') then
         data[#data+1] = dumphyphens(v.list)
       end
   end
   return table.concat(data)
end
callback.register ('hyphenate', function (head,tail)
   lang.hyphenate(head, tail) 
   words:write (dumphyphens(head) .. outchar(10))
   end)
}}

\input knuth
\bye

这会将 luatex 被要求从源中的此时点开始添加连字点的所有字符的转储写入 hyphens-\jobname.txt,并将每个回调调用的输出放在一行上。

尽管您不能使用它来生成 Epub(主要是因为像 \TeX 这样的宏会创建两行输出,一次“E”仅用于降低的 hbox,一次“TEX”用于实际的宏使用)输出仍然有用,因为您可以检查以确保您使用的连字模式没有允许的潜在错误中断。

答案4

查看那些示例。即使“普通”用户可能认为 LaTeX 不需要通用语言,他们也会从内部使用 Lua 脚本的软件包中受益。

相关内容