我的第一个 luaLaTeX 示例

我的第一个 luaLaTeX 示例

我对 LuaLaTeX 完全没有经验,我不知道为什么,但找到可用的 LuaLaTeX 示例以便我可以开始尝试却非常困难。

我终于在一份文档中找到了例子使用 LuaLaTeX 的数值方法(第 3 页):

\documentclass{article}
\usepackage{luacode}

\begin{luacode*}
    function trigtable ()
        for t=0, 45, 3 do
            x=math.rad(t)
            tex.print(string.format(
            ’%2d$^{\\circ}$ & %1.9f & %1.9f & %1.9f & %1.9f \\\\’, t, x, math.sin(x), math.cos(x), math.tan(x)))
        end
    end
\end{luacode*}

\newcommand{\trigtable}{\luadirect{trigtable()}}

\begin{document}
    \begin{tabular}{rcccc}
    \hline
    & $x$ & $\sin(x)$ & $\cos(x)$ & $\tan(x)$ \\
    \hline
    \trigtable
    \hline
    \end{tabular}
\end{document}

text.tex我从这个例子中发现,如何在 LaTeX 文档中实现 Lua 代码,这一切都很棒,但是如果我将它保存为并使用它来处理它,为什么这个例子无法用 LuaLaTeX 编译lualatex test.tex

我得到这个命令行输出:

This is LuaTeX, Version 1.0.4 (TeX Live 2017/Arch Linux) 
 restricted system commands enabled.
(./test.tex
LaTeX2e <2017-04-15>
(using write cache: /home/ziga/.texlive/texmf-var/luatex-cache/generic)(using r
ead cache: /var/lib/texmf/luatex-cache/generic /home/ziga/.texlive/texmf-var/lu
atex-cache/generic)
luaotfload | main : initialization completed in 0.128 seconds
Babel <3.12> and hyphenation patterns for 1 language(s) loaded.
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo(load luc: /home/ziga/.texlive/
texmf-var/luatex-cache/generic/fonts/otl/lmroman10-regular.luc)))
(/usr/share/texmf-dist/tex/lualatex/luacode/luacode.sty
(/usr/share/texmf-dist/tex/generic/oberdiek/ifluatex.sty)
(/usr/share/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
(/usr/share/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)))[\directlua]:5:
 malformed number near '2d'.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }

l.12 \end{luacode*}

答案1

(回答问题而不是投票结束,因为我找不到其他情况“附近有畸形数字”在此网站上,因此对于可能犯类似拼写错误的人来说,这个问题很有用。)

错误消息

[\directlua]:5: ‘2d’ 附近数字格式错误。

告诉你在哪里看:第 5 行之内luacode 块中,靠近字符串2d。这是您的文件包含的内容(第 5 行的一部分替换为...):

        tex.print(string.format(
        ’%2d$^{\\circ}$ ...

注意 : 之前的字符%2d是 ',也就是U+2019 右单引号,Lua 解释器不知道如何处理它。实际上它知道:它认为 ' 是一个变量的名称,然后查看%并决定您要取余数,但在运算符的右侧,%您拥有的2d不是数字。(因此出现有关格式错误的数字的错误消息。)如果您有’ = 23和 然后string.format(’%4),后者会正确地给出 3。(在这种情况下,即使您没有定义为变量,Lua 的语法分析部分也不能立即给您一个错误,因为您可以稍后用该名称定义一个变量。)

' 是怎么跑到那里的?可能是你的编辑器出了问题;一定要修复它,否则还会再次出现。只需在两个地方将 ' 改为 ',你的代码就可以正常工作了;恭喜你的第一个 LuaLaTeX 文件正常工作了!

输出


另外:我发现最好将所有 Lua 代码放在单独的.lua文件中,并且.tex只在文件中包含\directlua{dofile('myluascript.lua')}(或其他内容)。这样,在编辑文件或在类似网站上显示文件时,您可以更好地突出显示 lua 代码的语法。

您的代码,将 lua 代码移出并遵循@marsupilam 使用字符串的建议[[ ... ]]

.tex文件:

\documentclass{article}
\directlua{dofile('lualatex-bug.lua')}
\newcommand{\trigtable}{\directlua{trigtable()}}

\begin{document}
    \begin{tabular}{rcccc}
    \hline
    & $x$ & $\sin(x)$ & $\cos(x)$ & $\tan(x)$ \\
    \hline
    \trigtable
    \hline
    \end{tabular}
\end{document}

lualatex-bug.lua

function trigtable ()
    for t=0, 45, 3 do
        x=math.rad(t)
        tex.print(string.format([[%2d$^{\circ}$ & %1.9f & %1.9f & %1.9f & %1.9f \\]],
                                t, x, math.sin(x), math.cos(x), math.tan(x)))
    end
end

答案2

您可能对 lua 长字符串感兴趣,希望丢弃字符串中的所有特殊字符并保留它们为原始字符。

这与 luaLaTeX 尤其相关,因为 lua 中的转义字符是反斜杠\

如果你想向 TeX 传递一个命令,\必须加倍,这样输入起来可能[[\mycmd]]"\\mycmd"[[\\]]更省事。"\\\\"

输出

在此处输入图片描述

代码

\RequirePackage{luatex85}
\documentclass[12pt,border=2pt]{standalone}
\usepackage{luacode}
\begin{luacode*}
  function trigtable ()
    for t=0, 45, 3 do
      local x=math.rad(t)
      local sf =[[%2d$^{\circ}$ & %1.9f & %1.9f & %1.9f & %1.9f \\]]
      tex.print(string.format(sf, t, x, math.sin(x), math.cos(x), math.tan(x)))
    end
  end
\end{luacode*}

\newcommand{\trigtable}{\luadirect{trigtable()}}

\begin{document}
    \begin{tabular}{rcccc}
    \hline
    & $x$ & $\sin(x)$ & $\cos(x)$ & $\tan(x)$ \\
    \hline
    \trigtable
    \hline
    \end{tabular}
\end{document}

相关内容