Luatex 将可变数量的参数从 tex 传递给 lua(逗号分隔并转义)

Luatex 将可变数量的参数从 tex 传递给 lua(逗号分隔并转义)

如何将 tex 命令中的多个参数传递给 lua 函数,同时对其进行转义

或者我该如何修改

(进口)

\usepackage{luacode}
\newcommand{\example}[1]{
    \directlua{
        function debug(...)
            local arr = {...}
            for i, v in pairs(arr) do
                print(v)
            end
        end
        debug(#1)
    }
}

使得

\example{\notDefined, aNilValue, 5}

产生标准输出

\notDefined
aNilValue
5

而不是扔

  • 未定义控制序列(乳胶错误)
  • 或者由于变量aNilValue未定义,因此不打印任何内容

我尝试过使用\luastring{\unexpanded{...}}\docsvlist但总是收到失控的参数

编辑 明确地说,所有传递的参数都应该是字符串,因此local arr = {...}在示例中应该相等{"\\notDefined", "aNilValue", "5"}

答案1

它可以更多地关注空格,但这会使整个列表成为一个 lua 字符串,然后在逗号上拆分,因此每个项目都被解释为一个字符串。

\newcommand{\example}[1]{%
    \directlua{
        function debug(s)
            for v in string.gmatch(s,'[^,]*') do
                print(v)
            end
        end
        debug("\luaescapestring{\detokenize{#1}}",",")
    }%
}

\typeout{}

\example{\notDefined, aNilValue, 5}

\stop

产生终端输出


\notDefined 
 aNilValue
 5

答案2

此解决方案使用 LaTeX3 的逗号分隔列表。的参数\example将写入日志文件。

\documentclass{article}
\usepackage{expl3}

\directlua{
  function debug(...)
      local arr = {...}
      for i, v in pairs(arr) do
          texio.write_nl(v)
      end
  end
}

\ExplSyntaxOn
\newcommand{\example}[1]{
  % construct comma separated list
  \clist_set:Nn \l_tmpa_clist {#1}
  % construct lua string for each component
  % and store them in a sequence
  \seq_clear:N \l_tmpa_seq
  \clist_map_inline:Nn \l_tmpa_clist {
    \str_set:Nn \l_tmpa_str {##1}
    \seq_put_right:Nx \l_tmpa_seq {"\luaescapestring{\l_tmpa_str}"}
  }
  \directlua{debug(\seq_use:Nn \l_tmpa_seq {,})}
}
\ExplSyntaxOff

\begin{document}
\example{\notDefined, aNilValue, 5}
\end{document}

相关内容