
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.
A coisa mais útil que consegui encontrar até agora éGirando uma carta(mais ou menos um tutorial completo) na graphicx
embalagem. Tenho certeza de que seria possível com uma combinação assustadoramente árdua de comandos graphicx
e hspace
e 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 PSTricks
poderia fazer isso melhor.
Além disso, eu uso a fonte freesans
que 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}
Para obter a linha de base por dentro a reverse path
chave 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 path
chave 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 align
chavedeveser usado nas \node
opções para fazer o empilhamento funcionar. Observe também a mudança anchor
e rotação.
Para empilhar na outra direção (ou seja, para dentro), altere anchor
para south
e 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}
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}