Lua-Schleife in edef gibt Fehler aus, aber nicht in newcommand! Wie kann man Makros mit Lua-Schleifen vollständig erweitern?

Lua-Schleife in edef gibt Fehler aus, aber nicht in newcommand! Wie kann man Makros mit Lua-Schleifen vollständig erweitern?

Wie kann ich ein \edeferweitertes Makro haben, das eine Lua-Schleife enthält tex.sprint? Ich erhalte eine Fehlermeldung, wenn tex.sprintein anderes Makro wie dieses darin enthalten ist . Ich erhalte keine Fehlermeldung, wenn ich einige Nicht-Makro-Zeichenfolgen wie „using “ in der Lua-Schleife \blindtext[<n>]drucke . Der Fehler tritt auch nicht auf, wenn ich die Makrodefinition nicht erweitere (nicht verwende ) und stattdessen verwende. Warum ist das so?Hello world!tex.sprint\edef\newcommand

Unten sehen Sie den Code, der zuerst \newcommandund dann verwendet \edef. Führen Sie den Code zunächst so aus, wie er ist, und heben Sie beim zweiten Ausführen die Kommentarzeichen bei der \edefVersion auf, um den Fehler anzuzeigen:

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

Bildschirmfoto: Screenshot der kompilierten Ausgabe

Antwort1

Sie können eine Lua-Schleife in edef erweitern, nur nicht \blindtextin diesem Fall. Sie müssen das Makro nicht erweitern, da dies, wie in der Terminalausgabe gezeigt, zu einer Definition \myblindtextexpanded als führt

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

Daher wurde die Schleife für wiederholte Aufrufe von aufgerollt \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}

verwandte Informationen