在一个lua块中设置多个宏参数

在一个lua块中设置多个宏参数

我有一个包含多个参数的 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}

在此处输入图片描述

相关内容