如何在 Lua 中访问 etoolbox 切换

如何在 Lua 中访问 etoolbox 切换

我正在创建一个使用切换的包etoolbox,但该包的很大一部分是用 Lua 编写的。有没有办法etoolbox在 Lua 中直接访问切换?

我知道它etoolbox为布尔值使用了一个单独的命名空间,但是我也找不到访问\newifLua 中创建的布尔值的方法。


最小(非)工作示例

\documentclass{article}

\usepackage{etoolbox}
\usepackage{luacode}

\newtoggle{mytoggle}

\begin{document}
\directlua{
  % Not sure what etoolbox_toggle_true function should be
  if tex.?etoolbox_toggle_true?(\luastring{mytoggle}) then
    tex.print('mytoggle is true!')
  else
    tex.print('mytoggle is false.')
  end
}
\end{document}

答案1

偷窃乌尔丽克·菲舍尔的解决方案从 lua 查询布尔值的状态似乎有效。当然,同样的警告也适用:我不清楚为什么mode(在2018 年 6 月/1.0.9 版手册在§10.6.3,第 209 页中将其表示为“代表字符或其他实体的数字”)是正确的比较对象。

\documentclass[parskip=half-]{scrartcl}
\usepackage{etoolbox}
\newtoggle{foo}

\usepackage{luacode}
\begin{luacode}
local catlatex = luatexbase.registernumber("catcodetable@latex")
local mytoggle = token.create("etb@tgl@foo")

function is_etb_toggletrue_tok(toggle)
  local etb_toggle_true = token.create("etb@toggletrue")
  return toggle.mode == etb_toggle_true.mode
end

function is_etb_toggletrue_name(togglename)
  local toggle = token.create("etb@tgl@" .. togglename)
  return is_etb_toggletrue_tok(toggle)
end

function printifbool ()
 if is_etb_toggletrue_name("foo") then 
  tex.sprint(catlatex,"bool is true")
 else
  tex.sprint(catlatex,"bool is false")
 end
end
\end{luacode}
\begin{document}
\minisec{booleans}

\toggletrue{foo}
\directlua{printifbool()}

\togglefalse{foo}
\directlua{printifbool()}
\end{document}

在此处输入图片描述

我们只需要知道etoolbox切换按钮只有两个值:\etb@toggletrue\etb@togglefals并且切换按钮foo\etb@tgl@foo

该代码现在有两个函数is_etb_toggletrue_tok,一个接受由其生成的标记token_create,另一个接受带有切换名称的is_etb_toggletrue_name字符串。etoolbox

etb_toggle_true每次运行时都会分配is_etb_toggletrue_tok,我不确定这是否是好的做法。但我希望它在尽可能小的范围内。

相关内容