我遇到了一个奇怪的行为。在 lua 程序中,我使用 CR 使其更具可读性。当我使用 ZeroBrane 执行我的 lua 程序并将结果复制到 LuaLaTeX 中时,它运行良好。当我在 LuaLaTeX 中直接使用 \luaexec{my program} 时,它不起作用。当我删除 tkz 命令中的所有 CR 时,它就可以正常工作了。
是否有 CR 的替代品可以在 lua 程序中进行换行,但该程序可以在 LuaLaTeX 中直接使用?
\documentclass{article}
\usepackage{tikz}
\usepackage{luacode}
\begin{luacode*}
function MNotWE()
local res = [[
\begin{tikzpicture}[fill=blue!20]
\path (.2,.8) node {Hello}
(.2,.4) node {World};
\end{tikzpicture}
]]
return res
end
function MWE()
local res = [[
\begin{tikzpicture}[fill=blue!20]
\path (.2,.8) node {Hello} (.2,.4) node {World};
\end{tikzpicture}]]
return res
end
\end{luacode*}
\begin{document}
\directlua{tex.print(MWE())}
%\directlua{tex.print(MNotWE())} % <-- UNCOMMENT TO SEE THE PROBLEM.
\end{document}
第一个程序不起作用而第二个程序起作用。
答案1
答案2
tex.print
从 TeX 的角度来看,使用 打印换行符不会开始新行,而只会添加文字换行符。您可以通过在将行输入 TeX 之前拆分行来避免这种情况。
例如,可以使用 LPEG 来实现:
local nl = lpeg.P'\n' -- A newline is a single NL byte.
local line = lpeg.C((1-nl)^0) -- A line is a sequence of zero
-- or more characters which are not
-- newlines ((1-nl)^0) and we use
-- lpeg.C to capture the lines
-- (aka. return them as results later)
-- In total we want zero or more lines followed by newlines and then one
-- final line which is not followed by a newline:
mfk_splitlines_pattern = (line*nl)^0*line
\documentclass{article}
\usepackage{tikz}
\usepackage{luacode}
\begin{luacode*}
function MNotWE()
local res = [[
\begin{tikzpicture}[fill=blue!20]
\path (.2,.8) node {Hello}
(.2,.4) node {World};
\end{tikzpicture}
]]
return res
end
function MWE()
local res = [[
\begin{tikzpicture}[fill=blue!20]
\path (.2,.8) node {Hello} (.2,.4) node {World};
\end{tikzpicture}]]
return res
end
local nl = lpeg.P'\n'
local line = lpeg.C((1-nl)^0)
mfk_splitlines_pattern = (line*nl)^0*line
\end{luacode*}
\begin{document}
\directlua{tex.print(MWE())}
\directlua{tex.print(mfk_splitlines_pattern:match(MNotWE()))}
\end{document}