我刚刚开始探索 LuaTeX 的世界,想编写一段代码,将名称打印到文档的新行。
\directlua{
for i=1,3,1 do
tex.print("FOO")
end
}
它应该产生以下输出:
FOO
FOO
FOO
而不是:
FOO FOO FOO
我该如何正确使用 Lua?\\
一个小时里,我尝试了各种方法。我是不是从错误的角度来解决这个问题?任何帮助我都非常感谢。
答案1
如果您使用的是 LaTeX (LuaLaTeX),我强烈建议不要使用\directlua{}
超过简单调用来执行另一个 Lua 文件。\directlua{}
这绝不安全。例如:
- 如果您使用 Lua 注释 (
--
),您的代码将获得 Q="!%"§I。这是因为\directlua{}
所有内容都在一行上读取。 - 如果您尝试使用文字
%
符号,例如在tex.print()
您...好吧,自己尝试一下。祝你好运。 - 如果您尝试使用这样的主动角色,
~
保证会产生令人惊讶的结果。 - 当您想要
tex.print()
与宏一起使用时,例如\par
,您必须做一些疯狂的事情来不让 TeX 在 Lua 看到宏之前看到该宏。 - 祝您好运插入像“\n”这样的字符串作为换行符。
luacode*
现在该怎么办?使用lua代码包裹:
\begin{luacode*}
for i=1,3,1 do
tex.print("FOO\\par")
end
\end{luacode*}
如果你不能使用lua代码包(例如,当您使用纯 TeX 时),使用dofile()
或require()
加载包并将代码放在那里。TeX 无法在那里找到并解释代码,只有 Lua 可以。然后您可以编写
for i=1,3,1 do
tex.print("FOO\\par")
end
没有麻烦。
答案2
tex.print
将其附加\endlinechar
到它打印的每个字符串(最后一个除外),因此只需在末尾打印一个空字符串。
\directlua{
for i=1,3,1 do
tex.print("FOO", "")
end
}
\bye
答案3
这里有两个问题:"\\"
Lua 中的 A 只给你一个文字反斜杠,而 TeX 会出错;就像在这个问题您必须使用"\\\\"
或[[\\]]
。此外,\directlua
还会扩展其中的控制序列;因此,如果您想将控制序列逐字传递到 Lua 中,则需要\noexpand
使用它或使用它\luaexec
。
以下三个中的任何一个都可以:
\directlua{
for i=1,3,1 do
tex.print([[FOO\noexpand\\]])
end
}
\luaexec{
for i=1,3,1 do
tex.print([[FOO\\]])
end
}
\luaexec{nl = [[\\]]}
\directlua{
for i=1,3,1 do
tex.print("FOO" .. nl)
end
}