
Мне нужно создать стиль TikZ, представляющий собой закрашенный прямоугольник с пересекающей его линией.
Проблема, с которой я сейчас столкнулся, заключается в том, что когда прямоугольник залит цветом, то линия рисуется позади прямоугольника, а мне она нужна выше.
МВЭ:
\documentclass[12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, shapes.geometric}
\tikzstyle{mainfig} = [
minimum width=16mm,
minimum height=5mm,
text centered,
draw=black,
fill=orange!80,
line width=1pt,
rectangle,
append after command={
\pgfextra{
\draw [line width=2pt]
($(\tikzlastnode.north west)+(3mm,5mm)$)--
($(\tikzlastnode.south west)+(3mm,-5mm)$);
}
}
]
\begin{document}
\begin{tikzpicture}[font=\footnotesize]
\node (test) [mainfig] {\ldots};
\end{tikzpicture}
\end{document}
Вот что я получаю:
Как сделать так, чтобы линия, нарисованная после, append after command
была нарисована над заполненной фигурой?
Обновлять:
Я подтвердил, что этот код не работает ни с pgf 2.10, ни с 3.0.0.
Кроме того, я увидел, что эта проблема прекрасно решается с помощью pgf 3.0.0, благодаря ответам @PaulGessler и @PaulGaborit, но на данный момент мне хотелось бы решения, работающего для обеих версий pgf. Надеюсь, я не слишком многого прошу.
В частности, мне нужно работающее решение с поддержкой pgf 2.10, поскольку я буду использовать этот код в проекте, над которым буду работать совместно, а на данный момент и ShareLaTeX, и writeLaTeX используют эту версию pgf.
Если ничего нового не появится, я с радостью приму наиболее набравший голоса ответ.
решение1
Один из методов — использовать слои. Объявите fg
слой переднего плана ( ) с помощью \pgfdeclarelayer{fg}
и установите порядок слоев (снизу вверх) с помощью \pgfsetlayers{main,fg}
.
Затем, в любом месте в pgf
среде, основанной на -, вы можете использовать
\begin{pgfonlayer}{fg}
<drawing commands>
\end{pgfonlayer}
рисовать на переднем плане.
Примечание: shapes.geometric
библиотека не обязательна, rectangle
входит в базовый пакет.
Код
\documentclass[12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\pgfdeclarelayer{fg} % declare foreground layer
\pgfsetlayers{main,fg} % set layer order
\tikzstyle{mainfig} = [
minimum width=16mm,
minimum height=5mm,
text centered,
draw=black,
fill=orange!80,
line width=1pt,
rectangle,
append after command={
\pgfextra{
\begin{pgfonlayer}{fg}
\draw [line width=2pt]
($(\tikzlastnode.north west)+(3mm,5mm)$)--
($(\tikzlastnode.south west)+(3mm,-5mm)$);
\end{pgfonlayer}
}
}
]
\begin{document}
\begin{tikzpicture}[font=\footnotesize]
\node (test) [mainfig] {\ldots};
\end{tikzpicture}
\end{document}
Выход
решение2
Ключ append after command
ничего не добавляет после рисования узла. Он добавляет материал к текущему пути, где появляется запись узла. Вот пример, иллюстрирующий его использование.
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\draw (0,0) -- (1,0) node{A} -- (2,0);
\draw[red] (0,1) -- (1,1) node[append after command={-- +(0,1)}] {A} -- (2,1);
\end{tikzpicture}
\end{document}
Когда TikZ рисует путь с некоторыми узлами, сначала он рисует путь (и собирает все узлы), затем рисует узлы. С TikZ 3.0 вы можете применить опцию behind path
к узлу, чтобы нарисовать его перед текущим путем. Вот пример его использования (в сочетании с append after command
):
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\tikzset{
mainfig/.style={
minimum width=16mm,minimum height=5mm,text centered,
draw=black,fill=orange!80,
line width=1pt,rectangle,
append after command={
($(\tikzlastnode.north west)+(3mm,5mm)$)--
($(\tikzlastnode.south west)+(3mm,-5mm)$)
},
},
}
\begin{document}
\begin{tikzpicture}[font=\footnotesize]
\draw[line width=2pt,draw=blue] node [mainfig] {\ldots};
\draw[line width=2pt,draw=red] (0,2) node [behind path,mainfig] {\ldots};
\end{tikzpicture}
\end{document}