使用直接 lua 在中心环境中出现新命令的问题

使用直接 lua 在中心环境中出现新命令的问题
\documentclass{article}
\usepackage{luacode,xkeyval}
\makeatletter
\define@key{someop}{a}{\def\mop@one{#1}}%
\setkeys{someop}{a=0}%
\newcommand{\luaTest}[2][]{{%
\setkeys{someop}{#1}%
\directlua{%
local mystr = [[
test
]]
tex.print(tostring(#2).." "..\mop@one)
}%
}%
}%

\makeatother
\begin{document}
\luaTest{'First'}

\begin{center}
\luaTest{'First'}  
\end{center}

\end{document}

上述代码按预期工作并产生以下预期输出。

First 0
           First 0

但是下面的代码不起作用。

\documentclass{article}
\usepackage{luacode,xkeyval}
\makeatletter
\define@key{someop}{a}{\def\mop@one{#1}}%
\setkeys{someop}{a=0}%
\newcommand{\luaTest}[2][]{{%
\setkeys{someop}{#1}%
\directlua{%
local mystr = [[
test
]]

tex.print(tostring(#2).." "..\mop@one)
}%
}%
}%

\makeatother
\begin{document}
\luaTest{'First'}

\begin{center}
\luaTest{'First'}  
\end{center}

\end{document}

唯一的区别是之前有一个空行tex.print。它会引发以下错误。

 unexpected symbol near '\'.
\\luaTest ...print(tostring(#2).." "..\mop@one ) }
                                                  }

该命令仍然有效,但不在中心环境中。如果我删除\begin{center} ...\end{center},文档将被编译。问题是什么?有人能指出吗?虽然我可以通过删除空白行来解决问题,但我想了解问题所在。

答案1

里面的空行\directlua很重要。解析将插入一个\par标记。它在您的示例中出错,因为列表内部(并且中心是一个列表)\par具有特殊含义,但这并不意味着它在列表之外什么也不做。所以除非您真正知道它会做什么,否则请避免使用空行。

举个例子

\documentclass{article}

\begin{document}

{
 \makeatletter
 \@setpar{tex.print("blub")}
 \directlua{%
 tex.print(tostring(1))

 tex.print(tostring(2))
 }
}

\end{document}

会给

在此处输入图片描述

相关内容