将值从 Lua 函数传递给 TeX

将值从 Lua 函数传递给 TeX

答案可能很简单,但我在文档中找不到任何内容

例如:

\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 编译的,我想将结果qr分配 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}

相关内容