Luatex pasa una cantidad variable de argumentos de tex a lua (separados por comas y con escape)

Luatex pasa una cantidad variable de argumentos de tex a lua (separados por comas y con escape)

¿Cómo se pueden pasar múltiples argumentos de un comando tex a una función lua y al mismo tiempo escapar de ellos?

O como lo modifico

(importaciones)

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

tal que

\example{\notDefined, aNilValue, 5}

produce una salida estándar de

\notDefined
aNilValue
5

en lugar de tirar

  • Secuencia de control Indefinido(error de látex)
  • o no imprime nada porque la variable aNilValueno está definida

Intenté usar \luastring{\unexpanded{...}}with \docsvlistpero sigo recibiendo argumentos desbocados.

EDITAR Aclaración, todos los argumentos pasados ​​deben ser cadenas, por lo que local arr = {...}deben ser iguales en el ejemplo.{"\\notDefined", "aNilValue", "5"}

Respuesta1

Podría cuidar más los espacios en blanco, pero esto crea una cadena lua de toda la lista y luego se divide en comas para que cada elemento se interprete como una cadena.

\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

produce salida terminal


\notDefined 
 aNilValue
 5

Respuesta2

Esta solución utiliza la lista separada por comas de LaTeX3. Los argumentos de \examplese escribirán en el archivo de registro.

\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}

información relacionada