Lua loop в edef дает ошибку, но не в newcommand! Как полностью развернуть макросы с lua loops?

Lua loop в edef дает ошибку, но не в newcommand! Как полностью развернуть макросы с lua loops?

Как я могу иметь \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}

Связанный контент