Wie kann ich ein \edef
erweitertes Makro haben, das eine Lua-Schleife enthält tex.sprint
? Ich erhalte eine Fehlermeldung, wenn tex.sprint
ein 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 \newcommand
und 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 \edef
Version 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}
Antwort1
Sie können eine Lua-Schleife in edef erweitern, nur nicht \blindtext
in 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}