Lua 的实际应用

Lua 的实际应用

虽然我总是使用 LuaLaTeX 来编译我的文档,但我并不真正使用Lua经常这样。有时我甚至会忘记它。

在我的上一篇文档中,我使用它编写了一个随机单词生成器,它可以从单词池中挑选一个单词。这在许多不同的文档和情况下都非常有用。我在另一个问题中想出了这个代码,但如果有人想使用它,我会在这里重新发布它。

所以今天我问自己,Lua 在 TeX 文档中还有哪些其他好用途?现在轮到你发表你的想法了。


感谢大家的精彩回答。其中有一些很棒的想法,我当然可以在自己的文档中好好利用它们(我想其他用户也一样 :) )。在我看来,每个答案都值得打勾,所以我想我会让社区决定并选择获得最多赞成票的答案。

当然,这并不意味着你必须停止发布你的绝妙想法;)

答案1

LaTeX 无法完成您可能想要排版的所有事情。有时您可能需要另一种(脚本)语言的强大功能。您可以自由使用 Perl、PHP、bash 脚本或任何其他脚本。但 Lua 的主要优势非常简单 - 它可用。在所有受支持的平台上。用户无需安装任何其他东西!

在我的getmap包中,我使用 Lua 脚本连接 Web 服务器来下载地图:

在此处输入图片描述

% compile with pdflatex -shell-escape
\documentclass{article}
\usepackage[latin1]{inputenc}
\usepackage{graphicx}
\usepackage{filecontents}
% use overwrite while optimizing the image
\usepackage[overwrite,mode=gm]{getmap}
\begin{document}
\begin{filecontents*}{berlin.epl}
&path=weight:5|color:purple|enc:_xq_IcgrpA?AFE@?^BFE@A^U@CLQXEZU?gCR?B?DBF@@?vA?D?D?BAHE@JBN@JLGFCG[DC~C?@?F?R?vA?p@iB@i@Fe@JWRSTOf@Gh@C^A?e@?gE?w@r@?lB@hA?`@??M?aA?]dI??O?O?Cn@cBfBeF|AeEHNVNBc@H@H_AEwA?OAMNA@N
\end{filecontents*}
\getmap[file=berlin, language=de, xsize=400, ysize=600,
        markers={&markers=size:mid|label:H|color:green|Berlin, Hbf
                 &markers=label:B|color:blue|Brandenburger Tor, Berlin},
        pathfile={berlin.epl}]{}
\includegraphics[width=6cm]{berlin}
\end{document}

该路线被导出到并gpx file通过同一个 Lua 脚本转换为编码折线(Google 的路线格式):

getmapdl -m gpx2epl -G berlin.gpx

因此,从我的角度来看,嵌入Lua 解释器开辟新视野!

答案2

最新版本的 Tikz 支持使用 LuaTeX 自动进行图形布局。当给出适当的 TikZ 选项时,将调用一系列 Lua 脚本,这些脚本接收图形的结构并计算节点的位置。支持各种自动图形布局算法。手册中还记录了使用 Lua 编写自己的算法的 API。Lua 本身的运行时动态链接功能还支持 C/C++。

手册中的示例(注意layered layout选项):

图表示例

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.spaced,graphdrawing,graphs}
\usegdlibrary{layered}
\begin{document}
\tikz [nodes={text height=.7em, text depth=.2em,
              draw=black!20, thick, fill=white, font=\footnotesize},
       >=spaced stealth', rounded corners, semithick]
  \graph [layered layout, level distance=1cm, sibling sep=.5em, sibling distance=1cm] {
    "5th Edition" -> { "6th Edition", "PWB 1.0" };
    "6th Edition" -> { "LSX" [>child anchor=45], "1 BSD", "Mini Unix", "Wollongong", "Interdata" };
    "Interdata" -> { "Unix/TS 3.0", "PWB 2.0", "7th Edition" };
    "7th Edition" -> { "8th Edition", "32V", "V7M", "Ultrix-11", "Xenix", "UniPlus+" };
    "V7M" -> "Ultrix-11";
    "8th Edition" -> "9th Edition";
    "1 BSD" -> "2 BSD" -> "2.8 BSD" -> { "Ultrix-11", "2.9 BSD" };
    "32V" -> "3 BSD" -> "4 BSD" -> "4.1 BSD" -> { "4.2 BSD", "2.8 BSD", "8th Edition" };
    "4.2 BSD" -> { "4.3 BSD", "Ultrix-32" };
    "PWB 1.0" -> { "PWB 1.2" -> "PWB 2.0", "USG 1.0" -> { "CB Unix 1", "USG 2.0" }};
    "CB Unix 1" -> "CB Unix 2" -> "CB Unix 3" -> { "Unix/TS++", "PDP-11 Sys V" };
    { "USG 2.0" -> "USG 3.0", "PWB 2.0", "Unix/TS 1.0" } -> "Unix/TS 3.0";
    { "Unix/TS++", "CB Unix 3", "Unix/TS 3.0" } -> "TS 4.0" -> "System V.0" -> "System V.2" -> "System V.3";
};
\end{document}

答案3

LuaTeX 为 TeX 操作的内部提供了各种新接口。例如,段落构建算法已经以多种非常有用的方式开放。此功能可以创建新的软件包,这些软件包可以完成以前不可能完成的各种工作。

例如,塞尔诺利格包——对德语和英语文本进行选择性的印刷连字抑制,没有繁琐的手工标记或预处理器的运行——在很大程度上取决于各种 LuaTeX 回调来完成其工作。如果没有 LuaTeX,这个包根本就不存在。(完全披露:我是这个包的主要作者。)

答案4

认真对待这个问题,这里有一些来自 Context 来源的例子†:

请注意,许多功能分布在多个文件中。在这些情况下,我仅链接了入口点/主文件。

相关内容