.png)
¿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
aNilValue
no está definida
Intenté usar \luastring{\unexpanded{...}}
with \docsvlist
pero 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 \example
se 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}