无法访问 lua 块中的参数

无法访问 lua 块中的参数

以下代码只是尝试打印宏的第一个参数。我尝试了网上找到的各种方法(很少)来在 lua 中打印 #1,但都不起作用。我猜想在 lua 中解释它存在问题。如果有一些关于弥合 tex 和 lua 之间差距的教程就好了。我见过的大多数东西都使用外部 lua 文件或不引用 directlua 块中的宏以外的任何东西。

\documentclass[11pt]{book} % use larger type; default would be 10pt

\usepackage{luatex}
\usepackage{pgffor}

\tracingonline 6

\directlua{
    tex.enableprimitives('',tex.extraprimitives())
    local lpeg = require "lpeg"
}

\begin{document}

\def\Parse#1{

    \directlua{
        cmdString = tostring(#1)

        tex.print(cmdString)
    }
}

\Parse{hello12341234asdf}


\end{document}

答案1

您不应该只指定#1为 的参数tostring;而是尝试类似 的东西"\luatexluaescapestring{#1}"。通过这种修改,您的 MWE 可以正常工作:

\documentclass[11pt]{book}
\usepackage{luatex,pgffor}
\tracingonline 6
\directlua{
    tex.enableprimitives('',tex.extraprimitives())
    local lpeg = require "lpeg"
}
\def\Parse#1{
    \directlua{
        cmdString = tostring("\luatexluaescapestring{#1}")
        tex.print(cmdString)
    }
}
\begin{document}
\Parse{hello12341234asdf}
\end{document}

2016 年 5 月更新:Alain Matthes 在评论中指出,上面显示的代码不再运行,至少在 TeXLive2015 中不能运行。问题原来与luatex系统上安装的软件包版本有关。幸运的是,本月早些时候 Heiko Oberdiek 发布了软件包更新,luatex修复了这个问题。

由于 TeXLive2015 目前处于“冻结”状态,因此需要从 CTAN 下载更新包并手动安装,切换到最新版本的 TeXLive2016-pre,或者等待几周直到 TeXLive2016 的正式版本发布并可安装。

或者,加载luacode包而不是luatex包。

答案2

Mico 已经给出了正确答案。让我进一步解释一下。当你写:

\def\Parse#1{\directlua{   cmdString = tostring(#1)  }}

并调用\Parse{hello12341234asdf},结果大致如下:

\directlua{   cmdString = tostring(hello12341234asdf)  }

这当然不是你想要的。你需要在定义两边加上引号:

\def\Parse#1{\directlua{   cmdString = tostring("#1")  }}

并调用 \Parse{hello12341234asdf},得到

\directlua{   cmdString = tostring("hello12341234asdf")  }

现在如果你跟注会发生什么\Parse{hello"1234}?你会得到

\directlua{   cmdString = tostring("hello"1234")  }

这又不是你想要的。因此你需要转义 的内容#1。这就是\luaescapestring{}你所做的。但这在 LaTeX 中不起作用,因为在 LaTeX 中,参考手册中的每个 Lua 命令都以 为前缀luatex(除了\directlua)。因此定义是 Mico 写的:

\def\Parse#1{\directlua{   cmdString = tostring("\luatexluaescapestring{#1}")  }}

相关内容