Estoy intentando dibujar una cuadrícula de nodos de un tamaño específico. Además, estoy haciendo agujeros en esta cuadrícula intentando que las celdas y, en particular, sus bordes interiores sean blancos. Para concretar esto, considere lo siguiente:
\documentclass[tikz]{standalone}
\usetikzlibrary{fit, matrix}
\begin{document}
\begin{tikzpicture}
\matrix [
matrix of nodes,
inner sep=0pt, % no padding around the cells
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes={
rectangle, draw=black, minimum height=11mm, minimum width=11mm,
anchor=center, inner sep=0pt, outer sep=0pt
},
nodes in empty cells,
name=table
] {
& & & & \\
& & |[white]| & & \\
& |[white]| & |[white]| & & \\
& & |[white]| & |[white]| & \\
& & & & \\
};
\end{tikzpicture}
\end{document}
En general, supongamos que tenemos "islas" arbitrarias de glóbulos blancos en la matriz; en este caso, solo tenemos una isla (de tamaño 5), lo que significa que las celdas blancas abarcan un subgrafo conectado de la red anfitriona, pero podría haber varias islas de este tipo.
Queremos que los bordes interiores no se dibujen, pero los bordes exteriores deben dejarse intactos. Tal como están las cosas, los bordes exteriores se dibujan mostrando solo sus bordes, lo que los hace lucir grisáceos. Consulte a continuación el resultado no deseado:
¿Cómo podemos controlar mejor cómo se dibujan los nodos y sus aristas? yo también veoesta preguntalo que podría ayudarme a dibujarlos de una manera más agradable: estoy haciendo esto mediante programación, por lo que parece bueno poder especificar las coordenadas de la isla en forma de lista.
Respuesta1
En lugar de dibujar un borde blanco, simplemente no dibujes ningún borde. De esa manera no obtendrás líneas grises (que en realidad son blancas sobre negro).
En el siguiente código, matrix of grid nodes = <rows> x <columns>
configura una matriz TikZ con el número especificado de filas y columnas donde cada celda tiene \node{};
su contenido. De forma predeterminada, cada uno de estos nodos será un archivo grid node
.
Al usar las claves, se pueden especificar island(s)
las celdas donde se debe usar a . grid island node
A grid island node
es simplemente path only
(es decir draw = none, fill = node, …
), pero podría ser cualquier cosa, tal vez solo una coordenada (pero para eso sería necesario hacer a row sep
o column sep
with; between origins
de lo contrario, obtendrá una fila o columna de tamaño cero si una fila o columna completa contiene islas.
En lugar de eso, \node{};
podríamos colocarlo \tikzgridnode
en cada celda, lo que \node[grid node]{};
normalmente hace, pero no puede poner nada en una celda si es una isla (ni siquiera una coordenada).
Código
\documentclass[tikz]{standalone}
\makeatletter
\newcommand*\utilrepeat[2]{%
\ifnum#1=1 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{#2}{#2\expandafter\utilrepeat\expandafter{\the\numexpr#1-1\relax}{#2}}}
\makeatother
\tikzset{
grid node/.style={
shape=rectangle, draw=black, fill=lightgray, anchor=center,
minimum size=+11mm, inner sep=+0pt, outer sep=+0pt},
% grid island node/.style={shape=coordinate}, % no node, just a coordinate
grid island node/.style=path only, % node but no output
tight matrices/.style={every outer matrix/.append style={inner sep=+0pt}},
matrix of grid nodes/.style args={#1x#2}{
matrix, tight matrices, nodes=grid node,
row sep=+-\pgflinewidth, column sep=+-\pgflinewidth,
execute at empty cell=\node{};,
node contents=%
\utilrepeat{#1}{%
\utilrepeat{\pgfinteval{#2-1}}{\pgfmatrixnextcell}\pgfmatrixendrow}},
island/.style args={#1-#2}{
row #1 column #2/.append style={nodes=grid island node}},
islands/.style={island/.list={#1}}}
\begin{document}
\tikz\node[matrix of grid nodes = 5 x 5, islands = {2-3, 3-2, 3-3, 4-3, 4-4}];
\end{document}
Producción
Respuesta2
Una solución simple, tal vez un poco tosca, es definir el estilo de las celdas sin bordes:
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\newcommand\nx{|[draw=none]|}
\matrix (m) [matrix of nodes,
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes = {draw,
minimum size=11mm, anchor=center,
inner sep=0pt, outer sep=0pt}
]
{
a & b & c & d & e\\
f & g & \nx
h & i & j\\
k & \nx l
& \nx m
& n & o\\
p & q & \nx r
& \nx s
& t\\
u & v & w & x & y\\
};
\end{tikzpicture}
\end{document}
Respuesta3
El siguiente comando \islands
toma 3 argumentos. El primer argumento es el número de filas, el segundo argumento es el número de columnas y el tercer argumento es una lista de celdas en el formulario (<row>,<column>)
.
Este comando dibuja líneas horizontales y verticales. No se dibuja una línea horizontal si las celdas de arriba y de abajo están contenidas en la lista del tercer argumento. Lo mismo ocurre con las líneas verticales.
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_if_in:nnT { neT }
\bool_new:N \l__islands_bool
\NewDocumentCommand { \islands } { mmm }
% #1 number of rows
% #2 number of columns
% #3 list of cells in the form (<row>,<column>)
{
\begin { scope }
[
shift = { ( mymatrix-1-1.north~west ) } ,
x = 11 mm ,
y = -11 mm
]
\int_step_inline:nnn { 0 } {#1}
{
\int_step_inline:nn {#2}
{
\bool_set_true:N \l__islands_bool
\str_if_in:neT {#3} { ( ##1 , ####1 ) }
{
\str_if_in:neT {#3} { ( \int_eval:n { ##1 + 1 } , ####1 ) }
{
\bool_set_false:N \l__islands_bool
}
}
\bool_if:NT \l__islands_bool
{ \draw ( { ####1 - 1 } , ##1 ) --++ ( 1 , 0 ) ; }
}
}
\int_step_inline:nnn { 0 } {#2}
{
\int_step_inline:nn {#1}
{
\bool_set_true:N \l__islands_bool
\str_if_in:neT {#3} { ( ####1 , ##1 ) }
{
\str_if_in:neT {#3} { ( ####1 , \int_eval:n { ##1 + 1 } ) }
{
\bool_set_false:N \l__islands_bool
}
}
\bool_if:NT \l__islands_bool
{ \draw ( ##1 , { ####1 - 1 } ) --++ ( 0 , 1 ) ; }
}
}
\end { scope }
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\matrix (mymatrix) [
matrix of nodes,
inner sep=0pt,
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes={
rectangle,
minimum height=11mm,
minimum width=11mm,
anchor=center,
inner sep=0pt,
outer sep=0pt
}
]
{
a & b & c & d & e\\
f & g & h & i & j\\
k & l & m & n & o\\
p & q & r & s & t\\
u & v & w & x & y\\
};
\islands{5}{5}{(2,3),(3,2),(3,3),(4,3),(4,4)}
\end{tikzpicture}
\end{document}