Composición tipográfica de líneas de base rectas en una disposición circular

Composición tipográfica de líneas de base rectas en una disposición circular

Me preguntaba cómo se podría establecer la disposición circular vistaaquíen la Figura "(2)", es decir, en una serie de líneas rectas que irradian desde un punto central.

disposición circular del texto

Lo más útil que he podido encontrar hasta ahora esGirando una letra(más o menos un tutorial directo) en el graphicxpaquete. Estoy seguro de que sería factible con una combinación tremendamente ardua de comandos graphicxand hspacey vspace, pero esperaba que alguien conociera una solución más elegante.

(Iba a preguntar sobre el otro tipo con líneas de base circulares, pero¿Cómo ajustar la rotación del texto a lo largo de una trayectoria circular?parece aclarar eso bastante ampliamente.)

ACTUALIZAR:Muchas gracias amwibrow¡Por ayudarme a lograrlo y hacer un esfuerzo adicional para hacerlo con caracteres hebreos! Solo quería que cualquiera que quisiera aportar ideas adicionales supiera que los personajes romanos serán suficientes en más ejemplos.

Respuesta1

Las decoraciones no son tan versátiles cuando se trata de idiomas de derecha a izquierda, pero a continuación se muestra una forma de proceder. Requiere compilación con lualatex. Posiblemente PSTrickspodría hacer esto mejor.

Además, utilizo la fuente freesansque puede estar disponible o no en su 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}

ingrese la descripción de la imagen aquí

Para conseguir la línea base en el interior reverse pathse puede utilizar la llave con la decoración. Tenga en cuenta que el uso exitoso de esta clave depende de cómo se dibuje internamente el camino para el círculo (es decir, en el sentido de las agujas del reloj). Si el círculo se dibujara manualmente en el sentido contrario a las agujas del reloj usando cuatro arcos, la reverse pathclave sería innecesaria (por supuesto, si el autor del motor de decoración fuera lo suficientemente inteligente, encontraría una manera de determinar la dirección del camino automáticamente ;-)

La única forma que se me ocurre de apilar las letras es iterar crudamente sobre cada letra de la palabra, lo cual he hecho con la macro \stackletters. Tenga en cuenta que la alignclavedebeusarse en las \nodeopciones para que el apilamiento funcione. Tenga en cuenta también el cambio anchory la rotación.

Para apilar en la otra dirección (es decir, hacia adentro), cambie anchora southy use rotate=\i*45-90. Esto podría estar vinculado a un 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}

ingrese la descripción de la imagen aquí

Entonces, según lo solicitado, una versión con caracteres romanos que no requiere lualatex. El código para apilar el contenido del nodo se ha cambiado un poco.

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

ingrese la descripción de la imagen aquí

información relacionada