
Я пытаюсь решитьКак правильно повернуть композицию узлов Tikz, не поворачивая текст их меток?; и я нашелtikz pgf - Проблема с «добавить после команды» и «вставить путь».
Это дало мне следующую идею - определить стиль, который просто помещает другой узел поверх "текущего", с цветным фоном, чтобы новый узел заслонял старый, и с тем же содержимым "текущего" узла, но повернутым. Вот до чего я дошел:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}
% https://tex.stackexchange.com/questions/55722/problem-with-append-after-command-and-insert-path
\makeatletter
\def\mymacro{
\begin{scope}
% { % MUST have this group! or scope!
\setbox\tikz@figbox=\box\pgfutil@voidb@x
\node at (\tikzlastnode) [fill=yellow] {\rotatebox{180}{YY}}; %
% }
\end{scope}
}
\makeatother
\tikzstyle{drc} = [draw, rectangle, line width=1pt, align=center,
append after command={\pgfextra{\mymacro}},
% insert path={\pgfextra{\mymacro}}, % no \tikzlastnode
]
\begin{document}
\begin{tikzpicture}[line width=3mm]
\node[drc] at (0,0) {\ \ A};
\node[drc] at (1,1) {B\ \ };
\end{tikzpicture}
\end{document}
Вот что получилось:
Проблемы/вопросы следующие:
- Добавленный узел — этопозадиисходный узел, чтобы его заливка не могла затенять исходный узел. Есть ли способ разместить его перед исходным узлом?
- У меня есть только буквы
YY
для теста - но я бы предпочел "извлечь" текст\tikzlastnode
; однако, похоже, что\tikzlastnode
это в основном просто имя последнего узла, а не "ссылка на объект". В любом случае, есть ли способ извлечь и повторно использовать текст\tikzlastnode
?
решение1
Я не думаю, что существует встроенный метод сохранения поля последнего узла, поэтому вот быстрый и грязный способ (и, вероятно, не надежный):
\documentclass[tikz, border=5]{standalone}
\newbox\lastnodebox
\begin{document}
\begin{tikzpicture}[every node/.style={draw,
execute at begin node=\global\setbox\lastnodebox\hbox\bgroup,
execute at end node=\egroup\copy\lastnodebox}]
\foreach \i [count=\y] in {A,...,F}
\node at (0,-\y/2) {\box\lastnodebox \i};
\end{tikzpicture}
\end{document}
EDIT: В отношении примера OP, даже если этот подход используется для добавления дополнительного узла через append after command={\pgfextra{\mymacro}}
, все равно добавленный узел находится «позади» (и поэтому не будет «покрывать» предыдущий узел). Однако этот подход может использоваться в стиле напрямую, вместе со средой turn
из rotating
пакета, чтобы выдать поворот «по времени», и как таковое «добавление» или «наложение» второго повернутого узла не нужно. Поэтому мы можем использовать:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\usetikzlibrary{fit}
\usepackage{rotating} %tlmgr install rotating
\newbox\lastnodebox
\tikzstyle{drc} = [draw, rectangle, line width=1pt, align=center,]
\tikzstyle{drcr} = [drc,
execute at begin node=\begin{turn}{180}\global\setbox\lastnodebox\hbox\bgroup,
execute at end node=\egroup\copy\lastnodebox\end{turn},
]
\begin{document}
\begin{tikzpicture}[line width=3mm]
\node[drc] at (0,0) {\ \ A\\A\ \ };
\node[drcr] at (1,1) {B\ \ \\\ \ B};
\end{tikzpicture}
\end{document}
... чтобы получить: