我读了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}