
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.
Lo más útil que he podido encontrar hasta ahora esGirando una letra(más o menos un tutorial directo) en el graphicx
paquete. Estoy seguro de que sería factible con una combinación tremendamente ardua de comandos graphicx
and hspace
y 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 PSTricks
podría hacer esto mejor.
Además, utilizo la fuente freesans
que 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}
Para conseguir la línea base en el interior reverse path
se 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 path
clave 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 align
clavedebeusarse en las \node
opciones para que el apilamiento funcione. Tenga en cuenta también el cambio anchor
y la rotación.
Para apilar en la otra dirección (es decir, hacia adentro), cambie anchor
a south
y 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}
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}