edef 中的 Lua 循环会出错,但 newcommand 中不会出错!如何使用 lua 循环完全展开宏?

edef 中的 Lua 循环会出错,但 newcommand 中不会出错!如何使用 lua 循环完全展开宏?

我怎样才能拥有\edef一个包含 lua 循环的 'ed(扩展)宏tex.sprint?当其中tex.sprint包含另一个类似的宏时,我会收到错误\blindtext[<n>]。如果我打印一些非宏字符串(例如在 lua 循环中Hello world!使用),则不会收到tex.sprint错误。如果我不扩展(不使用\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

您可以在 edef 中扩展 Lua 循环,但\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}

相关内容