以下代码只是尝试打印宏的第一个参数。我尝试了网上找到的各种方法(很少)来在 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}") }}