我需要通过 Lua 函数确定 TeX 宏是否已定义。有什么想法吗?
function IsTeXMacroDefined(macroname)
if defined(macroname) then return true end
return false
end
答案1
我不知道它有多么强大,但以下内容似乎有效。
\documentclass{standalone}
\def\test{}
\begin{document}
\directlua{%
function is_defined(s)
local undef = 'undefined_cs'
if token.command_name(token.create(s)) == undef then
return false
else
return true
end
end
if is_defined('test') then tex.sprint('test is defined\noexpand\\par') else
tex.sprint('test is not defined\noexpand\\par') end
if is_defined('testa') then tex.sprint('testa is defined\noexpand\\par') else
tex.sprint('testa is not defined\noexpand\\par') end}
\end{document}
更新
我添加了一个TeX
包装器。它将要测试的控制序列的名称或控制序列本身作为参数(这是通过在 lua 级别借助 删除反斜杠来实现的lpeg
)。TeX
包装器使用 的可扩展性\directlua
来动态定义中的TeX
\iftrue
或\iffalse
语句\csname
。
正如评论中指出的那样,人们应该始终在单独的 lua 文件中编写 lua 代码。
首先是 lua 文件(将其保存为is_def.lua
)。
local lpeg = require('lpeg')
local P, C, Cs, V, match = lpeg.P, lpeg.C, lpeg.Cs, lpeg.V, lpeg.match
function is_cs_defined (s)
s = match(Cs(P({(C('\\') / '' + 1) * V(1) + true})),s)
local undef = 'undefined_cs'
return not(token.command_name(token.create(s)) == undef)
end
然后是.tex
文件。
\documentclass{standalone}
\directlua{dofile('is_def.lua')}
\def\iscsdefined#1{%
\texttt{\string#1}
\csname if\directlua{if is_cs_defined('\luatexluaescapestring{#1}')
then tex.sprint('true') else tex.sprint('false') end}\endcsname
is defined
\else
is not defined
\fi}
\def\test{}
\begin{document}
\iscsdefined{test}
\iscsdefined{\test}
\iscsdefined{testa}
\end{document}