Tikz 密钥代码:几个参数的默认值?

Tikz 密钥代码:几个参数的默认值?

我想运行一些带有多个参数的 tikz 代码,但我希望其中一些参数具有默认值。我想我知道当代码有一个参数时如何做到这一点,但是当它有多个参数时有没有办法?

想法如下:

\documentclass{article}

\usepackage{tikz}

\tikzset{
  weird/.code n args={4}{
    \draw #1 -- #2 -- #3 --#4;
  },
  % weird/.default#3={(0,0)},  %want my third default to be "(0,0)"
  % weird/.default#4={cycle}   %want my fourth default to be "cycle"
}

\begin{document}
  \[
  \begin{tikzpicture}
    \node[weird={(1,0)}{(2,1)}{(3,0)}{(1,0)}]  {};
%   \node[weird={(2,0)}{(3,1)}{(4,0)}]  {};     %want this to use cycle
%   \node[weird={(2,0)}{(3,1)}]  {};            %want this to use (0,0) and cycle  
  \end{tikzpicture}
  \]
\end{document}

谢谢!

答案1

tikz 接口实际上并不是为处理这种意义上的可选参数而设计的。如果您希望它处理可选参数,建议的方法是定义一些 pgfkeys,然后使用键值对;例如参见如何在 tikz 中创建一个父节点,并将节点的各个部分指定为指针?

在您的例子中,您只想循环遍历一组点,并在给定不同数量的点时执行不同的操作。weird我不会尝试接受四个参数(其中两个是可选的),而是weird接受一个参数,即以逗号分隔的点列表,然后您循环遍历并使用 tex 命令进行处理。

下面的代码接受以下输入:

    \node[weird={(1,0),(2,1),(3,0),(1,0)}]  {};
    \node[weird={(2,0),(3,1),(4,0)}]  {};     %want this to use cycle
    \node[weird={(2,0),(3,1)}]  {};           %want this to use (0,0) 
    % and now for something completely different
    \node[weird={(0:1cm),(60:1cm),(120:1cm),(180:1cm),(240:1cm),(300:1cm),(360:1cm)}]{};

这比 OP 中建议的要简单一些。如最后一个例子所示,代码还接受四个以上的点,这些点不需要使用笛卡尔坐标。代码循环遍历给定的点列表weird,同时计算点的数量并构建\mycycle将给定的循环\draw。然后我使用\ifcase添加您缺少的“默认”点。代码的输出是:

在此处输入图片描述

我绘制了不同数量的点的不同三角形,并使用不同的颜色来帮助区分它们,并且我x在下面打印了坐标,以显示三角形位于正确的位置。

完整代码如下:

\documentclass{article}

\usepackage{tikz}
\usepackage{etoolbox}

\tikzset{
  weird/.code = {
    \def\mycycle{}% will be the cycle code given to \draw
    \foreach \pt [count=\c, remember=\c] in {#1} {
      % count the number of points and build \mycycle
      \ifnum\c=1\xappto\mycycle{\pt}\else\xappto\mycycle{ -- \pt}\fi
    }
    % use \ifcase to treat 2, 3, 4, .. point differently
    \ifcase\c\or% ignore 0 and 1
    \or \draw[red](0,0)--\mycycle--cycle;  % 2 arguments
    \or \draw[blue]\mycycle--cycle;  % 3 arguments
    \else\draw\mycycle;               % 4 or more
    \fi
  },
}

\begin{document}
  \[
  \begin{tikzpicture}
    \node[weird={(1,0),(2,1),(3,0),(1,0)}]  {};
    \node[weird={(2,0),(3,1),(4,0)}]  {};     %want this to use cycle
    \node[weird={(2,0),(3,1)}]  {};           %want this to use (0,0) and cycle
    % and now for something completely different
    \node[weird={(0:1cm),(60:1cm),(120:1cm),(180:1cm),(240:1cm),(300:1cm),(360:1cm)}]{};


    \foreach \x in {0,1,2,3,4} {
       \node at (\x,-1) {\x};
    }
  \end{tikzpicture}
  \]
\end{document}

当然,这种方法很可能解决了您的 MWE 中的问题,但完全无法实现您真正想要做的事情。如果是这样,那么我建议给出更好的 MWE,并可能使用 pgfkeys 键值方法:)

相关内容