我正在尝试使用 检查参数是否已声明/为空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