以圆形排列方式排版直基线

以圆形排列方式排版直基线

我想知道如何设置看到的圆形排列这里如图“(2)”所示,即从中心点向外辐射的一系列直线。

文字的循环排列

到目前为止我能找到的最有用的东西是旋转字母(或多或少是一个彻底的教程)关于这个包。我相信通过和命令的graphicx艰巨组合是可行的,但我希望有人可能知道一个更优雅的解决方案。graphicxhspacevspace

(我本来想问另一种带有圆形基线的类型,但是如何沿圆形路径微调文本的旋转?似乎已经非常彻底地澄清了这一点。)

更新:非常感谢姆维布罗感谢你帮助我完成了大部分工作,并付出了额外的努力来处理希伯来字符!只是想让其他想要提出更多想法的人知道,罗马字符足以满足进一步的例子。

答案1

对于从右到左的语言,装饰并不是那么通用,但下面展示了一种处理方法。它需要使用 进行编译lualatex。也许PSTricks可以做得更好。

另外,我使用的字体freesans在您的系统上可能有,也可能没有。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.text}
\usepackage{fontspec}
\newfontfamily\hebrewfont[Script=Hebrew]{freesans}

\tikzset{
    decorate path with hebrew/.style={
        decoration={
            text along path,
            text={|\luatextextdir TRT\hebrewfont|#1},
        },
        decorate,
    },
    hebrew text/.style={
        font=\hebrewfont, 
        execute at begin node={\luatextextdir TRT}
    }
}

\begin{document}

\begin{tikzpicture}
\path [decorate path with hebrew={מלון אבוקדו מישמש תפוח אבוקדו אבטיח אשכולית גזר}]
    circle [radius=1.25cm];
\foreach \w [count=\i from 0] in {מלון,אבוקדו,מישמש,תפוח,אבוקדו,אבטיח,אשכולית,גזר}
    \node [hebrew text, anchor=west,shift=(\i*45:1.25cm), rotate=\i*45] {\w};

\end{tikzpicture}

\end{document}

在此处输入图片描述

要获取内部基线,reverse path可以将键与装饰一起使用。请注意,此键的成功使用取决于圆的内部路径的绘制方式(即顺时针)。如果使用四个圆弧手动逆时针绘制圆,则reverse path不需要该键(当然,如果装饰引擎的作者足够聪明,他会想出一种方法来自动确定路径的方向 ;-)

我能想到的唯一堆叠字母的方法是粗略地迭代单词的每个字母,我已经使用宏完成了此操作\stackletters。请注意,align关键必须可在选项中使用\node以使堆叠工作。还请注意和旋转的变化anchor

要向另一个方向(即向内)堆叠,请将 更改为anchorsouth并使用rotate=\i*45-90。这可以与样式绑定在一起。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.text}
\usepackage{fontspec}
\newfontfamily\hebrewfont[Script=Hebrew]{freesans}

\tikzset{
    decorate path with hebrew outside/.style={
        postaction={
            decoration={
                text along path,
                text={|\luatextextdir TRT\hebrewfont|#1},
                reverse path, % Make decoration go the other way
            },
            decorate
        }
    },
    hebrew text/.style={
        font=\hebrewfont, 
        execute at begin node={\luatextextdir TRT}
    }
}

\def\stackletters#1{\let\flag=\relax\expandafter\dostackletters#1;}
\def\dostackletters#1{%
    \ifx#1;%
    \else%      
        \ifx\flag\relax%
            #1%
            \let\flag=\stackletters%
        \else%
            \\[-0.25\baselineskip]#1%
        \fi%
        \expandafter\dostackletters%
    \fi}


\begin{document}

\begin{tikzpicture}
\path [decorate path with hebrew outside={מלון אבוקדו מישמש תפוח אבוקדו אבטיח אשכולית גזר}]
    circle [radius=1cm];
\foreach \w [count=\i from 0] in {מלון,אבוקדו,מישמש,תפוח,אבוקדו,אבטיח,אשכולית,גזר}
    \node [hebrew text, align=center, anchor=north, shift=(\i*45:1.25cm), rotate=\i*45+90] {\stackletters{\w}};

\end{tikzpicture}


\end{document}

在此处输入图片描述

因此,根据要求,提供了一个不需要 的带有罗马字符的版本lualatex。堆叠节点内容的代码已略有更改。

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.text}

\tikzset{
    decorate path with text outside/.style={
        postaction={
            decoration={
                text along path,
                text={#1},
                reverse path, % Make decoration go the other way
            },
            decorate
        }
    },
}


\def\stacknodecontents#1\ignorespaces{%
    % #1 contains a whole load of internal TikZ code
    % which terminates with an \ignorespaces
    % (just before the node text begins)
    #1\ignorespaces%
    \let\stacknext=\relax%
    % \expandafter in case the node text is a macro.
    \expandafter\dostacknodecontentslet}

\def\dostacknodecontentslet{%
    \afterassignment\dostacknodecontentstypeset%
    % Need global.
    \global\let\stacktoken=}

\def\dostacknodecontentstypeset{%
    \ifx\stacktoken\egroup% <- the } at the end of the node.
        \let\stacknext=\stacktoken%
    \else%
        % If \stacknext is \relax then \stacktoken is the first
        % token, and does not require a new line.
        \ifx\stacknext\dostacknodecontentslet%
            \\[-0.25\baselineskip]% Should parameterise this.
        \fi%
        \stacktoken%
        \let\stacknext=\dostacknodecontentslet%
    \fi%
    \stacknext}

\tikzset{
    stack node text/.style={
        align=center,
        execute at begin node=\stacknodecontents%
    }
}


\begin{document}


\begin{tikzpicture}
\path [decorate path with text outside={apple banana celary date egg fig grape honey}]
    circle [radius=1.1212cm];
\foreach \w [count=\i from 0] in {apple, banana, celary, date, egg, fig, grape, honey}
    \node [stack node text, anchor=north, shift=(\i*45:1.3636cm), rotate=\i*45+90] {\w};

\end{tikzpicture}


\end{document}

在此处输入图片描述

相关内容