我正在尝试定义一个新命令,使我能够自动格式化图表的某些部分。这些部分由在路径上方和下方添加的两个节点组成。我有一个默认值作为pos
节点的键,但我希望能够根据需要使用可选参数动态调整它。我通常在路径的末尾使用我的新命令,以便节点沿着路径放置。
不幸的是,我幼稚的方法(以及来自pgfkeys 中的可选参数?) 导致Did you forget a semicolon?
TikZ 出错,所以我怀疑我处理这个问题的方法不对。我该如何指定一个可选参数来newcommand
更改节点的位置,或者,我该如何使用 TikZ 的功能为键分配一个默认值,以便以后可以覆盖该默认值?
\documentclass[tikz]{standalone}
\newcommand*{\testone}[3][0.6]{node[pos={#1}, above] {#2} node[pos={#1}, below] {#3}}
\newcommand*{\testtwo}[2]{node[pos=0.6, above] {#1} node[pos=0.6, below] {#2}}
\newcommand*{\testthr}[2][test]{\node {#1 + #2}}
\newcommand*{\flux}[1]{\pgfkeys{/flux,position,fluxabove,fluxbelow,#1,print}} % https://tex.stackexchange.com/q/39834/32374
\pgfkeys{
/flux/.is family, /flux,
position/.default=0.6,
position/.store in=\position,
fluxabove/.store in=\fluxabove,
fluxbelow/.store in=\fluxbelow,
print/.code={node[pos=\position, above] {\fluxabove} node[pos=\position, below] {\fluxbelow}}
}
\begin{document}
\begin{tikzpicture}
% \draw (0,0) -- (1,0) \testone[0.9]{another}{text}; % This doesn't work
\draw (2,0) -- (3,0) \testtwo{text}{text};
\testthr{another};
% \draw (4,0) -- (6,0) \flux{fluxabove=10.0, fluxbelow=9.0}; % This doesn't work
\end{tikzpicture}
\end{document}
相关问题:
TikZ:\newcommand 带有可选的 TikZ 选项
是否可以为 TikZ 样式中的参数设置默认值?
pgfkeys 中的可选参数?
答案1
由于 TikZ 解析路径命令的方式,使用定义的东西\newcommand
在 TikZ 路径中总是会出现问题。
在这种情况下,我认为最好的方法是使用密钥,特别是密钥insert path
:
\documentclass[tikz, border=5]{standalone}
\tikzset{%
test 1/.style args={#1#2#3}{insert path={
node[pos={#1}, above] {#2} node[pos={#1}, below] {#3}
}},
test 2/.style 2 args={insert path={
node[pos=0.6, above] {#1} node[pos=0.6, below] {#2}
}},
flux/.style={flux/.cd,#1, print},
flux/.cd,
position/.store in=\position,
position/.default=0.6, position=,
fluxabove/.store in=\fluxabove,
fluxbelow/.store in=\fluxbelow,
print/.style={/tikz/.cd, insert path={
node [pos=\position, above] {\fluxabove} node[pos=\position, below] {\fluxbelow}
}}
}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (1,0) [test 1={0.9}{another}{text}];
\draw (2,0) -- (3,0) [test 2={text}{text}];
\draw (4,0) -- (6,0) [flux={fluxabove=10.0, fluxbelow=9.0}];
\end{tikzpicture}
\end{document}