将 tex 值传递给 lua 函数

将 tex 值传递给 lua 函数

我对如何处理 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 可以接受输入并执行“函数” - 会有排列)

相关内容