在这个答案和这个答案,一种很好的修剪 Ti 的方法钾有人提议将 Z 元素与某些字符的轮廓对齐:使用字符tikzfadingfrompicture
,然后使用该淡化来剪掉轮廓之外的内容。总体而言,这种方法效果很好,但在放大倍数较大的情况下,似乎需要进行一些手动移位才能获得所需的结果。考虑 MWE(由这个问题)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fadings,positioning}
\usepackage{contour}
\contournumber{32}
\begin{tikzfadingfrompicture}[name=5-0]
\node[transparent!0,scale=15] (5) at (0,0) {5};
\end{tikzfadingfrompicture}
\begin{tikzfadingfrompicture}[name=5-1]
\node[transparent!0,scale=15] (5) at (0,0) {5};
\path (5.south) -- ++ (0,-0.1);
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
\node[white,scale=15] (5-1) {\contour{blue}{5}};
\foreach \x in {1,1.2,...,3.4}
\foreach \y in {0.1,0.4,...,4.5}
{
\path[path fading=5-1,fit fading=false]
({\x-2},{\y-2.5}) node {5};
}
\node[above=0pt of 5-1]{contour shifted by hand};
\end{tikzpicture}
~
\begin{tikzpicture}
\node[white,scale=15] (5-0) {\contour{blue}{5}};
\foreach \x in {1,1.2,...,3.4}
\foreach \y in {0.1,0.4,...,4.5}
{
\path[path fading=5-0,fit fading=false]
({\x-2},{\y-2.5}) node {5};
}
\node[above=0pt of 5-0]{contour not shifted};
\draw[thick,red] ([yshift=-1.9cm]5-0.north) circle (1cm and 3pt)
([yshift=-3.1cm]5-0.north) circle (1cm and 3pt)
([yshift=-4.15cm,xshift=-0.75cm]5-0.north) circle (0.3cm and 3pt)
([yshift=-5.2cm]5-0.north) circle (0.5cm and 3pt);
\end{tikzpicture}
\end{document}
左边的轮廓是我所说的期望输出,但它似乎需要在\path (5.south) -- ++ (0,-0.1);
相应的 中进行手动移位才能实现tikzfadingfrompicture
。右边的轮廓没有手动调整,因此存在间隙(用红色标记),以及重叠部分(较难看到,我没有标记)。
问题:为什么会这样?我是不是做了一些明显错误的事情?最重要的是,有没有非手动的方式来解决这个问题?
附加问题: 有没有简单的移动 的方法path fading
,即如果我将大 5 放在任意点而不是 ,就可以使其工作(0,0)
?
答案1
似乎contour
将节点提升了轮廓线宽度的一半,由 指定\contourlength
。在 的代码中,contour
此线宽存储在 中\con@base@length
,因此通过将轮廓节点降低该值的一半,小 5 和轮廓 5 应该对齐。测试(我还包含一个比例为 10 且(未缩放)轮廓宽度为 0.7pt 的测试):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fadings,positioning}
\usepackage{contour}
\contournumber{32}
\begin{tikzfadingfrompicture}[name=5-0]
\node[transparent!0,scale=15] (5) at (0,0) {5};
\end{tikzfadingfrompicture}
\begin{tikzfadingfrompicture}[name=5-10]
\node[transparent!0,scale=10] (5) at (0,0) {5};
\end{tikzfadingfrompicture}
%%%
\begin{document}
\begin{tikzpicture}
\makeatletter
\node[white,inner sep=1pt,scale=15,yshift=-0.5*\con@base@length] (5-0c) {\contour{blue}{5}};
\makeatother
\foreach \x in {1,1.2,...,3.4}
\foreach \y in {0.1,0.4,...,4.5}
{
\path[path fading=5-0,fit fading=false]
({\x-2},{\y-2.5}) node {5};
}
\end{tikzpicture}
\contourlength{0.7pt}
\begin{tikzpicture}
\makeatletter
\node[white,inner sep=1pt,scale=10,yshift=-0.5*\con@base@length] (5-10c) {\contour{blue}{5}};
\makeatother
\foreach \x in {1,1.2,...,3.4}
\foreach \y in {0.1,0.4,...,4.5}
{
\path[path fading=5-10,fit fading=false]
({\x-2},{\y-2.5}) node {5};
}
\end{tikzpicture}
\end{document}
节点被提升了一半轮廓线的原因是如何contour
设置文本周围的框。从
\fboxsep=0pt
\fbox{\Huge A}\fbox{\contour{red}{\color{white}\Huge A}}
可以看到它被降低到文本下方,但高度(或宽度)没有增加。当将其放入节点中时,它会居中对齐,轮廓文本将提升一半的线宽。
\begin{tikzpicture}[node distance=0pt]
\node[inner sep=0pt] (A) {\fbox{\Huge A}};
\node[inner sep=0pt,right=of A] (Acol) {\fbox{\contour{red}{\color{white}\Huge A}}};
\fill[green] (A) circle (1pt);
\fill[green] (Acol) circle (1pt);
\end{tikzpicture}