在 Context 文档中使用 Lua 与在 Lualatex 文档中使用 Lua 有何不同或更容易?

在 Context 文档中使用 Lua 与在 Lualatex 文档中使用 Lua 有何不同或更容易?

我读到上下文主要是在内部使用 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.texTL 2023 进行编译。

在此处输入图片描述

相关内容