在 LuaTeX 中打印 LaTeX 代码

在 LuaTeX 中打印 LaTeX 代码

在 Lua 中完成计算,并根据结果某种类型的单元格必须显示数据。

这有效:

\multicolumn{3}{p{11cm}}{Test}&-10\\[0.4cm]

但这并不

\directlua{tex.print(\multicolumn{3}{p{11cm}}{Test}&-10\\[0.4cm])}

出现以下错误消息:

! Undefined control sequence.
\@setfontsize ...b ####1<#2}\@tempa >##2<##3\@nil 
                                                  {\def \bright@baselineskip...

打印 LaTeX 代码的正确方法是什么directlua

这是一个简单的例子:

\documentclass{article}
\usepackage{array,longtable}
\begin{document}

\begin{longtable}{p{8cm}rrr}
\textbf{1}&2é&3&4\\ \hline\\
\multicolumn{3}{l}{1}&\bf 2\\
\multicolumn{3}{l}{1}&\bf 2\\
\directlua{tex.print("\multicolumn{3}{l}{1}&\bf 2")}
%\directlua{dofile('test.lua')}
\end{longtable}

\end{document}

答案1

另一种选择是使用luacode包及其luacode*环境,但它不会扩展:

\documentclass{article}
\usepackage{array,longtable}
\usepackage{luacode}
\begin{luacode*}
  function mymulticol()
    tex.sprint([[\multicolumn{3}{l}{1}&\bf 2]])
  end
\end{luacode*}
\begin{document}

\begin{longtable}{p{8cm}rrr}
\textbf{1}&2é&3&4\\ \hline\\
\multicolumn{3}{l}{1}&\bf 2\\
\multicolumn{3}{l}{1}&\bf 2\\
\directlua{mymulticol()}
\end{longtable}

\end{document}

一般来说,你应该只在 中包含简单的函数调用\directlua,由于扩展问题以及 Lua 和 TeX 代码的混合,复杂的代码更难维护。对于较长的 Lua 代码,最好将它们放在专用文件中(可能作为LuaTeXBase 模块)。


为了解释为什么会出现这些问题,考虑一下它\directlua做了两件事:首先,它像写入文件一样扩展了它的参数,其次,它将扩展解释为 Lua 代码。这两个步骤都必须成功并产生有意义的结果。举一个简单的例子,我们尝试\TeX从 Lua 打印(给出 TeX 徽标)。\directlua{tex.sprint(\TeX)}扩展\TeX命令,导致 Lua 端出现垃圾数据。\directlua{tex.sprint(\noexpand\TeX)}阻止扩展,以便 Lua 看到tex.sprint(\TeX),这仍然是无效的 Lua 代码,因为 Lua 需要一个字符串。下一个改进\directlua{tex.sprint("\noexpand\TeX")}至少不会导致编译错误,但仍然没有给出预期的结果:Lua 看到tex.sprint("\TeX")并尝试解释反斜杠转义(在这种情况下,反斜杠被删除,因为\T不是有效的转义序列)。只有我们抑制反斜杠转义解释,\directlua{tex.sprint([[\noexpand\TeX]])}代码才能按预期工作。请注意,在这种情况下,我们必须同时抑制 TeX 扩展和 Lua 的转义字符才能获得预期的结果。

答案2

\directlua充分展开它的论点。所以你需要确保输出oftex.print相当于你直接在文件中输入的内容。例如,

\directlua{tex.print("\multicolumn{3}{l}{1}&\bf 2")}

使用

\directlua{tex.print("\string\\multicolumn{3}{l}{1}&\string\\bf 2")}

答案3

您需要注意的是扩展。\directlua以及 都luacode完全展开它们的参数。 使用 转义""通常有效。 还有\luastringescape但我在使用它时也遇到了问题。 对于较大的块而不是使用 \directlua { dofile('mysetups.lua')},请参阅手册第 18 页。

\documentclass{article}
 \usepackage[utf8]{luainputenc}
 \begin{document}

 \def\name{Yiannis}
 \begin{luacode}
 function Test(name)
     tex.print{name}
 end
 Test("\name")
 \end{luacode}

 \directlua{tex.sprint(Test("\name"))}
 \end{document}

答案4

本页包含一些有关如何使用的说明\directluahttp://wiki.luatex.org/index.php/Writing_Lua_in_TeX

在您的示例中,这将有效:

\directlua{tex.print([[\noexpand\multicolumn{3}{l}{1}&\noexpand\bf 2]])}

\directlua{tex.print([[\unexpanded{\multicolumn{3}{l}{1}&\bf 2}]])}

\multicolumn但是使用inside\directlua或其他命令时必须小心。\multicolumn必须是单元格中的第一个东西,否则会出现错误misplaced \omit(这就是 dofile 不起作用的原因)。通常,最好不要将其用作\multicolumn第一个命令。尝试在 \multicolumn 之前放置一些内容,\directlua例如行尾\\\multicolumn或单元格分隔符&\multicolumn

相关内容