¿Cómo puedo tener una \edef
macro 'ed (expadida) que tenga un bucle lua tex.sprint
? Recibo un error cuando tex.sprint
tengo 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.sprint
en el bucle lua. El error tampoco ocurre en caso de que no expanda (no use \edef
) la definición de macro y la use \newcommand
en su lugar. ¿Por qué es así?
A continuación se muestra el código que utiliza primero \newcommand
y luego \edef
. Primero ejecute el código tal como está, en la segunda ejecución, descomente la \edef
versió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}
Respuesta1
Puede expandir un bucle Lua en edef, pero no \blindtext
en 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}