.png)
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
aNilValue
nicht 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 \example
werden 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}