TikZ 路径不适用于 xparse 生成的宏

TikZ 路径不适用于 xparse 生成的宏

我尝试将 TikZ 与我通过定义的宏一起使用\NewDocumentCommand(用于多个可选参数),但它的行为不符合预期。TikZ 放弃了路径,而不是使用宏扩展。

最小示例:

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{positioning}

\NewDocumentCommand{\myEdge}{O{} O{auto} m}{edge [#1] node [#2] {#3}}

\begin{document}
% This works
\begin{tikzpicture}
  \node (test1) {test1};
  \node (test2) [right=of test1] {test2} edge [] node [auto] {test3} (test1);
\end{tikzpicture}

% This does not
\begin{tikzpicture}
  \node (test1) {test1};
  \node (test2) [right=of test1] {test2} \myEdge{test3} (test1);
\end{tikzpicture}
\end{document}

输出:

! Package tikz Error: Giving up on this path. Did you forget a semicolon?.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.19 ...e (test2) [right=of test1] {test2} \myEdge
                                                  {test3} (test1);

编辑: @Werner 给出的答案在仅使用具有所需参数的宏或每个路径不超过一次使用它时效果很好。但以下示例仍然失败:

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{positioning}

\DeclareExpandableDocumentCommand{\myEdge}{O{} O{auto} m}{edge [#1] node [#2] {#3}}
\begin{document}
% This works
\begin{tikzpicture}
  \node (node1) {node1};
  \node (node2) [right=of node1] {node2};
  \node (node3) [right=of node2] {node3} edge [bend left] node [right] {edge1} (node2) edge [] node [auto] {edge2} (node1);
\end{tikzpicture}

% This does not
\begin{tikzpicture}
  \node (node1) {node1};
  \node (node2) [right=of node1] {node2};
  \node (node3) [right=of node2] {node3} \myEdge[bend left][right]{edge1} (node2) \myEdge{edge2} (node1);
\end{tikzpicture}
\end{document}

错误:

! Package tikz Error: Giving up on this path. Did you forget a semicolon?.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.19 ...left][right]{edge1} (node2) \myEdge{edge2}
                                                   (node1);

我觉得我缺少一些关于 xparse 如何生成这些宏或 TikZ 如何解析路径的基本理解。

答案1

期望的输出可以通过以下方式实现\DeclareExpandableDocumentCommand

\DeclareExpandableDocumentCommand{\myEdge}{O{} O{auto} m}{edge [#1] node [#2] {#3}}

如上所述,这只是一个部分解决方案,因为它可能只在某些时候有效。命令可扩展的要求源于这样一个事实:它tikz正在构建一条路径,因此会扫描您的输入,将其组装成片段。如果它在路径生成中发现它不理解的片段,它会假定您应该实际关闭该路径(带有尾随;)。因此,由于\myEdge不是tikz路径术语的一部分,因此它在解释它时会遇到问题。这是一个典型的扩展问题。

相关内容