答案可能很简单,但我在文档中找不到任何内容
例如:
\begin{luacode}
function divmod(a,b)
local q = 0
local r = a
while not (r < b) do
q = q+1
r = r-b
end
return q,r
end
\end{luacode}
我当然是用 lualatex 编译的,我想将结果q
和r
分配
divmod(\c,\d)
给两个宏和。我该怎么做?我知道如何用一个值来做,但不知道用两个\def\c{45}
值def\d{7}
\x
\y
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function divmod(a,b)
local q = 0
local r = a
while not (r < b) do
q = q+1
r = r-b
end
return q,r
end
\end{luacode}
\begin{document}
\def\c{45} \def\d{7}
???
\def\x{..?..} \def\y{..?..}
\end{document}
答案1
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function divmod(a,b)
local q = 0
local r = a
while not (r < b) do
q = q+1
r = r-b
end
return q,r
end
\end{luacode}
\def\x{}\def\y{}
\begin{document}
\def\c{45} \def\d{7}
\directlua{
q,r=divmod(\c,\d)
token.set_macro("x",q)
token.set_macro("y", r)
}
x is \x, y is \y
\end{document}
答案2
块\directlua
以格式返回结果{q}{r}
,因此宏\divmodA
可以将其读取为两个参数。
\directlua{
function divmod(a,b)
local q = 0
local r = a
while not (r < b) do
q = q+1
r = r-b
end
return q,r
end
}
\def\divmod#1#2{%
\expandafter\divmodA\directlua{q,r=divmod(#1,#2) tex.sprint("{",q,"}{",r,"}")}%
}
\def\divmodA#1#2{\def\x{#1}\def\y{#2}}
\divmod{45}{7}
x is \x, y is \y.
\bye
答案3
如果的结果divmod
始终存储在\q
和中\r
,则以下解决方案可能会引起人们的兴趣。
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function divmod ( a , b )
local q = 0
local r = a
while not (r < b) do
q = q+1
r = r-b
end
tex.sprint("\\def\\q{"..q.."}")
tex.sprint("\\def\\r{"..r.."}")
end
\end{luacode}
% LaTeX utility macro:
\newcommand\divmod[2]{\directlua{divmod(#1,#2)}}
\begin{document}
\divmod{45}{7}
\q, \r
\def\c{100} \def\d{11}
\directlua{divmod(\c,\d)}
\q, \r
\end{document}