如何使用 tikz 绘制图画作为人物背景?

如何使用 tikz 绘制图画作为人物背景?

我正在写一些汉字,希望用 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}

在此处输入图片描述

相关内容