我想做一个汉字网格练习汉字,例如这个:http://www.hanzigrids.com/version/1328584298/example-pdfs/hanzigrids-yingbikaishu.pdf
我能够用芳基化物包,像这样:
\begin{tabular}{|c:c|c:c|c:c|c:c|}
\hline
& & & & & & & \\
\hdashline
& & & & & & & \\
\hline
& & & & & & & \\
\hdashline
& & & & & & & \\
\hline
\end{tabular}
但是我怎样才能把这些字符写在桌子上呢?
答案1
这个答案的灵感来自于[电子邮件保护]。
当我昨天看到你的问题时,我想到三种可能的解决方案。它们是:
- 选择字符具有米字格(米字格)的字体。
- 使用LaTeX表格绘制这些网格,然后在其中填充中文字符。
- 获取每个汉字的位置和大小,然后使用 Ti 绘制网格钾Z。
第一种可能的解决方案很直接,但缺乏可移植性,而第二种如果想自动换行(也包括分页)则不是一个好的选择。因此,最后一个似乎是唯一的选择。
包装soul
说明书中所有可能的连字符后面的内容(见这里),可以帮助我们找到换行点。但是,这个包soul
有时很脆弱,因为它无法与xeCJK
重要的中文支持包很好地兼容。
[电子邮件保护]帮助我补充已经偏离的轨迹。
测试.tex
源文件中的每个字符,xeCJK
可以确定特定字符是否是 CJK(中文、日文和韩文)字符。因此,我们现在能够获得每个中文字符的位置。
输出
我们先看一下输出。
要求
- 编码:UTF-8
- 引擎:XeTeX(使用 启动命令行
xelatex
) - 软件包:
xeCJK
(高于 v3.2.8,2013/12/05),ctex
- 字体:Adobe Chinese-simp字体(点击这里开始自动下载,这四种字体都是免费的,不用担心版权问题)
代码
%!TEX program = xelatex
\documentclass[UTF8, adobefonts]{ctexart}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{geometry}
\geometry{margin = 2.1cm, papersize = {16cm, 13cm}}
\pagestyle{empty}
\linespread{0.833333}
\makeatletter
\ExplSyntaxOn
\box_new:N \l_@@_grid_box % l means local
\coffin_new:N \l_@@_grid_coffin
\coffin_new:N \l_@@_charater_coffin
\int_const:Nn \c_@@_test_char { "4E00 }
\cs_new_protected_nopar:Npn \@@_update_grid_box:
{
\hbox_set:Nn \l_@@_grid_box
{ \XeTeXuseglyphmetrics = \c_zero \c_@@_test_char }
\use:x
{
\@@_update_grid_box:nnn
{ \dim_use:N \box_wd:N \l_@@_grid_box } % width
{ \dim_use:N \box_ht:N \l_@@_grid_box } % height
{ \dim_use:N \box_dp:N \l_@@_grid_box } % depth
}
\coffin_attach:NnnNnnnn
\l_@@_charater_coffin { hc } { vc }
\l_@@_grid_coffin { hc } { vc }
{ \c_zero_dim } { \c_zero_dim }
\hbox_set:Nn \l_@@_grid_box
{
\coffin_typeset:Nnnnn \l_@@_charater_coffin
{ H } { l } { \c_zero_dim } { \c_zero_dim }
}
\box_set_wd:Nn \l_@@_grid_box { \c_zero_dim }
\box_set_ht:Nn \l_@@_grid_box { \c_zero_dim }
\box_set_dp:Nn \l_@@_grid_box { \c_zero_dim }
}
\cs_new_protected_nopar:Npn \@@_update_grid_box:nnn #1#2#3
{
\hbox_set:Nn \l_@@_grid_box { }
\box_set_wd:Nn \l_@@_grid_box {#1}
\box_set_ht:Nn \l_@@_grid_box {#2}
\box_set_dp:Nn \l_@@_grid_box {#3}
\hcoffin_set:Nn \l_@@_charater_coffin { \box_use:N \l_@@_grid_box }
\@@_draw_grid:nn {#1} { (#2) + (#3) }
}
\cs_new_protected_nopar:Npn \@@_draw_grid:nn #1#2
{
\use:x
{
\@@_draw_grid:nnnn { \dim_eval:n {#1} } { \dim_eval:n {#2} }
{ \dim_eval:n { (#1) / 2 } } { \dim_eval:n { (#2) / 2 } }
}
}
\cs_new_protected_nopar:Npn \@@_draw_grid:nnnn #1#2#3#4
{
\hcoffin_set:Nn \l_@@_grid_coffin
{
\begin{tikzpicture}
\draw[help~lines] (0,#4) -- (#1,#4) (#3,0) -- (#3,#2);
\draw[help~lines,dashed] (0,0) -- (#1,#2) (0,#2) -- (#1,0);
\draw[help~lines, red, thick] (0,0) rectangle (#1,#2);
\end{tikzpicture}
}
}
\cs_new_protected_nopar:Npn \@@_grid_CJKsymbol:n
{ \box_use:N \l_@@_grid_box \@@_grid_CJKsymbol:n }
\cs_new_protected_nopar:Npn \@@_grid_CJKpunctsymbol:n
{ \box_use:N \l_@@_grid_box \@@_grid_CJKpunctsymbol:n }
\keys_define:nn { @@ }
{
format .tl_set:N = \l_@@_formal_tl ,
format .initial:n = { \normalfont }
}
\cs_new_protected:Npn \@@_active_grid:n #1
{
\xeCJKsetup{PunctStyle=plain,CJKglue=\allowbreak,AllowBreakBetweenPuncts}
\keys_set:nn { @@ } {#1}
\tl_use:N \l_@@_formal_tl
\@@_update_grid_box:
\xeCJK_swap_cs:NN \CJKsymbol \@@_grid_CJKsymbol:n
\xeCJK_swap_cs:NN \CJKpunctsymbol \@@_grid_CJKpunctsymbol:n
\__xeCJK_add_to_shipout:n
{
\xeCJK_swap_cs:NN \CJKsymbol \@@_grid_CJKsymbol:n
\xeCJK_swap_cs:NN \CJKpunctsymbol \@@_grid_CJKpunctsymbol:n
}
}
\NewDocumentCommand \CJKgrid { +O { } +m }
{ \group_begin: \@@_active_grid:n {#1} #2 \relax \group_end: }
\NewDocumentEnvironment { CJKGrid } { +O { } }
{ \@@_active_grid:n {#1} } { \par }
\ExplSyntaxOff
\begin{document}
\setlength{\parindent}{0pt}
\zihao{0}
\CJKgrid{\kaishu 我\color{gray!20}我我我我我我\color{white}我}
\CJKgrid{\kaishu 喜\color{gray!20}喜喜喜喜喜喜\color{white}喜}
\CJKgrid{\kaishu 歡\color{gray!20}歡歡歡歡歡歡\color{white}歡}
\CJKgrid{\kaishu 寫\color{gray!20}寫寫寫寫寫寫\color{white}寫}
\CJKgrid{\kaishu 漢\color{gray!20}漢漢漢漢漢漢\color{white}漢}
\CJKgrid{\kaishu 字\color{gray!20}字字字字字字\color{white}字}
\end{document}
编辑
Adobe 字体其实不是必需的,因为这里用它们来显示。可以用 替换选项adobefonts
,nofonts
然后通过 提供的控制序列重置字体xeCJK
(有关详细信息,请参阅其文档)。