在 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
本页包含一些有关如何使用的说明\directlua
:
http://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
。