
Preciso criar um estilo TikZ que seja um retângulo preenchido com uma linha cruzando-o.
O problema que estou enfrentando agora é que quando o retângulo é preenchido com uma cor, a linha é desenhada atrás do retângulo e preciso dela acima.
O MWE:
\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}
Isto é o que eu recebo:
Como posso forçar a linha desenhada depois append after command
a ser desenhada acima da figura preenchida?
Atualizar:
Confirmei que este código não funciona com pgf 2.10, nem com 3.0.0.
Além disso, vi que esse problema pode ser perfeitamente resolvido usando o pgf 3.0.0, graças às respostas de @PaulGessler e @PaulGaborit, mas por enquanto gostaria de uma solução que funcionasse para ambas as versões do pgf. Espero que não seja pedir muito.
Em particular, preciso de uma solução funcional com suporte ao pgf 2.10, pois usarei esse código em um projeto para ser trabalhado de forma colaborativa e, a partir de agora, tanto o ShareLaTeX quanto o writeLaTeX usam essa versão do pgf.
Se nada de novo aparecer, aceitarei de bom grado a resposta mais votada.
Responder1
Um método é usar camadas. Declare a fg
camada de primeiro plano ( ) com \pgfdeclarelayer{fg}
e defina a ordem das camadas (de baixo para cima) com \pgfsetlayers{main,fg}
.
Então, em qualquer lugar em um pgf
ambiente baseado em -, você pode usar
\begin{pgfonlayer}{fg}
<drawing commands>
\end{pgfonlayer}
para desenhar em primeiro plano.
Uma observação: a shapes.geometric
biblioteca não é obrigatória; rectangle
está incluído no pacote básico.
O código
\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}
A saída
Responder2
A append after command
chave não acrescenta nada depois de desenhar o nó. Ele anexa material ao caminho atual onde a entrada do nó aparece. Aqui está um exemplo para ilustrar seu uso.
\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}
Quando o TikZ desenha um caminho com alguns nós, primeiro ele desenha o caminho (e coleta todos os nós) e depois desenha os nós. Com o TikZ 3.0, você pode aplicar a behind path
opção a um nó para desenhá-lo antes do caminho atual. Aqui está um exemplo de seu uso (combinado com 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}