我读到上下文主要是在内部使用 Lua 编写的。
所以我想知道这是否意味着在 Context 文档中使用 Lua 会比在 LuaLatex 中使用 Lua 简单得多?我猜想那里的界面会更简单?
由于我更喜欢使用 Lua 而不是 Latex 语言(更容易阅读和理解),我认为如果在 Context 文档中使用 Lua 比在 Lualatex 文档中执行相同操作容易得多,那么这将是使用 Context 的一个优势。
由于我对 Context 了解甚少,因此这里有一个在 Lualatex 中使用 Lua 的示例。我想知道这个示例在 Context 文档中会是什么样子。
但是如果您认为它可以更好地说明在 Context 上使用 Lua 与在 Lualatex 中使用 Lua 的优势/易用性,请随意提供您的示例。
此示例使用 Lua 将分数简化为最低公共项。
\documentclass{article}
\usepackage{luacode}
\usepackage{amsmath}
%------------------------
\begin{luacode}
function simplify(a,b)
local function gcd(a,b)
if b ~= 0 then
return gcd(b, a % b)
else
return math.abs(a)
end
end
t = gcd(a, b)
tex.print("\\frac{"..a//t.."}{"..b//t.."}")
end
\end{luacode}
\newcommand\simplify[2]{\directlua{simplify(#1,#2) }}%
%-------------------
\begin{document}
Can I make \LaTeX{} reduce a fraction automatically?
For example, I would like the fraction
%
\begin{equation*}
\frac{278\,922}{74\,088}
\end{equation*}
%
to be reduced to
%
\begin{equation*}
\simplify{278922}{74088}
\end{equation*}
\end{document}
使用 Lualatex 进行编译
这段代码在 Context 文档中看起来会是什么样子?在 Context 文档中使用 Lua 可以做哪些在 Lualatex 文档中无法完成的事情?或者在 Context 文档中使用 Lua 做哪些事情比在 Lualatex 文档中做同样的事情容易得多?
TL 2023
答案1
不是一个真正的答案,但评论太长了。我在阅读这个问题时碰巧与汉斯联系,然后他给我发了以下内容,所以我猜它看起来可能是这样的:
\startluacode
local abs = math.abs
local round = math.round
local function gcd(a,b)
return b ~= 0 and gcd(b,a%b) or abs(a)
end
interfaces.implement {
name = "Sfrac",
arguments = "2 strings",
public = true,
actions = function(a,b)
local t = gcd(a,b)
context.frac(round(a//t),round(b//t))
end
}
\stopluacode
\setupmathematics[autopunctuation=comma]
\starttext
\samplefile{knuthmath}
\startformula
\frac{278,922}{74,088}
=
\Sfrac{278922}{74088}
\stopformula
\samplefile{knuthmath}
\stoptext
我不是分析编码风格和效率或诸如此类事情的合适人选,所以我把这个留给其他人,但让我提一下以下几点:
在与 Hans 合作近两年后,主要在数学排版方面,但也在其他几个方面,我看到很多他编写的代码,包括 C、lua 和 tex(cod 是 luametatex 引擎的一部分,还有 ConTeXt 系统)。我的印象是,他在写作方面提出了一个非常有力的观点干净且优化的代码。ConTeXt 有不同的版本,具体取决于引擎的开发(mkii 用于 pdftex)、(mkiv 用于 luatex)和(mkxl 用于 luametatex),这些年来,这可能简化了很多,因为它使得一次可以集中精力于一个引擎。对于当前版本,他一直在开发 luametatex 引擎和 ConTeXt lmtx(就像 luatex 和 ConTeXt mkiv 一样,如果我错了请纠正我,但也许他在创建 pdftex 引擎和开发 mkii 时也参与了一些工作),这并没有什么坏处。关键是他对整个组合系统有着非常好的、独特的概述,因此知道在哪里投入精力。他只需控制引擎和宏包,然后就可以做出决定。当然,这并不表明或暗示 ConTeXt 对 lua 有更好的支持(毕竟,两个系统都可以运行 lua),但我认为人们应该意识到 lua 一直存在的事实可能会产生影响。
其他人必须详细说明 luaLaTeX 的 lua 部分如何演变并展示很好的例子。
答案2
我想添加与 mickep 不同的抽象级别。他的示例很好地说明了从 Lua 到 TeX 的计划接口以及如何正确定义 Lua 端的命令。我的回答将重点介绍文档中的临时用法,这可能是也可能不是您想要的,但我经常使用并喜欢在 ConTeXt 中使用。
考虑以下文档(是的,它是临时的,所以这正是我想要表达的观点):
\starttext
\startluacode
context.startxtable()
context.startxtablebody()
for i,t in ipairs({"test", "test 2", "test 3"}) do
context.startxrow()
for j,v in ipairs({i, t, "col 3", "col 4"}) do
context.startxcell()
context(v)
context.stopxcell()
end
context.stopxrow()
end
context.stopxtablebody()
context.stopxtable()
-- example for passing arguments from https://wiki.contextgarden.net/CLD
context.placefigure(
"none",
function()
context.framed( {
frame="on",
align="middle"
},
function() context.input("knuth") end
)
end
)
context.par()
\stopluacode
\stoptext
代码的第一部分说明了如何通过循环创建表格。在 LuaLaTeX 中,我一直无法正确地完成这项工作,因为我从未设法正确地转义值或做错tex.print
事,尤其是在表格处理和单元格方面。
此外,这还说明您可以从context
表/命名空间访问所有常规 ConTeXt TeX 命令,例如context.startxtable()
for\startxtable
等。这样,您就不会在打印输出中到处都有转义的命令,但它看起来和感觉起来像 Lua(尽管我的代码不是惯用的 Lua)。
第二部分是我从 ConTeXt wiki 上复制的 ConTeXt Lua 文档。它说明了如何管理 Lua 中的高级命令(甚至添加参数;您可以像之前为 xtable 添加参数一样添加参数)。特别注意中的可选参数如何\framed[frame=on, align=middle]{\input{knuth}}
很好地映射到 Lua 表({frame="on", align="middle"}
),并且您可以使用任意函数在实际框架内输出任何内容。
总结一下我的个人观点:是的,在 ConTeXt 中使用 Lua 比在 LuaLaTeX 中使用 Lua 更自然,甚至更容易。是的,我甚至构建了完整的 ConTeXt 文档,这些文档读起来就像 Lua 而不是 TeX。这是可行的,有时很有趣,是完成这项工作的合适工具。
附言:希望我编辑了这个答案以添加上述代码输出的屏幕截图。使用context foo.tex
TL 2023 进行编译。