为什么 luacode 环境不忽略 lua 注释行?

为什么 luacode 环境不忽略 lua 注释行?

我确实(稍微)理解luacode和之间的区别luacode*,但是当我在注释行中写的内容导致 lualatex 对我尖叫时,我差点从座位上摔下来。我改成了luacode*luacode结果由于注释中的某些内容而出现错误。

我本以为注释就是注释,但这告诉 lualatex,请不要查看此行的任何内容,无论我是否正在运行luacodeluacode*

编译成功

\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帮助:

Mathematica 图形

我正在尝试一些东西。如果我还担心注释中的内容会影响解析器,那么这将使我很难处理代码和注释行。

问题是:为什么 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\beginand\string\end或类似的(或者更好,\\正如 Mico 所指出的,如果不是注释,您会想要\\not )。\

其重点luacode*在于它改变了 catcode,\因此\begin将其视为 6 个字符,而不是要扩展的 tex 命令。

该错误与 Lua 注释语法无关,Lua 从未启动,您会从

\begin{luacode}
 a b wibble
?? xx ("\begin{verbatim}".."\end{verbatim}")
 @@@@
end
\end{luacode}

相关内容