我有一个包含多个参数的 Latex 宏,其中大多数参数我想在\directlua
命令中设置。但是,只有当我还在命令中打印宏本身时,这才有效\directlua
:
作品:
\documentclass{article}
\newcommand\withmanyparameters[8]{%
#1 -- #2 -- #3 -- #4 -- #5 -- #6 -- #7 -- #8
}
\begin{document}
% all in lua
\directlua{%
tex.sprint("\string\\withmanyparameters")
for i = 1,8 do
tex.sprint("{l" .. tex.round(i) .. "}")
end
}
% individual params in lua:
\withmanyparameters{1}{2}{3}{\directlua{tex.sprint("l4")}}{\directlua{tex.sprint("l5")}}{6}{7}{8}
\end{document}
但是,在一个块中设置参数的子集\directlua
不起作用:
\documentclass{article}
\newcommand\withmanyparameters[8]{%
#1 -- #2 -- #3 -- #4 -- #5 -- #6 -- #7 -- #8
}
\begin{document}
\withmanyparameters{1}{2}{3}\directlua{%
for i = 3,8 do
tex.sprint("{l" .. i .. "}")
end
}
\end{document}
此代码失败
! Missing number, treated as zero.
<to be read again>
有办法让它工作吗?当然,我总是可以通过将宏名称和其他参数传递给 lua 来从 luatex 打印完整的宏。但是,就我而言,有多个版本的\withmanyparameters
,它们具有不同数量的参数。将所有这些映射到 lua 函数中会非常复杂,因此我只想从 lua 函数中设置最后四个参数。
答案1
你传递给宏的前 4 个参数是,{1}{2}{3}\directlua
所以从那里开始一切都出错了,你需要使用链\expandafter
,或者像下面这样\expanded
在调用之前扩展 \directlua\withmanyparameters
或更改调用顺序,以便你\directlua
先调用
例如
\documentclass{article}
\newcommand\withmanyparameters[8]{%
#1 -- #2 -- #3 -- #4 -- #5 -- #6 -- #7 -- #8
}
\begin{document}
\expanded{\noexpand\withmanyparameters{1}{2}{3}\directlua{%
for i = 3,8 do
tex.sprint("{l" .. i .. "}")
end
}}
\end{document}
答案2
\documentclass{article}
\newcommand\withmanyparameters[8]{%
#1 -- #2 -- #3 -- #4 -- #5 -- #6 -- #7 -- #8
}
\newcommand\exchange[2]{#2#1}
\begin{document}
\expandafter\exchange\expandafter{%
\directlua{%
for i = 4,8 do
tex.sprint("{l" .. i .. "}")
end
}%
}{\withmanyparameters{1}{2}{3}}%
\end{document}
\documentclass{article}
\newcommand\withmanyparameters[8]{%
#1 -- #2 -- #3 -- #4 -- #5 -- #6 -- #7 -- #8
}
\begin{document}
\ExplSyntaxOn
\exp_args:Nno\use:nn{\withmanyparameters{1}{2}{3}}{\directlua{
for~i~=~4,8~do~
tex.sprint("{l"~..~i~..~"}")~
end
}}
\ExplSyntaxOff
\end{document}