Набор прямых базовых линий в круговом расположении

Набор прямых базовых линий в круговом расположении

Мне было интересно, как можно установить круговое расположение, которое мы видимздесьна рисунке «(2)» — т.е. в виде ряда прямых линий, исходящих из центральной точки.

круговое расположение текста

Самое полезное, что мне удалось найти на данный момент, этоПоворот буквы(более или менее прямое руководство) по graphicxпакету. Я уверен, что это было бы выполнимо с пугающе-трудной комбинацией команд graphicxи hspaceи vspace, но я надеялся, что кто-то может знать более элегантное решение.

(Я собирался спросить о другом типе с круглыми базовыми линиями, ноКак точно настроить вращение текста по круговой траектории?(Похоже, это довольно подробно проясняет этот вопрос.)

ОБНОВЛЯТЬ:Большое спасибоmwibrowза то, что вы в основном помогли мне и приложили дополнительные усилия, чтобы сделать это с еврейскими буквами! Просто хотел, чтобы все, кто захочет высказать дополнительные идеи, знали, что в дальнейших примерах будет достаточно латинских букв.

решение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и вращение.

Чтобы сложить в другом направлении (т. е. внутрь), измените anchorна southи используйте 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}

введите описание изображения здесь

Связанный контент