El bucle Lua en edef da error, ¡pero no en el nuevo comando! ¿Cómo expandir completamente las macros con bucles lua?

El bucle Lua en edef da error, ¡pero no en el nuevo comando! ¿Cómo expandir completamente las macros con bucles lua?

¿Cómo puedo tener una \edefmacro 'ed (expadida) que tenga un bucle lua tex.sprint? Recibo un error cuando tex.sprinttengo otra macro como \blindtext[<n>]esta. No recibo ningún error si imprimo algunas cadenas que no son macro, como las Hello world!que se usan tex.sprinten el bucle lua. El error tampoco ocurre en caso de que no expanda (no use \edef) la definición de macro y la use \newcommanden su lugar. ¿Por qué es así?

A continuación se muestra el código que utiliza primero \newcommandy luego \edef. Primero ejecute el código tal como está, en la segunda ejecución, descomente la \edefversión para ver el error:

! 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}

Captura de pantalla: Captura de pantalla del resultado compilado

Respuesta1

Puede expandir un bucle Lua en edef, pero no \blindtexten este caso, aunque no necesita expandir la macro, como se muestra en la salida del terminal, esto da como resultado la definición \myblindtextexpanded como

macro:-> \blindtext [1] \par \blindtext [1] \par \blindtext [1] \par \blindtext
 [1] \par 

por lo que el bucle se ha desenrollado para llamadas repetidas de \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}

información relacionada