.png)
Как можно передать несколько аргументов из команды 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}