有没有办法用图像的随机部分填充 Tikz 节点的文本?
如果图像的每个部分在填充文本节点之前也可以随机旋转,那就太好了。
我并不真正关心如何设置图像每个部分的大小(只要图像的大小与要填充的相应文本的大小相比足够大)。因此,例如:
- 各部分的尺寸可以是恒定的并由用户给定,例如
\def\sizeParts{100pt}
,表示 100ptx100pt 图像部分。 - 或者,可以根据要填充的相应文本的大小自动计算图像的大小。
所讨论的文本实际上是一个符号列表,比如说:{$\blacksquare$,--,B,$\blacksquare$}
列表中的每个符号都以水平方式(即内联)打印,每个符号都有一个节点(从Sandy G' 在这里回答):
\newcommand{\hsp}{.7}
\foreach \s[count=\n from 0] in {$\blacksquare$,--,B,$\blacksquare$}{%
\node[font=\bfseries\Huge] (txt) at (\hsp*\n,0){\s};%
}%
在末尾查看预期结果第一次尝试下面的部分有一个说明性的例子。
其他最终用途详细信息(以防万一)
此外,如果解决方案能够与上面所示的节点定义兼容,并使用\foreach
逗号分隔的符号列表进行循环,那就太好了,因为我想用pic
它来定义一个 Tikz,以便执行 Tikz 装饰(以便轻松地沿路径重复图案,从这里):
\usetikzlibrary{decorations.markings}
\tikzset{symbols/.pic={%
\foreach \s[count=\n from 0] in {$\blacksquare$,--,B,$\blacksquare$}{%
\node[font=\bfseries\Huge] (txt) at (\hsp*\n,0){\s};%
}},%
inlinesymbols/.style={%
decoration={markings,mark =between positions 0 and 1 step 30mm % adjust step size here
with {\pic {symbols};}},%
postaction={decorate}}%
}%
\begin{document}
\begin{tikzpicture}
\path[inlinesymbols] (0,-1) -- (4,-1);%
\end{tikzpicture}
\end{document}
如果解决方案能够兼容这是 Sandy G' 的\markletters
命令允许从文本字符串生成以逗号分隔的符号列表:
\usepackage{xstring}
\newcommand{\markletters}[1]{\StrLen{#1}[\strlen]\foreach \chr[count=\n from 0] in {1,...,\strlen}{\node[font=\bfseries\Huge] at (\hsp*\n,0){\StrChar{#1}{\chr}};}}%
\tikzset{symbols/.pic={\markletters{$\blacksquare$,--,B,$\blacksquare$}}}%
第一次尝试
谢谢这个漂亮的答案我能够用相同的图像填充整个符号列表(注意:该解决方案似乎仅适用于 jpeg 图像而不适用于 png):
\documentclass{standalone}
\usepackage{environ}
\usepackage{amssymb}% For \blacksquare symbol
\usepackage{tikz}
\usepackage{tikzlings}
\usetikzlibrary{fadings,calc,decorations.pathmorphing}
\NewEnviron{ShadeTikZ}[2][]{\begin{tikzfadingfrompicture}[name=temp]% https://tex.stackexchange.com/a/510465/262081
\begin{scope}[transparent!0,#1]
\BODY
\end{scope}
\end{tikzfadingfrompicture}%
\tikz[#1]{\begin{scope}[local bounding box=X,opacity=0]%
\BODY
\end{scope}
\path[overlay] (X.center) node[opacity=0,inner sep=0pt] (img) {\includegraphics{#2}}
[path fading=temp,fit fading=false,fading transform={shift={(X.center)}}]
let \p1=($(X.north east)-(X.south west)+(0.3,0.3)$),
\p2=($(img.north east)-(img.south west)+(0.3,0.3)$) in
(X.center) node[inner sep=0pt,anchor=center]{\pgfmathsetmacro{\myscale}{max(\x1/\x2,\y1/\y2)}%
\includegraphics[scale=\myscale]{#2}};%
}%
}%
\newcommand{\hsp}{.7}
\begin{document}
\begin{ShadeTikZ}[baseline={(txt.base)}]{example-grid-100x100pt}
\foreach \s[count=\n from 0] in {$\blacksquare$,--,B,$\blacksquare$}{%
\node[font=\bfseries\Huge] (txt) at (\hsp*\n,0){\s};%
}%
\end{ShadeTikZ}
\end{document}
我希望这个结果:
每个符号都用图像的不同部分填充,并且该部分也旋转。