我正在创建一个使用切换的包etoolbox
,但该包的很大一部分是用 Lua 编写的。有没有办法etoolbox
在 Lua 中直接访问切换?
我知道它etoolbox
为布尔值使用了一个单独的命名空间,但是我也找不到访问\newif
Lua 中创建的布尔值的方法。
最小(非)工作示例
\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
,我不确定这是否是好的做法。但我希望它在尽可能小的范围内。