检查命令中的参数在 LuaLaTeX 中是否已声明/为空

检查命令中的参数在 LuaLaTeX 中是否已声明/为空

我正在尝试使用 检查参数是否已声明/为空lua。到目前为止,我写了以下 MWE:

\documentclass{standalone}

\def\var#1{\def\@var{#1}}
%\var{Hello world}

\begin{document}
    \@var --
    
    \directlua{if string.len("\@var") == 0 then tex.print("empty") else tex.print("not empty") end}
\end{document}

如果\var{Hello world}取消注释,代码运行时不会出现任何错误,但如果注释掉,代码总是返回错误。

有没有办法对参数/变量进行检查LuaLaTeX

答案1

正如 wipet 所写,您缺少 \makeatletter。除此之外,您还可以使用 获取 lua 中宏的内容token.get_macro。旁注:不要对这种小示例使用 standalone。这是一个具有各种副作用的复杂类。文章通常要好得多。

\documentclass{article}

\makeatletter
\def\var#1{\def\@var{#1}}
\makeatother
\var{Hello world}

\begin{document}
\makeatletter
    \@var --
\makeatother
    
    \directlua{
      a=token.get_macro("@var")
      print("XXXXXXXXXX @var is: ",a) %for debugging on the terminal
      if string.len(a) == 0 then 
       tex.print("empty") 
      else 
        tex.print("not empty " .. string.len(a)) 
      end}
   
    \var{}
      
      \directlua{
      a=token.get_macro("@var")
      print("XXXXXXXXXX @var is: ",a) 
      if string.len(a) == 0 then 
       tex.print("empty") 
      else 
        tex.print("not empty " .. string.len(a)) 
      end}
     
       
      
\end{document}

在此处输入图片描述

答案2

你的线路

\@var --

打印 var – 因为宏\@设置了空间因子,然后有字母,然后是空格和转换为连字符的v a r双精度数。--

你的\directlua线路工作原理如下:

\directlua{if string.len("\spacefactor \@m {}var") == 0 then tex.print("empty") else tex.print("not empty") end}

因为\directlua原语在使用参数之前就已经完全扩展了它的参数。

如果您使用宏\var(在您的示例中未使用),那么该宏\@将被重新定义为带有强制分隔符的宏var

上面描述了三种情况,我的意思是这些情况都不是你的本意。

我只能猜测你的意图。也许,你想在使用宏\@var时定义宏\var,并且想测试宏是否\@var已定义。你不能使用这个测试,\directlua因为你不能将未定义的宏放入\directlua参数中,因为\directlua会扩展其参数。你可以这样做:

\catcode`\@=11 % `@` is letter
\def\var#1{\def\@var{#1}}

%\var{Hello world}  % this defines \@var as a macro with body Hello world.

\ifx\@var\undefined undefined var\else defined var \fi

相关内容