编辑: 似乎这个问题(我在这里第一次问的问题)并不像我想象的那么清楚。因此,我——受到最近收到的评论的启发——满怀希望地重新表述了这个问题,希望现在能更清楚地了解当时困扰我的问题。让我们开始吧:
在我的一本教科书中,我有大量由 TikZ 包制作的图像,这些图像只有略微不同的共同元素。我将这些元素的定义存储在\tikzset
类似以下内容中:
\tikzset{TCP/.style = {
tcpBOX/.style 2 args = {shape=rectangle,
draw=##1, % border color
fill=##2, % fill collor
thick, inner sep= 2mm, outer sep=0mm, minimum height=11mm,
% etc
},
% other common elements
}}
and used in TikZ pictures as
\begin{tikzpicture}[TCP]
\node (n1) [tcpBOX={black}{none}] at (0,0) {some text};
% ...
\end{tikzpicures}
在某些情况下,我需要在 tcpBOX 节点内添加标签。为此,我使用了 Mark Wibrow 多年前在这个 comp.text.tex 线程:
\documentclass[tikz,border=5mm]{standalone}
%%% code from ctt, December 1999
\makeatletter
\def\tikzsavelastnodename#1{\let#1=\tikz@last@fig@name}
\makeatother
\tikzset{
BOX/.style = {rectangle,
minimum width=33mm,
minimum height=22mm,
draw,
thick,
text=red,
append after command={\pgfextra{\tikzsavelastnodename\tikzsavednodename}},#1%
},
add text/.style args = {#1:#2}{append after command={%
node[anchor=#1] at (\tikzsavednodename.#1) {#2}}
},
}
%%% example of use
\begin{document}
\begin{tikzpicture}
\node[BOX,
add text=north:lorum,
add text=south west:ipsum,
add text=east:dolor
] (a) {box};
\end{tikzpicture}
\end{document}
它工作正常,如何以某种方式合并 tcpBOX 和 BOX 的代码,以便 tcpBOX 可以用作例如:
\node[box=<desired parameter>, ...
add text=south:lorum] (<node name>) at (<coordinate>) {text in box};
在问这个问题的时候,我还不知道如何合并这两种样式定义,因为它们在使用时有自己的参数需要设置(tcpBOX 用于“绘制”和“填充”,BOX 用于附加命令)。
答案1
现在问题似乎很简单,解决方案也很明显...无论如何,我现在使用的解决方案通过以下方式解决我的问题:
- 我
append after command={\pgfextra{\tikzsavelastnodename\tikzsavednodename}},##1
将其定义为新样式命名saveLNN
(save-Last-Node-Name 的缩写) - 在我的 tcpBOX 定义中添加此内容
saveLNN
完整代码为:
\documentclass[tikz,border=5mm]{standalone}
\makeatletter
\def\tikzsavelastnodename#1{\let#1=\tikz@last@fig@name}
\makeatother
\tikzset{TCP/.style = {%
saveLNN/.style = {append after command={%
\pgfextra{\tikzsavelastnodename\tikzsavednodename}},##1},
add text/.style args = {##1:##2}{%
append after command={node[ATnode,anchor=##1]
at (\tikzsavednodename.##1) {##2}}
},
ATnode/.style = {inner sep=0.5mm,
font=\tiny\bfseries\sffamily},
tcpBOX/.style 2 args = {shape=rectangle,
draw=##1, % border color
fill=##2, % fill collor
thick, inner sep= 2mm, outer sep=0mm, minimum height=11mm,
saveLNN},
}
}% end of tikzset
这使:
我仍然愿意寻找更好的解决方案。
答案2
仅用于inner labels
:为标签文本选择正确的锚点以及节点边界上的正确位置,您将获得内部标签。
\documentclass[tikz,border=2mm]{standalone}
\begin{document}
\begin{tikzpicture}[
lblfont/.style={font=\tiny\bfseries\sffamily, inner sep=1pt},
]
\node[draw=red, fill=gray, minimum height=1cm,
label={[anchor=north, lblfont]label.n}, % north is default anchor
label={[anchor=north east, lblfont]north east:label.ne},
label={[anchor=south west, lblfont]south west:label.sw},
] {Some main text};
\end{tikzpicture}
\end{document}