从 lua 变量命名多个宏的问题

从 lua 变量命名多个宏的问题

假设我有三个数值变量a,b,c,我想在 TeX 中使用它们,那么我写道:

  token.set_macro("a",a,'global')
  token.set_macro("b",b,'global') 
  token.set_macro("c",c,'global')

我希望不必写“a”、“b”和“c”,如果可能的话,将所有情况放在一起处理,例如 f(a,b,c)。

经过一番研究我找到了一个非常沉重的解决方案使用 debug.getlocal

是否有可能找到其他解决方案?

最后的问题应该是:如果 pi=3.14 如何写 tex.print("pi" .."="..tostring(pi))而不重复pi

答案1

不是你要求的形式,但迭代表格更容易

\documentclass{article}

\directlua{
t={
 a=11,
 b=22,
 c=33
}
function f (t)
 for k,v in pairs(t) do
  token.set_macro(k,v,'global')
 end
end
f(t)
}

\show\a
\show\b
\show\c


\begin{document}

\end{document}

生产

> \a=macro:
->11.
l.17 \show\a
          
? 
> \b=macro:
->22.
l.18 \show\b
          
? 
> \c=macro:
->33.
l.19 \show\c
          
? 

显示所有三个宏都已设置。


或者如果你想使用变量,可以迭代名称

\documentclass{article}

\directlua{

a=11
b=22
c=33

function f (t)
 for k,v in pairs(t) do
  token.set_macro(v,_G[v],'global')
 end
end
f{"a","b","c"}
}

\show\a
\show\b
\show\c


\begin{document}

\end{document}

答案2

您可以反过来做:不要尝试以字符串形式检索变量名称,而是从字符串中检索变量值。

\documentclass{article}

\directlua{
pi = 3.14
function print_debug(name)
  if _G[name] then
    tex.print(name.."=".._G[name])
  else
    tex.print(name.." not found")
  end
end
}

\begin{document}
\directlua{print_debug("pi")}
\end{document}

在此处输入图片描述

相关内容