如何在 LuaTeX 中执行“printline”

如何在 LuaTeX 中执行“printline”

我刚刚开始探索 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
}

相关内容