如何向内部使用“命令后附加”的形状添加参数

如何向内部使用“命令后附加”的形状添加参数

编辑: 似乎这个问题(我在这里第一次问的问题)并不像我想象的那么清楚。因此,我——受到最近收到的评论的启发——满怀希望地重新表述了这个问题,希望现在能更清楚地了解当时困扰我的问题。让我们开始吧:

在我的一本教科书中,我有大量由 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}

在此处输入图片描述

相关内容