我想知道如何设置看到的圆形排列这里如图“(2)”所示,即从中心点向外辐射的一系列直线。
到目前为止我能找到的最有用的东西是旋转字母(或多或少是一个彻底的教程)关于这个包。我相信通过和命令的graphicx
艰巨组合是可行的,但我希望有人可能知道一个更优雅的解决方案。graphicx
hspace
vspace
(我本来想问另一种带有圆形基线的类型,但是如何沿圆形路径微调文本的旋转?似乎已经非常彻底地澄清了这一点。)
更新:非常感谢姆维布罗感谢你帮助我完成了大部分工作,并付出了额外的努力来处理希伯来字符!只是想让其他想要提出更多想法的人知道,罗马字符足以满足进一步的例子。
答案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}