Composição de linhas de base retas em um arranjo circular

Composição de linhas de base retas em um arranjo circular

Eu queria saber como alguém poderia definir o arranjo circular vistoaquina Figura "(2)" - isto é, em uma série de linhas retas irradiando de um ponto central.

arranjo circular de texto

A coisa mais útil que consegui encontrar até agora éGirando uma carta(mais ou menos um tutorial completo) na graphicxembalagem. Tenho certeza de que seria possível com uma combinação assustadoramente árdua de comandos graphicxe hspacee vspace, mas esperava que alguém conhecesse uma solução mais elegante.

(Eu ia perguntar sobre o outro tipo com linhas de base circulares, masComo ajustar a rotação do texto ao longo do caminho circular?parece esclarecer isso bastante extensivamente.)

ATUALIZAR:Muito obrigado asobrancelhapor me levar até lá e se esforçar para fazer isso com caracteres hebraicos! Só queria que qualquer pessoa que queira opinar com ideias adicionais saiba que os caracteres romanos serão suficientes em outros exemplos.

Responder1

As decorações não são tão versáteis quando se trata de idiomas da direita para a esquerda, mas o seguinte mostra uma maneira de proceder. Requer compilação com lualatex. Possivelmente PSTrickspoderia fazer isso melhor.

Além disso, eu uso a fonte freesansque pode ou não estar disponível em seu sistema.

\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}

insira a descrição da imagem aqui

Para obter a linha de base por dentro a reverse pathchave pode ser usada com a decoração. Observe que o uso bem-sucedido desta chave depende de como o caminho é desenhado internamente para o círculo (ou seja, no sentido horário). Se o círculo fosse desenhado manualmente no sentido anti-horário usando quatro arcos, a reverse pathchave seria desnecessária (é claro que se o autor do mecanismo de decoração fosse inteligente o suficiente ele descobriria uma maneira de determinar a direção do caminho automaticamente ;-)

A única maneira que consigo pensar em empilhar as letras é iterar grosseiramente cada letra da palavra, o que fiz com o macro \stackletters. Observe que a alignchavedeveser usado nas \nodeopções para fazer o empilhamento funcionar. Observe também a mudança anchore rotação.

Para empilhar na outra direção (ou seja, para dentro), altere anchorpara southe use rotate=\i*45-90. Isso pode ser vinculado a um estilo.

\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}

insira a descrição da imagem aqui

Assim, conforme solicitado, uma versão com caracteres romanos que não necessita de lualatex. O código para empilhar o conteúdo do nó foi um pouco alterado.

\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}

insira a descrição da imagem aqui

informação relacionada