Lua 函数查看宏是否被定义

Lua 函数查看宏是否被定义

我需要通过 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}

在此处输入图片描述

相关内容