我正在写一些汉字,希望用 tikz 画一些简单的图片,并将其用作这些汉字的背景。简而言之,我希望得到如下图所示的结果(忽略右下角的噪音):
我该怎么办?提前致谢。以下是最不可行的代码示例:
\documentclass{article}
\usepackage[CJKnumber]{xeCJK}
\setmainfont{KaiTi}
\begin{document}
\Huge 明月出天山
\end{document}
答案1
显示字符后面的基本网格,同时添加了一个新命令\Grid{}
,用于在特定网格内插入所需的字形:
\documentclass{article}
\usepackage{xeCJK}
\usepackage{tikz}
\setCJKmainfont{KaiTi}
%
\newcommand\Grid[1]{%
\tikz[baseline=(char.base)]{%
\draw[xstep=1ex,ystep=1ex,help lines] (-1ex,-1ex) grid (1ex,1ex);
\node[inner sep=0pt] (char) at (0,0) {#1};
}%
}
%
\begin{document}
%
\Huge 明月出天山
%
\Huge 明月出天\Grid{山}
%
\end{document}
输出如下:
更新
如果需要更多嵌套的网格,则可以将新参数应用于的定义\Grid{<step>}{<glyph>}
,因此将命令修改为:
\newcommand\Grid[2]{%
\tikz[baseline=(char.base)]{%
\draw[xstep=#1 ex,ystep=#1 ex,help lines] (-1ex,-1ex) grid (1ex,1ex);
\node[inner sep=0pt] (char) at (0,0) {#2};
}%
}
给出\Grid{1}{山}
和\Grid{0.5}{山}
:
答案2
使用 Andrea L. 和 Gonzalo Medina 的解决方案,我们可能会得到奇怪的 CJK 标点符号结果。以前的解决方案存在一些问题:
- 网格的位置应该相对于角色的基点。
- 网格的宽度和高度应该都是
1em
,而不是2ex
(大多数 CJK 字体中的字符都是正方形的)。 - 网格应该对齐。
- 图片的边界框应该比网格线略小,因为线宽是不可忽略的。
PGFTricks 的解决方案在标点符号方面可能也存在问题。
这是 Andrea 解决方案的改进版本,它仔细处理了字形和边界框的深度。
\documentclass{article}
\usepackage{xeCJK}
\setCJKmainfont{KaiTi}
\usepackage{tikz}
% \grid for a single character
\newcommand\grid[1]{%
\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}
% \Grid for a CJK string
\makeatletter
\newcommand\Grid[1]{%
\@tfor\z:=#1\do{\grid{\z}}}
\makeatother
\begin{document}
\Huge
\xeCJKsetup{PunctStyle=plain}
明月出天山,苍茫云海间。
\Grid{明月出天山,苍茫云海间。}
% We use a dash to test \gridraiseamount
\grid{—}
\end{document}
答案3
使用 PSTricks。
版本 1
\documentclass[pstricks]{standalone}
\usepackage{CJKutf8}
\usepackage[overlap,CJK]{ruby}
\newpsstyle{gridstyle}{gridlabels=0pt,subgriddiv=1,gridcolor=lightgray}
\renewcommand\rubysep{-0.1ex}
\newsavebox\IBox
\newcommand\prepare[2][10]{\sbox\IBox{\raisebox{\depth}{\psscalebox{#1}{#2}}}}
\begin{document}
\begin{CJK*}{UTF8}{min}
\prepare{\ruby{忍}{にん}\ruby{者}{じゃ}}
\psset{xunit=\dimexpr\wd\IBox/2,yunit=\dimexpr\ht\IBox/2}
\begin{pspicture}[showgrid](2,2)
\rput[bl](0,0){\usebox\IBox}
\end{pspicture}
\end{CJK*}
\end{document}
版本 2
\documentclass[pstricks]{standalone}
\usepackage{CJKutf8}
\usepackage[overlap,CJK]{ruby}
\newpsstyle{gridstyle}{gridlabels=0pt,subgriddiv=1,gridcolor=lightgray}
\renewcommand\rubysep{-0.1ex}
\newsavebox\IBox
\newcommand\prepare[2][10]{\sbox\IBox{\raisebox{\depth}{\psscalebox{#1}{#2}}}}
\begin{document}
\begin{CJK*}{UTF8}{min}
%\prepare{\ruby{忍}{にん}\ruby{者}{じゃ}}
\prepare[15]{犬}
\psset{xunit=\dimexpr\wd\IBox/2,yunit=\dimexpr\ht\IBox/2,linecolor=lightgray}
\begin{pspicture}[showgrid](2,2)
\psline(2,0)(0,2)
\psline(2,2)
\rput[bl](0,0){\usebox\IBox}
\end{pspicture}
\end{CJK*}
\end{document}