我正在嘗試繪製特定大小的節點網格。此外,我透過嘗試使單元格(特別是它們的內部邊框)變成白色來在這個網格上戳洞。為了使這一點具體化,請考慮以下事項:
\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}
一般來說,假設矩陣中有任意的白血球“島”;在這種情況下,我們只有一個島嶼(大小為 5),這意味著白色單元格跨越主網格的一個連接的子圖,但可能有幾個這樣的島嶼。
我們希望不繪製內部邊框,但外部邊框應保持不變。事實上,繪製外邊框時只顯示其邊緣,使它們看起來呈現灰色。請參閱下面的不需要的輸出:
我們如何更好地控制節點及其邊緣的繪製方式?我也看到了這個問題這可能會幫助我以更好的方式繪製這些:我正在以編程方式執行此操作,因此能夠以類似列表的方式指定島嶼坐標似乎很不錯。
答案1
與其繪製白色邊框,不如不繪製任何邊框。這樣你就不會得到灰線(實際上是黑底白線)。
在下面的程式碼中,matrix of grid nodes = <rows> x <columns>
設定一個 TikZ 矩陣,其中每個單元格具有指定的行數和列數\node{};
。預設情況下,每個節點都是一個grid node
.
透過使用按鍵,可以指定應使用island(s)
a 的儲存格。 grid island node
Agrid island node
很簡單path only
(即draw = none, fill = node, …
),但可以是任何東西,也許只是一個座標(但這需要您執行 arow sep
或column sep
withbetween origins
否則,如果整行或列包含島嶼,您將得到零大小的行或列。
我們可以在每個單元格中\node{};
放置通常會做的事情,但如果它是一個島(甚至不是座標),則可以在單元格中什麼都不放。\tikzgridnode
\node[grid node]{};
程式碼
\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}
輸出
答案2
一個簡單的,也許有點粗魯的解決方案,透過定義無邊框的儲存格樣式:
\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}
答案3
下面的指令\islands
有 3 個參數。第一個參數是行數,第二個參數是列數,第三個參數是表單中的儲存格清單(<row>,<column>)
。
此指令繪製水平線和垂直線。如果上面和下面的儲存格包含在第三個參數的清單中,則不會繪製水平線。對於垂直線也是如此。
\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}