LuaTeX:使用两个可选参数调用 Lua 函数

LuaTeX:使用两个可选参数调用 Lua 函数

我读了newcommand 有多个可选参数我选择了xargs。我想将第二个可选参数传递给 Lua 函数。但是两行注释中的第一行 \drawLUAline会导致错误:

./d.tex:39: Package pgfkeys Error: I do not know the key '/tikz/midway {A}' and I am going to ignore it. Perhaps you misspelled it.

当然,我可以像我之前那样在这里添加第二个可选部分,但我想知道在其他情况下如何正确执行此操作。而且对我来说,带有可选参数的双括号的语法不清楚。

\documentclass[preview]{standalone}
\usepackage{xargs}
\usepackage{luacode}
\usepackage{tikz}


\begin{document}

\begin{luacode*}
function print_line (x, y, optA, optB)

  -- optA: yes
  if optA~=[[]] then
    tex.sprint("\\draw["..optA.."] (0,0) -- ("..x..","..y..")")
  end

  -- optA: no
  if optA==[[]]  then
    tex.sprint("\\draw (0,0) -- ("..x..","..y..")")
  end

 -- optB: yes
 if optB ~=[[]] then
   tex.sprint(""..optB.."")
 end

end
\end{luacode*}

\newcommandx{\drawLUAline}[4][1, 4]{% 
\directlua{print_line(#2,#3,[[#1]],[[#4]])}
}

\begin{tikzpicture} 
\draw (0,0) grid (3,4);
\drawLUAline{3}{1};
\drawLUAline[red]{3}{2};
\drawLUAline[blue]{3}{2.5} node[midway]{A};
%\drawLUAline[green]{3}{3}[node[midway]{A}]; 
%\drawLUAline{3}{4}[node[midway]{A}];
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

该包xargs不支持嵌套括号,因此可选参数以第一个 结束]。在您的示例中,这意味着对于

\drawLUAline[green]{3}{3}[node[midway]{A}];
%                                    ^ This bracket ends the argument

第二个可选参数是node[midway。然后 位于{A}]宏之后,因此 TikZ 会查看node[midway{A}]哪个会导致错误。您可以通过在参数周围写括号来避免这种情况,因此使用以下方式调用宏

\drawLUAline[green]{3}{3}[{node[midway]{A}}];
%                         ^               ^ These "hide" the ].

反而。

如果您希望宏接受不带这些附加括号的参数,则可以改用xparse

\documentclass[preview]{standalone}
\usepackage{xparse}
\usepackage{luacode}
\usepackage{tikz}


\begin{document}

\begin{luacode*}
function print_line (x, y, optA, optB)

  -- optA: yes
  if optA~=[[]] then
    tex.sprint("\\draw["..optA.."] (0,0) -- ("..x..","..y..")")
  end

  -- optA: no
  if optA==[[]]  then
    tex.sprint("\\draw (0,0) -- ("..x..","..y..")")
  end

 -- optB: yes
 if optB ~=[[]] then
   tex.sprint(""..optB.."")
 end

end
\end{luacode*}

\NewDocumentCommand{\drawLUAline}{O{} m m O{}}{% 
\directlua{print_line(#2,#3,[[#1]],[[#4]])}
}

\begin{tikzpicture} 
\draw (0,0) grid (3,4);
\drawLUAline{3}{1};
\drawLUAline[red]{3}{2};
\drawLUAline[blue]{3}{2.5} node[midway]{A};
\drawLUAline[green]{3}{3}[node[midway]{A}]; 
\drawLUAline{3}{4}[node[midway]{A}];
\end{tikzpicture}
\end{document}

虽然这有效,但这段代码中还隐藏着另一个问题:使用[[#1]]etc. 是不安全的。特别是如果参数可以以 a 结尾]或包含]]this 会导致奇怪的错误。请使用普通引号并\luaescapestring改为:

\documentclass[preview]{standalone}
\usepackage{xparse}
\usepackage{luacode}
\usepackage{tikz}


\begin{document}

\begin{luacode*}
function print_line (x, y, optA, optB)

  -- optA: yes
  if optA~="" then
    tex.sprint("\\draw["..optA.."] (0,0) -- ("..x..","..y..")")
  end

  -- optA: no
  if optA==""  then
    tex.sprint("\\draw (0,0) -- ("..x..","..y..")")
  end

 -- optB: yes
 if optB ~= "" then
   tex.sprint(""..optB.."")
 end

end
\end{luacode*}

\NewDocumentCommand{\drawLUAline}{O{} m m O{}}{% 
\directlua{print_line(#2,#3,"\luaescapestring{#1}","\luaescapestring{#4}")}%
}

\begin{tikzpicture} 
\draw (0,0) grid (3,4);
\drawLUAline{3}{1};
\drawLUAline[red]{3}{2};
\drawLUAline[blue]{3}{2.5} node[midway]{A};
\drawLUAline[green]{3}{3}[node[midway]{A}]; 
\drawLUAline{3}{4}[node[midway]{A}];
\end{tikzpicture}
\end{document}

相关内容