
Мне было интересно, как можно установить круговое расположение, которое мы видимздесьна рисунке «(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}