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{...}}with \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}

Связанный контент