我对如何处理 tex 和 lua 变量的理解存在一些局限性。
我想传递 Tex 命令的结果以便对其进行一些计算。在 lua 函数中,变量是\case{2}
,当我尝试在 lualatex 文件中对其执行 tex.sprint 时,它是 4。我正在寻找一种方法,让 lua 函数中包含 4 以便对其进行一些计算。
这是我最小的例子。
% !TeX encoding = utf-8
% !TeX program = LuaLaTeX
\documentclass{article}
\usepackage{luacode}
\usepackage{xstring}
\begin{luacode}
compute = function(argone, argtwo)
tex.sprint(argone, argtow)
print("arg1", argone, "arg2", argtwo)
return argtwo
end
\end{luacode}
\newcommand\case[1]{\IfEqCase{#1}{%
{1}{2}%
{2}{4}%
{3}{6}%
{4}{8}%
}}
\newcommand\computefn[2]{%
\directlua{
compute(#1, \luastringN{#2})
}}
% -- First compilation
%compute(#1, #2)%
% -- Résult ! Argument of \xs_IfStringCase_ii has an extra \}.
% --<inserted text>
% -- \\par
% -- Second compilation
% -- Result : arg1 2 arg2 \case {2}
% -- I want to have the resulte of \case{2} in arg2
\newcommand\displayvals[1]{%
Value = #1
Case\#1 = \case{#1}
Function = \computefn{#1}{\case{#1}}
}
\begin{document}
\case{3}
\displayvals{2}
\end{document}
答案1
这扩张(=替换文本)传递给lua,正如评论所证明的那样。
编程语言中的函数会有一个返回值(例如 lua);而在宏语言(例如 TeX 或 SAS 宏)中,宏的“输出”是替换文本(解释器的更多代码),因此无需输入。因此,在某些情况下,宏名称可能在它们所代表的内容上有些误导。
平均能量损失
\documentclass{article}
\usepackage{luacode}
%\usepackage{xstring}
\begin{luacode}
compute = function(argone, argtwo, argthree)
tex.sprint("arg1=", argone, "; arg2=", argtwo, "; arg3=", argthree)
print("arg1=", argone, "; arg2=", argtwo, "; arg3=", argthree)
return argthree
end
\end{luacode}
\newcommand\case[1]{%
\ifcase#1\or2\or4\or6\or8\fi}
\newcommand\computefn[3]{%
\directlua{
compute(#1, "#2", #3)
}}
\newcommand\displayvals[1]{%
Value = #1
Case\#1 = \case{#1}
``Function'' : \computefn{#1}{\\textbackslash case\\{#1\\}}{\case{#1}}
}
\begin{document}
[case3=6]:\par
\case{3}
[displayvals2=2,4,2,(command),4]:\par
\displayvals{2}
[displayvals4=4,8,4,(command),8]:\par
\displayvals{4}
\end{document}
添加
执行\show\IfEqCase
表明它被替换为:
> \IfEqCase=macro:
->\xs_ifstar {\xs_IfStringCase {\IfEq *}}{\xs_IfStringCase \IfEq }
其他宏也类似。
您传递给 lua 的内容、如何传递以及何时传递将取决于您的实际用例。(例如,lua 可以接受输入并执行“函数” - 会有排列)