下面的代码
\documentclass{article}
\usepackage[margin=0.5cm]{geometry}
\usepackage{tikz,wasysym}
\usetikzlibrary{shapes, positioning}
\newcommand{\argument}[2][]{\tikz[baseline]{\node[rectangle, rounded corners=2mm, draw, inner sep=3pt, anchor=base, minimum width=1.3em, #1] {#2};}}
\newcommand{\mygrid}{\tikz{\draw[step=2.5mm] (0,0) grid (1,1);}}
\begin{document}
\begin{tikzpicture}
\node[rectangle split, rectangle split horizontal, thick, draw, rectangle split parts=2, anchor=base]
{
S \argument{19}
\nodepart{two}
\mygrid{}
};
\end{tikzpicture}
\end{document}
生成此图片:
我希望网格完全覆盖(无边框)右侧矩形(nodepart(two)
)。我尝试使用, \node[inner sep=0....
但外部正方形和网格之间仍留有一些边框。如何解决此问题?
PS 我知道我必须避免嵌套 tikz 图片。我是初学者,这将是下一步。
答案1
正如我上面评论的那样,额外的空间在我看来像是嵌套 tikzpictures 和选项的一些问题baseline
。我不知道如何解决这个问题。
我想到使用rectangle split
节点的最佳替代方案是首先将节点设置为所需的大小(通过在其中放置一个空框),然后使用角作为锚点在其上绘制网格。例如,
\documentclass{article}
\usepackage[margin=0.5cm]{geometry}
\usepackage{tikz,wasysym,adjustbox}
\usetikzlibrary{shapes, positioning, shapes.multipart, calc}
\newcommand{\argument}[2][]{\tikz[baseline]{\node[rectangle, rounded corners=2mm, draw, inner sep=3pt, anchor=base, minimum width=1.3em, #1] {#2};}}
\newcommand{\spacer}[2]{\tikz{\path (0,0) rectangle (#1,#2);}}
\newcommand{\fitgrid}[5][]{
% usage: \fitgrid[options]{south west}{north east}{xcells}{ycells}
\begin{pgfinterruptboundingbox}
\newdimen\XCoord
\newdimen\YCoord
\coordinate (diff) at ($#3 - #2$);
\path (diff); \pgfgetlastxy{\XCoord}{\YCoord}
\begin{scope}[shift={#2}, x={\XCoord}, y={\YCoord}]
\draw[#1] (0,0) grid[xstep={\XCoord/#4}, ystep={\YCoord/#5}] (1,1);
\end{scope}
\end{pgfinterruptboundingbox}
}
\begin{document}
\begin{tikzpicture}
\node[rectangle split, rectangle split horizontal, draw, rectangle split parts=2, anchor=base, inner sep=3pt] (mybox)
{
S \argument{19}
\nodepart{two}
\spacer{1}{1}
};
\fitgrid{(mybox.one split south)}{(mybox.north east)}{4}{4}
\end{tikzpicture}
\end{document}
一些说明:
- 网格并不完全是正方形(也不完全是间隔物的尺寸),因为额外的边缘仍然存在,只是被覆盖了。
- 网格边框与分割矩形节点不太对齐。不知道为什么。
tikzpicture
如果缩放,这个精确的实现就会被破坏。
答案2
我更喜欢像下面这样的命令样式:
\documentclass{article}
\usepackage[margin=0.5cm]{geometry}
\usepackage{tikz,wasysym}
\usetikzlibrary{shapes, positioning}
\begin{document}
\begin{tikzpicture}[
argument style/.style={rectangle, rounded corners=2mm, draw, inner sep=3pt, anchor=base, minimum width=1.3em},
]
\draw[step=2.5mm] (0,0) grid (1,1);
\draw (0,0) rectangle (-1,1);
\node at (-.8,.5) (text) {S};
\node[argument style,right=-1pt of text] {19};
\end{tikzpicture}
\end{document}
答案3
我留下我的其他答案,因为它可能对其他目的有用,但我找到了另一个更接近你开始时的解决方案:
\documentclass{article}
\usepackage[margin=0.5cm]{geometry}
\usepackage{tikz,wasysym,adjustbox}
\usetikzlibrary{shapes, positioning}
\newcommand{\argument}[2][]{\tikz[baseline]{\node[rectangle, rounded corners=2mm, draw, inner sep=3pt, anchor=base, minimum width=1.3em, #1] {#2};}}
\newcommand{\mygrid}{\tikz[baseline=.5cm]{\draw[step=2.5mm] (0,0) grid (1,1);}}
\begin{document}
\begin{tikzpicture}
\node[rectangle split, rectangle split horizontal, thick, draw, rectangle split parts=2, anchor=base, inner sep=3pt]
{
S \argument{19}
\nodepart{two}
\marginbox{-3pt}{\mygrid}
};
\end{tikzpicture}
\end{document}
具体变化如下:
- 明确设置节点的,以便您可以用网格周围的
inner sep
精确取消它。(这需要包。)\marginbox
adjustbox
- 添加
baseline=.5cm
为网格的一个选项。不知何故,指定基线似乎可以修复额外空间,就像从中移除它一样\argument
。.5cm 的值也避开了\marginbox
始终包含基线的事实(因此为了安全起见,您应该将其设置在网格的中间)。
由于某种原因,网格的左边缘仍然虽然不太一致,但可能足够接近了。