我正在寻找一个可以使用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 picture
key 用此文本填充路径所包围的区域。这在 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 sep
和TeXture 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}
顺便说一下,这个版本应该与库兼容positioning
。