
Necesito crear un estilo TikZ que sea un rectángulo relleno con una línea que lo cruce.
El problema al que me enfrento ahora es que cuando el rectángulo se llena con un color, la línea se dibuja detrás del rectángulo y la necesito arriba.
El 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}
Esto es lo que obtengo:
¿Cómo puedo forzar que la línea dibujada después append after command
se dibuje sobre la figura rellena?
Actualizar:
He confirmado que este código no funciona con pgf 2.10 ni con 3.0.0.
Además, he visto que este problema se puede resolver perfectamente usando pgf 3.0.0, gracias a las respuestas de @PaulGessler y @PaulGaborit, pero por ahora me gustaría una solución que funcione para ambas versiones de pgf. Espero que no sea mucho pedir.
En particular, necesito una solución que funcione con soporte para pgf 2.10, porque usaré este código en un proyecto para trabajar en colaboración y, a partir de ahora, tanto ShareLaTeX como writeLaTeX usan esa versión de pgf.
Si no aparece nada nuevo, aceptaré con gusto la más votada de esas respuestas.
Respuesta1
Un método es utilizar capas. Declare la fg
capa de primer plano ( ) con \pgfdeclarelayer{fg}
y establezca el orden de las capas (de abajo hacia arriba) con \pgfsetlayers{main,fg}
.
Luego, en cualquier lugar de un pgf
entorno basado en -, puede utilizar
\begin{pgfonlayer}{fg}
<drawing commands>
\end{pgfonlayer}
para dibujar en primer plano.
Una nota: la shapes.geometric
biblioteca no es obligatoria; rectangle
está incluido en el paquete básico.
El 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}
La salida
Respuesta2
La append after command
clave no agrega nada después de dibujar el nodo. Agrega material a la ruta actual donde aparece la entrada del nodo. A continuación se muestra un ejemplo para ilustrar su 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}
Cuando TikZ dibuja un camino con algunos nodos, primero dibuja el camino (y recopila todos los nodos) luego dibuja los nodos. Con TikZ 3.0, puedes aplicar la behind path
opción a un nodo para dibujarlo antes de la ruta actual. A continuación se muestra un ejemplo de su uso (combinado con 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}