字符轮廓出现不必要的偏移

字符轮廓出现不必要的偏移

这个答案这个答案,一种很好的修剪 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}

在此处输入图片描述

相关内容