Luatex passa uma quantidade variável de argumentos de tex para lua (separados por vírgula e escapados)

Luatex passa uma quantidade variável de argumentos de tex para lua (separados por vírgula e escapados)

Como você pode passar vários argumentos de um comando tex para uma função lua, ao mesmo tempo que escapa deles?

Ou como faço para modificar

(importações)

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

de tal modo que

\example{\notDefined, aNilValue, 5}

produz saída padrão de

\notDefined
aNilValue
5

em vez de jogar

  • Sequência de controle indefinida(erro de látex)
  • ou não imprimindo nada porque a variável aNilValuenão está definida

Eu tentei usar \luastring{\unexpanded{...}}with \docsvlist, mas continuo recebendo argumentos descontrolados

EDITAR Esclarecimento, todos os argumentos passados ​​devem ser strings, portanto local arr = {...}devem ser iguais no exemplo{"\\notDefined", "aNilValue", "5"}

Responder1

Poderia cuidar mais do espaço em branco, mas isso cria uma string lua de toda a lista e depois se divide em vírgulas para que cada item seja interpretado como uma string.

\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

produz saída terminal


\notDefined 
 aNilValue
 5

Responder2

Esta solução usa a lista separada por vírgulas do LaTeX3. Os argumentos de \exampleserão gravados no arquivo de log.

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

informação relacionada