Линия, показанная за закрашенным прямоугольником, созданным с помощью TikZ

Линия, показанная за закрашенным прямоугольником, созданным с помощью TikZ

Мне нужно создать стиль 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}

пример пути позади

Связанный контент