Как я могу иметь \edef
расширенный (расширенный) макрос, который имеет цикл lua tex.sprint
внутри? Я получаю ошибку, когда в нем tex.sprint
есть другой макрос, подобный \blindtext[<n>]
ему. Я не получаю ошибку, если печатаю некоторые немакросовые строки, такие как Hello world!
using tex.sprint
в цикле lua. Ошибка также не возникает, если я не расширяю (не использую \edef
) определение макроса, а \newcommand
вместо этого использую. Почему так?
Ниже приведен код, который сначала использует \newcommand
, а затем \edef
. Сначала запустите код как есть, во втором запуске раскомментируйте версию, \edef
чтобы увидеть ошибку:
! Use of \\blindtext doesn't match its definition.
\kernel@ifnextchar ...rved@d =#1\def \reserved@a {
#2}\def \reserved@b {#3}\f...
l.26 \directlua{dofile("blindtextloop.lua")}
%
?
% lualatex edefloop.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\begin{document}
% Note: This will write file blindtextloop.lua in you current directory
\begin{filecontents*}{blindtextloop.lua}
for i=0,3 do
tex.sprint(" \\blindtext[1] \\par")
end
\end{filecontents*}
% Unexpanded blindtext
\newcommand{\myblindtext}{%
\directlua{dofile("blindtextloop.lua")}%
}%
Expanding next:
\myblindtext
%% Uncomment following lines in second run to see the error:
% %Expanded blindtext
% \edef\myblindtextexpanded{%
% \directlua{dofile("blindtextloop.lua")}%
% }%
% Already expanded:
% \myblindtextexpanded
\end{document}
решение1
Вы можете развернуть цикл Lua в edef, но не \blindtext
в этом случае, хотя вам не нужно разворачивать макрос, как показано в выводе терминала, это приводит к определению
\myblindtextexpanded
как
macro:-> \blindtext [1] \par \blindtext [1] \par \blindtext [1] \par \blindtext
[1] \par
поэтому цикл был развернут до повторных вызовов \blindtext
.
% lualatex edefloop.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage[english]{babel}
\usepackage{blindtext}
\begin{document}
% Note: This will write file blindtextloop.lua in you current directory
\begin{filecontents*}{blindtextloop.lua}
for i=0,3 do
tex.sprint(" \\noexpand\\blindtext[1] \\par")
end
\end{filecontents*}
% Unexpanded blindtext
\newcommand{\myblindtext}{%
\directlua{dofile("blindtextloop.lua")}%
}%
Expanding next:
\myblindtext
%% Uncomment following lines in second run to see the error:
%Expanded blindtext
\edef\myblindtextexpanded{%
\directlua{dofile("blindtextloop.lua")}%
}%
% Already expanded:
\typeout{\meaning\myblindtextexpanded}
\myblindtextexpanded
\end{document}