Tikz:自定义文本作为形状的填充图案

Tikz:自定义文本作为形状的填充图案

我正在寻找一个可以使用fit自定义文本的任意形状(框、圆形或通过库定义的东西)的选项。

例如,不要像这里一样用点填充

\documentclass[10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\draw[pattern=dots, pattern color=green] (0, 0) rectangle (4, 4);
\end{tikzpicture}
\end{document}

我想用自定义文本填充它(例如,每个点都由文本替换,并且文本的间距进行相应调整以使其不重叠)。

答案1

我认为在实际模式中使用文本可能是不可能的,但我很乐意被证明是错的。以下是两种不使用模式即可实现所需目的的方法。

  • 第一个使用节点打印文本,然后\clip将其剪切。有关剪辑的更多信息,请参阅pgf 手册(针对版本 3.1.1)。
  • 第二个使用path picturekey 用此文本填充路径所包围的区域。这在 15.6 节中有解释pgf 手册(针对版本 3.1.1)。

它的作用是使用 的副本\TeXture[<text>]{<width>}{<height>}填充一个比 稍窄<width>、比 稍高的区域。(之所以用 是因为> 需要被截断,所以没有显示出来。)此命令的名称和内容均取自 TeXbook 中的一项练习。原始命令,在其上<height><text><text\leaders\TeXture在 9.2 节(第 99 页)中有解释TeX 按主题分类

\documentclass[tikz]{standalone}

\newcommand*\TeXture[3][\TeX]{\leavevmode\hbox to #2{\leaders\vbox to #3{\leaders\hbox{#1}\vfil}\hfil}}

\begin{document}

\begin{tikzpicture}
    \begin{scope}
        \clip (0,0) circle[radius=2];
        \node at (0,0) {\TeXture{5cm}{5cm}};
    \end{scope}
\end{tikzpicture}

\begin{tikzpicture}
    \path[path picture={\node at (path picture bounding box.center) {\TeXture{5cm}{5cm}};}] 
         (0,0) circle[radius=2];
\end{tikzpicture}

\end{document}

这会产生两个(据我所知)相同的页面:

输出

备注:如果您想要正确的行距,可以使用\TeXture[bla\strut]{5cm}{5cm}


附录

这是一个更 Ti 的版本Z 友好语法允许进行一些自定义!前言有点复杂,但很容易使用。

我定义了四个键:

  • TeXture=<text>打开 TeXturing 并设置要使用的文本(默认值:)\TeX
  • TeXture x sep=<length>TeXture y sep=<length>分别确定水平和垂直分离(默认值:0pt 和 0pt);
  • TeXture sep=<length>设置TeXture x sepTeXture y sep

早期版本还要求您指定需要填充的区域的大小,但现在不再需要。新版本会提取此信息并重复文本适当的次数

\documentclass[tikz,margin=1mm]{standalone}

\newcommand*\tikzTeXture[1]{% %% <- Does the actual filling
  \begingroup
    \setbox0=\vbox spread \pgfkeysvalueof{/tikz/TeXture y sep}{\vfil%
               \hbox spread \pgfkeysvalueof{/tikz/TeXture x sep}{\hfil#1\hfil}\vfil}%
    \def\fillareasize{\pgfpointdiff %% <- size of area to be filled
      {\pgfpointanchor{path picture bounding box}{south west}}%
      {\pgfpointanchor{path picture bounding box}{north east}}}%
    \pgfextractx{\dimen0}{\fillareasize}% %% <- width of area to be filled
    \pgfextracty{\dimen2}{\fillareasize}% %% <- height of area to be filled
    \leavevmode\hbox to \dimexpr\dimen0+\wd0{%
      \cleaders\vbox to \dimexpr\dimen2+\ht0+\dp0{
        \cleaders\box0\vfil
      }\hfil
    }%
  \endgroup
}

\tikzset{TeXture/.style={path picture={
  \node[anchor=center,text width=,text height=]
        at (path picture bounding box.center) {\tikzTeXture{#1}};}
}}
\tikzset{TeXture/.default=\TeX}
\tikzset{TeXture x sep/.initial=0pt}
\tikzset{TeXture y sep/.initial=0pt}
\tikzset{TeXture sep/.style={/tikz/TeXture x sep=#1,/tikz/TeXture y sep=#1}}

\begin{document}

\begin{tikzpicture}
    \draw[domain=0:360,samples=128,fill=red!80!black,line join=round,
          TeXture=\LaTeX,TeXture sep=2pt]
         plot ({2*sin(\x)^3},{(13*cos(\x)-5*cos(2*\x)-2*cos(3*\x)-cos(4*\x))/8}) -- cycle;
\end{tikzpicture}

\end{document}

我♥️LaTeX

顺便说一下,这个版本应该与库兼容positioning

相关内容