我想运行一些带有多个参数的 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 键值方法:)