![edef 中的 Lua 循环会出错,但 newcommand 中不会出错!如何使用 lua 循环完全展开宏?](https://linux22.com/image/420800/edef%20%E4%B8%AD%E7%9A%84%20Lua%20%E5%BE%AA%E7%8E%AF%E4%BC%9A%E5%87%BA%E9%94%99%EF%BC%8C%E4%BD%86%20newcommand%20%E4%B8%AD%E4%B8%8D%E4%BC%9A%E5%87%BA%E9%94%99%EF%BC%81%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20lua%20%E5%BE%AA%E7%8E%AF%E5%AE%8C%E5%85%A8%E5%B1%95%E5%BC%80%E5%AE%8F%EF%BC%9F.png)
我怎样才能拥有\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}