.png)
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
aNilValue
nã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 \example
serã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}