Latex 中文米字格实现分析

上一回制作了中文米字格,初次接触Tikz,发现有必要深入了解一下,万一后面还有需要呢,比如,制作拼音格,制作描红格等等。

网上的代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% \grid for a single character
\newcommand\grid[1]{%
\fontsize{160}{160}
\begin{tikzpicture}[baseline=(char.base)]
\path[use as bounding box]
(0,0) rectangle (1em,1em);
\draw[help lines,step=0.5em]
(0,0) grid (1em,1em);
\draw[help lines,dashed]
(0,0) -- (1em,1em) (0,1em) -- (1em,0);
\node[inner sep=0pt,anchor=base west]
(char) at (0em,\gridraiseamount) {#1};
\end{tikzpicture}}
% \gridraiseamount is a font-specific value
\newcommand\gridraiseamount{0.12em}

我们先就这个片段搞搞清楚。

首先是:

1
\begin{tikzpicture}[baseline=(char.base)]

baseline是tikzpicture的一个option, 决定了这幅图在垂直方向上的基准位置。
char则是后面代码中node的名称,node是tikzpicture中的一个子图片。char.base是一个坐标位置,指示先绘制完node以后,计算出char.base这个锚点的位置,然后将baseline设置到这个点的纵坐标位置上。可以理解为baseline与这个点在垂直方向上一致。

1
\path[use as bounding box] (0,0) rectangle (1em,1em);

这里面 \path[use as bounding box]决定了这个tikzpicture的外围大小,这里设置成从1em大小的正方形。

em是一个相对长度单位,相当于大写字母M的宽度,实际比M要更款一些,比如当前字体设置为100pt,那么em就是100pt,而M宽度略小于100pt。

\path[use as bounding box] 可以简写为 \useasboundingbox ,效果相同。

接下来是:

1
2
\draw[help lines,step=0.5em]
(0,0) grid (1em,1em);

help lines是一个style,可以修改,比如:

1
2
\tikzstyle help lines=[color=blue!50,very thin]
\tikzstyle help lines=[color=red!50,thin]

\draw 则是绘制控制了,这里绘制了一个step=0.5em的grid,grid大小从(0,0)到(1em ,1em),这一步画出了田字格。

1
2
\draw[help lines,dashed]
(0,0) -- (1em,1em) (0,1em) -- (1em,0);

这一步则是绘制出了两个斜45度交叉的虚线,并且style同样是help lines。

最后绘制我们的字符,利用了一个node,如下:

1
2
\node[inner sep=0pt,anchor=base west]
(char) at (0em,\gridraiseamount) {#1};

这里需要掌握node,anchor的概念。node是一个sub picture,可以利用{}添加文字。anchor用于定位,首先确定选用哪一个anchor,然后用at确定该ahchor的位置。

比如:

这里第二个node,anchor在west,也就是Circle一词的最左边,把这个anchor放置在c.east,c是第一个node的名称,就是放在第一个node的“东边”,即右边。

回头看我们这个例子,anchor选择了base west,定位到(0em,0.12em)的位置,其中0.12em是稍微调整了一下,使得汉字在米字格里面显得更加居中。用如下的代码也可以实现类似的效果:

1
2
\node[inner sep=0pt,anchor=south west]
(char) at (0em,0.05em) {#1};

选用south west的anchor,并适当调整位置即可。

最终效果如下:

接下来,我们准备再改造一下这个grid宏,让它可以加上拼音:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
\newcommand\pygrid[1]{%
\fontsize{100}{100}
\begin{tikzpicture}[baseline=(char.base)]
\tikzstyle help lines=[color=red!50,thin]
\path[use as bounding box]
(0,0) rectangle (1em,1.6em);
\draw[help lines,step=0.5em]
(0,0) grid (1em,1em);
\draw[help lines,dashed]
(0,0) -- (1em,1em) (0,1em) -- (1em,0);
\draw[help lines] (0em,1em) -- (0em,1.6em)
(0em,1.6em) -- (1em,1.6em) (1em,1.6em) -- (1em,1em);
\draw[help lines,dashed] (0em,1.2em) -- (1em,1.2em);
\draw[help lines,dashed] (0em,1.4em) -- (1em,1.4em);
\node[inner sep=0pt,anchor=south west]
(char) at (0em,0.06em) {#1};
\end{tikzpicture}}

这样就可以实现这样的效果了: