我确实(稍微)理解luacode
和之间的区别luacode*
,但是当我在注释行中写的内容导致 lualatex 对我尖叫时,我差点从座位上摔下来。我改成了luacode*
,luacode
结果由于注释中的某些内容而出现错误。
我本以为注释就是注释,但这告诉 lualatex,请不要查看此行的任何内容,无论我是否正在运行luacode
或luacode*
编译成功
\documentclass[12pt]{scrbook}%
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}
\usepackage{luacode}
\begin{luacode*}
function foo()
--print("\begin{verbatim}".."\end{verbatim}")
tex.print("done")
end
\end{luacode*}
\begin{document}
\directlua{foo()}
\end{document}
改成luacode,现在失败了
\documentclass[12pt]{scrbook}%
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}
\usepackage{luacode}
\begin{luacode}
function foo()
--print("\begin{verbatim}".."\end{verbatim}")
tex.print("done")
end
\end{luacode}
\begin{document}
\directlua{foo()}
\end{document}
错误是
lualatex foo2.tex
This is LuaTeX, Version 0.95.0 (TeX Live 2016)
restricted system commands enabled.
.....
(/usr/local/texlive/2016/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)))
! Undefined control sequence.
\luacode@begin ...#1\relax \edef \luacode@endmark
{\string \end {\@currenvir...
l.10 \end{luacode}
?
但是该行被注释掉了!真的吗?
来自lua帮助:
我正在尝试一些东西。如果我还担心注释中的内容会影响解析器,那么这将使我很难处理代码和注释行。
问题是:为什么 luacode 中注释行不会被忽略?
答案1
如果你改变线路
--print("\begin{verbatim}".."\end{verbatim}")
到
--print("\\begin{verbatim}".."\\end{verbatim}")
luacode
无论您使用的是还是环境,您的代码都可以很好地编译luacode*
。
在luacode
环境中,TeX 宏被展开。由于 Lua 和 TeX 对反斜杠字符的看法不同,因此您需要编写\\
,Lua 会在将其传递给 TeX 之前将其重写为\
;当然,\
这就是您想TeX 来看看。
相反,在luacode*
环境中,TeX 宏不会被扩展,因此注释启动器后面的内容并不重要--
。
答案2
luacode 包手册在第 2 页的表格中列出了哪些构造以哪种形式工作。 (lucode
并且luacode*
都记录为支持--
注释。)
问题正在发生前由于您没有阻止在 TeX 中扩展\begin
并\end
构造要传递给 lua 的块,因此正在调用 lua。您需要\string\begin
and\string\end
或类似的(或者更好,\\
正如 Mico 所指出的,如果不是注释,您会想要\\
not )。\
其重点luacode*
在于它改变了 catcode,\
因此\begin
将其视为 6 个字符,而不是要扩展的 tex 命令。
该错误与 Lua 注释语法无关,Lua 从未启动,您会从
\begin{luacode}
a b wibble
?? xx ("\begin{verbatim}".."\end{verbatim}")
@@@@
end
\end{luacode}