Luatex übergibt eine variable Anzahl von Argumenten von Tex an Lua (mit Komma getrennt und maskiert)

Luatex übergibt eine variable Anzahl von Argumenten von Tex an Lua (mit Komma getrennt und maskiert)

Wie können Sie mehrere Argumente von einem Tex-Befehl an eine Lua-Funktion übergeben und diese gleichzeitig maskieren?

Oder wie ändere ich

(Importe)

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

so dass

\example{\notDefined, aNilValue, 5}

erzeugt Standardausgabe von

\notDefined
aNilValue
5

anstatt zu werfen

  • Undefinierte Steuersequenz(Latex-Fehler)
  • oder es wird nichts gedruckt, weil die Variable aNilValuenicht definiert ist

Ich habe versucht, \luastring{\unexpanded{...}}mit zu verwenden \docsvlist, aber ich bekomme immer wieder außer Kontrolle geratene Argumente

BEARBEITEN Klarstellung: Alle übergebenen Argumente sollten Zeichenfolgen sein und local arr = {...}im Beispiel gleich sein.{"\\notDefined", "aNilValue", "5"}

Antwort1

Leerzeichen könnten besser berücksichtigt werden, aber hierdurch wird aus der gesamten Liste ein Lua-String erstellt und dieser dann an Kommas aufgeteilt, sodass jedes Element als String interpretiert wird.

\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

erzeugt Terminalausgabe


\notDefined 
 aNilValue
 5

Antwort2

Diese Lösung verwendet die durch Kommas getrennte Liste von LaTeX3. Die Argumente \examplewerden in die Protokolldatei geschrieben.

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

verwandte Informationen