如何沿圆形路径微调文本的旋转?

如何沿圆形路径微调文本的旋转?

在网上搜索后,终于从这里找到了(重新创建徽标),我找不到我想要的答案。我想旋转圆圈内的文本并完全控制/微调其旋转,我坚持使用“未知”文本,我无法让它进一步向下旋转以获得它集中地与两个黄色和红色矩形对齐,即“未知”的“kn”部分应面向两个矩形之间的白线,如下图所示
在此处输入图片描述

基于以下代码:

\documentclass[12pt]{scrreprt}
\usepackage{courier} %courier font
\usepackage{pgf,tikz,xcolor} % for tikz graphs and colors
\usetikzlibrary{decorations.text} % decorations.text for the text along path feature
\pagestyle{empty} % to suppress page numbers
\begin{document}
\begin{figure}[htbp]
\begin{tikzpicture}
\draw[color=black,fill=yellow,fill opacity=1.0] (2.87,-0.98) -- (2.51,-2.05) -- (4.39,-2.66) -- (4.76,-1.6) -- cycle;% yellow rect
\draw[color=black,fill=red,fill opacity=1.0] (3.23,0.19) -- (5.12,-0.43) -- (4.81,-1.5) -- (2.92,-0.88) -- cycle; %red rect
\draw[double distance=10mm,double=gray,opacity=0.3](0,0) circle (4.4cm); % a double circle
\path [postaction={decorate,decoration={raise=-1ex,text along path, reverse path,text align=center, text={|\ttfamily\huge\color{white}|Text label 1}}}] (-36:4.4cm) arc (-36:216:4.4cm); % commands should be between delimiters || 
\path [postaction={decorate,decoration={raise=-1ex,text along path, reverse path,text align=right, text={|\ttfamily\huge\color{white}|Unknown}}}] (-36:4.4cm) arc (-36:144:4.4cm);
\path [postaction={decorate,decoration={raise=-1ex,text along path,text align=right, text={|\ttfamily\huge\color{white}|Text label 2}}}] (-36:4.4cm) arc (-36:288:4.4cm);  
\end{tikzpicture}
\end{figure}
\end{document}  

也与我的问题相关:
1. 我可以用一个 \path 命令完成所有文本吗?
2. 我可以直接使用圆作为路径沿路径执行文本吗,我的意思是不需要绘制圆弧?
3. 如果可以用几行代码完成,那就太好了。4
. 是否有任何专门的包/tikz(tikz 粉丝!)库来实现对文本的用户友好控制任何云中任意位置的路径?

答案1

文本装饰有些棘手,因为文本被切成字母,并根据底层路径旋转。装饰库有许多选项可用于对齐路径上的文本,例如,它可以根据是否看到空格沿路径分布单词,align={fit to path stretching spaces}或者您可以展开所有字母等。手册对这些选项的介绍非常全面。在这里,您可以使用一个简单的圆圈进行装饰,但存在一些问题。

  1. 您有三组文本需要分开。
  2. 这些组包括空白字符
  3. 圆总是从零角度(最右边的点)开始绘制
  4. 因为圆是一条封闭路径,所以空间拉伸会将最后一个组推向第一个组,认为最后一个组应该移到路径的末尾。因此,第一个组和最后一个组在右侧合并。我们需要在末尾添加一个不可见的元素,后面跟一个空格字符,这样路径就被分成了三部分。

因此,为了解决第一个问题,我们用空格分隔三个词组。

为了解决第二个问题,我们替换了空格之内单词 groups by \spacecommand(后面的空格\space会被吞掉,所以不用担心)。因此 TikZ 看不到空格,但命令会扩展为空格

为了处理第三个问题,我们旋转路径而不是对齐装饰。

为了处理第四个问题,我们放置了一个空格和一个\space命令␣\space

最终结果如下

\documentclass[12pt]{scrreprt}
\usepackage{courier} %courier font
\usepackage{tikz} % for tikz graphs and colors
\usetikzlibrary{decorations.text} % decorations.text for the text along path feature
\pagestyle{empty} % to suppress page numbers

\begin{document}

\begin{tikzpicture}
\draw[color=black,fill=yellow,fill opacity=1.0] (2.87,-0.98) -- (2.51,-2.05) -- (4.39,-2.66) -- (4.76,-1.6) -- cycle;% yellow rect
\draw[color=black,fill=red,fill opacity=1.0] (3.23,0.19) -- (5.12,-0.43) -- (4.81,-1.5) -- (2.92,-0.88) -- cycle; %red rect
%\draw[double distance=10mm,double=gray,opacity=0.3](0,0) circle (4.4cm); % a double circle
\draw [double distance=10mm,
       double=gray,
       draw opacity=0.3,
       rotate=120,
       postaction={
            decorate,
            decoration={
                  raise=-1ex,
                  text along path, 
                  reverse path,
                  text align={fit to path stretching spaces},
                  text={|\ttfamily\huge\color{white}|Text\space label\space 1 Unknown Text\space Label\space 2 \space}
            }
       }
    ] (0,0) circle (4.4cm);
\end{tikzpicture}


\end{document}  

在此处输入图片描述

现在,您可以进一步调整旋转量或在路径末尾插入其他元素来更改间距等。如果您使用draw opacity文本装饰,则不会受到透明度的影响。


编辑:修复同一路径内的文本标签 2 的流向。

\documentclass[12pt]{scrreprt}
\usepackage{courier} %courier font
\usepackage{tikz} % for tikz graphs and colors
\usetikzlibrary{decorations.text} % decorations.text for the text along path feature
\pagestyle{empty} % to suppress page numbers

\begin{document}

\begin{tikzpicture}
\draw[color=black,fill=yellow,fill opacity=1.0] (2.87,-0.98) -- (2.51,-2.05) -- (4.39,-2.66) -- (4.76,-1.6) -- cycle;% yellow rect
\draw[color=black,fill=red,fill opacity=1.0] (3.23,0.19) -- (5.12,-0.43) -- (4.81,-1.5) -- (2.92,-0.88) -- cycle; %red rect
%\draw[double distance=10mm,double=gray,opacity=0.3](0,0) circle (4.4cm); % a double circle
\draw [double distance=10mm,
       double=gray,
       draw opacity=0.3,
       rotate=150,
       postaction={
            decorate,
            decoration={
                  raise=-1ex,
                  text along path, 
                  reverse path,
                  text align={fit to path stretching spaces,right indent=12cm},
                  text={|\ttfamily\huge\color{white}|Text\space label\space 1 Unknown}
            }
       },
       postaction={
            decorate,
            decoration={
                  raise=-1ex,
                  text along path, 
                  %reverse path,
                  text align={left indent=3cm,right indent=9cm},%or right indent=15cm,center
                  text={|\ttfamily\huge\color{white}|Text label 2}
            }
       }
    ] (0,0) circle (4.4cm);
\end{tikzpicture}


\end{document}  

在此处输入图片描述

可以使用right/left indent按键进一步调整

答案2

我不太确定我是否理解了你的问题。以下是我认为可以解决你的问题的方法:

\documentclass[12pt]{scrreprt}
\usepackage{courier} %courier font
\usepackage{pgf,tikz,xcolor} % for tikz graphs and colors
\usetikzlibrary{decorations.text} % decorations.text for the text along path feature
\pagestyle{empty} % to suppress page numbers
\begin{document}
\begin{figure}[htbp]
\begin{tikzpicture}
\draw[color=black,fill=yellow,fill opacity=1.0] (2.87,-0.98) -- (2.51,-2.05) -- (4.39,-2.66) -- (4.76,-1.6) -- cycle;% yellow rect
\draw[color=black,fill=red,fill opacity=1.0] (3.23,0.19) -- (5.12,-0.43) -- (4.81,-1.5) -- (2.92,-0.88) -- cycle; %red rect
\draw[double distance=10mm,double=gray,opacity=0.3](0,0) circle (4.4cm); % a double circle
\path [draw,line width=5pt,red,postaction={decorate,decoration={raise=-1ex,text along path, reverse path,text align=center, text={|\ttfamily\huge\color{white}|Text label 1}}}] (-36:4.4cm) arc (-36:216:4.4cm); % commands should be between delimiters || 
\path [draw,line width=3pt,green,postaction={decorate,decoration={raise=-1ex,text along path, reverse path,text align=right, text={|\ttfamily\huge\color{white}|Unknown}}}] (-36:4.4cm) arc (-36:144:4.4cm);
\path [draw,line width=1pt,blue,postaction={decorate,decoration={raise=-1ex,text along path,text align=right, text={|\ttfamily\huge\color{white}|Text label 2}}}] (-36:4.4cm) arc (-36:288:4.4cm);
\draw(0,0)--(-36:5) node[right]{-36};
\draw(0,0)--(144:5) node[right]{144};
\draw(0,0)--(216:5) node[right]{216};
\draw(0,0)--(288:5) node[right]{288};
\end{tikzpicture}
\end{figure}

\begin{tikzpicture}
\draw[color=black,fill=yellow,fill opacity=1.0] (2.87,-0.98) -- (2.51,-2.05) -- (4.39,-2.66) -- (4.76,-1.6) -- cycle;% yellow rect
\draw[color=black,fill=red,fill opacity=1.0] (3.23,0.19) -- (5.12,-0.43) -- (4.81,-1.5) -- (2.92,-0.88) -- cycle; %red rect
\draw[double distance=10mm,double=gray,opacity=0.3](0,0) circle (4.4cm); % a double circle
\path [draw,line width=5pt,red,postaction={decorate,decoration={raise=-1ex,text along path, reverse path,text align=center, text={|\ttfamily\huge\color{white}|Text label 1}}}] (-36:4.4cm) arc (-36:216:4.4cm); % commands should be between delimiters || 
\path [draw,line width=3pt,green,postaction={decorate,decoration={raise=-1ex,text along path, reverse path,text align=right, text={|\ttfamily\huge\color{white}|Unknown}}}] (-39:4.4cm) arc (-39:144:4.4cm);
\path [draw,line width=1pt,blue,postaction={decorate,decoration={raise=-1ex,text along path,text align=right, text={|\ttfamily\huge\color{white}|Text label 2}}}] (-36:4.4cm) arc (-36:288:4.4cm);
\draw(0,0)--(-36:5) node[right]{-36};
\draw(0,0)--(-39:5) node[right]{-39};
\draw(0,0)--(144:5) node[right]{144};
\draw(0,0)--(216:5) node[right]{216};
\draw(0,0)--(288:5) node[right]{288};
\end{tikzpicture}

\end{document}  

解决方案的变化显而易见

我添加了路径来向您展示差异:

文字“Unknown”沿着右端对齐的绿色路径输入。您将该端设置为 -36°。将其更改为 -39° 可让路径从“kn”面向矩形之间的间隙的位置开始。(我的英语不是很好。也许我理解错了这些词。)

关于在一个路径命令中执行此操作:尝试使用也可以修饰的子路径。我自己还没有尝试过,但是pgf-手册明确地解答了这个问题。

答案3

labelpath 此替代示例使用基于宏的Asymptote 模块PSTricks pstextpath,因此它不适用于 pdfLaTeX。您可以通过更改 shift 参数来调整旋转角度sh。以下文件ring.asy导致ring.epsviaasy ring.asy命令。

import labelpath;
size(150);
guide g=unitcircle;

guide[] ring=(scale(1.15)*unitcircle)^^(scale(0.95)*unitcircle);
fill(ring,evenodd+gray(163/255));

guide g1,g2,g3;
real t0,t1,t2,t3;

real L=arclength(g);

real sh=-0.0135L;

t0=arctime(g,sh+0.0);
t1=arctime(g,sh+L/3);
t2=arctime(g,sh+2L/3);
t3=arctime(g,sh+L);

g1=subpath(g,t0,t1);
g2=subpath(g,t1,t2);
g3=subpath(g,t2,t3);

draw(g1,red);
draw(g2,green);
draw(g3,blue);

pen textpen=gray(1);
labelpath("\texttt{Text label 1}",reverse(g1),LeftJustified,textpen);
labelpath("\texttt{Text label 2}",scale(1.12)*g2,RightJustified,textpen);
labelpath("\texttt{Unknown}",reverse(g3),LeftJustified,textpen);

transform t=rotate(-15)*shift(1,0)*scale(0.4,0.2)*shift(-0.5,-0.5);
guide rbox=t*unitsquare;
pair u=point(rbox,0);
pair v=point(rbox,3);
pair w=(u-v)*1.1; 
guide ybox=shift(w.x,w.y)*rbox;

filldraw(rbox,red,black);
filldraw(ybox,rgb(1,241/255,0),black);

在此处输入图片描述

至于你的问题:

  1. 底部文本的基线与其他两个基线不同,因此即使原则上可以构建这样的路径,但路径分解似乎是一个更简单的选择。

  2. 这个例子没有使用弧,而是使用了路径分解。

  3. 取决于a few线的定义和长度。我认为,您可以将示例中的所有线连接起来得到一行。

  4. 不确定 tikz,但这个例子可以轻松扩展到一般路径,无论如何它都使用圆作为路径(渐近线引导是一种路径)。

相关内容