当使用 lua 构建 tkz 命令以在 LuaLaTex 中使用时,回车符会导致失败

当使用 lua 构建 tkz 命令以在 LuaLaTex 中使用时,回车符会导致失败

我遇到了一个奇怪的行为。在 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

您需要调用该函数,因此,当读取 TeX 换行符时,MNWE()不会MNWE将其转换为空格,但此处会跳过该阶段,但是您可以通过以下方式强制进行空格解释

\documentclass{article}

\usepackage{tikz}

\begin{document}

\directlua{require "\jobname.lua"}
{\catcode10=10 \directlua{tex.print(MNWE())}}


\end{document}

在此处输入图片描述

答案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}

相关内容