以下代码会导致错误:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\def\aebelowof{below=of A}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {NODE A};
\node[right=of A] {NODE B};
\node[\aebelowof] {node C};
\end{tikzpicture}
\end{document}
错误是:
! Package pgfkeys Error: I do not know the key '/tikz/below=of A' and I am goin
g to ignore it. Perhaps you misspelled it.
See the pgfkeys package documentation for explanation.
Type H <return> for immediate help.
...
l.12 \node[\aebelowof]
{node C};
?
我知道我可以通过以下方式解决这个问题:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\def\aebelowof{below=of A}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {NODE A};
\node[right=of A] {NODE B};
\expandafter\node\expandafter[\aebelowof] {node C};
\end{tikzpicture}
\end{document}
但是对于应该嵌入的代码,将\expandafter
s 放置到其中会很困难或几乎不可能。
基本上,我想要做的是存储有关如何格式化节点并将其放置在各种宏中的信息。我想知道是否有tikz
我pgf
不知道的技巧可以解决此问题。
更新
这是一个稍微复杂一点的例子。需要有某种用户界面,用户可以在其中设置位置,但我不会强迫用户进行某种特定的配置/定位。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\def\aeposition{}
\newcommand\setposition[1]{\def\aeposition{#1}}
\begin{document}
\setposition{left=of A}
\begin{tikzpicture}
\node (A) at (0,0) {NODE A};
\node[right=of A] {NODE B};
\expandafter\node\expandafter[\aeposition] {node C};
\end{tikzpicture}
\setposition{below=3in of C}
\begin{tikzpicture}
\node (C) at (0,0) {NODE C};
\node[right=of C] {NODE D};
\expandafter\node\expandafter[\aeposition] {node E};
\end{tikzpicture}
\end{document}
简而言之,关键字,关键字和值之间的等号以及值都存储在宏中。
答案1
您应该使用tikzset
来定义一种风格:
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{aebelowof/.style={below=of A}}
\begin{document}
\begin{tikzpicture}
\node (A) at (0,0) {NODE A};
\node[right=of A] {NODE B};
\node[aebelowof] {node C};
\end{tikzpicture}
\end{document}
更新:
以下是应用于更新后的测试用例的相同解决方案:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{aeposition/.style={}}
\newcommand{\setposition}[1]{%
\tikzset{aeposition/.style={#1}}%
}
\begin{document}
\setposition{left=of A}
\begin{tikzpicture}
\node (A) at (0,0) {NODE A};
\node[right=of A] {NODE B};
\node [aeposition] {node C};
\end{tikzpicture}
\setposition{below=3in of C}
\begin{tikzpicture}
\node (C) at (0,0) {NODE C};
\node[right=of C] {NODE D};
\node [aeposition] {node E};
\end{tikzpicture}
\end{document}
答案2
根据@petergrill 更新后的答案,这是我想到的解决方案:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\def\aeposition{}
\newcommand\setposition[1]{\def\aeposition{#1}}
\begin{document}
\setposition{left=of A}
\begin{tikzpicture}
\node (A) at (0,0) {NODE A};
\node[right=of A] {NODE B};
\node[aeposition/.style/.expand once={\aeposition},aeposition] {node C};
\end{tikzpicture}
\end{document}
当然,在上面的 MWE 中,改变用户界面的工作方式看起来很容易,但在我的实际文档中却并非如此。
问题是我被宏困住了\aeposition
。我从其他地方继承了它,我不确定重写它的来源是否可行。但是通过定义temporary
我可以根据需要附加/.expanded
或的样式/.expand once
,我就可以提取宏的内容。
@petergrill 的答案的优点在于它允许我轻松处理空样式,这对于没有相对于任何其他节点放置的初始节点是必要的。