Рассмотрим MWE ниже, который выводит следующую стрелку
Можно ли согнуть такой узел так, чтобы он выглядел как
(извините за качество, я не фотошопщик). Если возможно, я бы хотел, чтобы шрифт был читабельным, и просто создал стрелку, которая изгибается вправо.
Не знаете ли вы, есть ли какой-нибудь способ?
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows}
\tikzstyle{arrownode}
= [ shape=single arrow
, single arrow head extend=.75em
, single arrow head indent=.25em
, minimum width=3em
, draw
, font=\sc
]
\begin{document}
\begin{tikzpicture}
\node[arrownode] at (0,0) {foobar};
\end{tikzpicture}
\end{document}
решение1
С TikZ v3.00 вы можете использовать нелинейные преобразования, чтобы делать фантастические вещи. Проблема здесь в тексте, так как TikZ также помещает текст узла в поле и надеется на лучшее. И таким образом все в поле подвергается тому же преобразованию, которое TikZ видит в дескрипторе поля (например, добавление \hspace{3cm}
к содержимому узла).
\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows}
\usepgflibrary{curvilinear}
\usepgfmodule{nonlineartransformations}
\tikzset{arrownode/.style={
shape=single arrow,
single arrow head extend=.75em,
single arrow head indent=.25em,
minimum width=3em,
draw,
}
}
\begin{document}
\begin{tikzpicture}
{
\pgfsetcurvilinearbeziercurve
{\pgfpoint{0mm}{30mm}}
{\pgfpoint{15mm}{30mm}}
{\pgfpoint{30mm}{15mm}}
{\pgfpoint{30mm}{0mm}}
\pgftransformnonlinear{%
\pgfpointcurvilinearbezierorthogonal%
{\csname pgf@x\endcsname}%
{\csname pgf@y\endcsname}%
}%
\node[arrownode,transform shape nonlinear=true] at (3,0) {why no rotation?};
}
\end{tikzpicture}
\end{document}
Однако вы можете переключиться на оформление текста, и я не очень внимательно посмотрел, как Марк Виброу закодировал преобразования, но, возможно, вы сможете заставить текст принимать текущую матрицу преобразования (я пока не знаю). Так что если вы замените указанный выше узел на
\node[arrownode,transform shape nonlinear=true] (a) at (3,0) {\phantom{Why not rotating?}};
\path[decoration={text along path,
text={Why not rotating?},
text align=center,
raise=-0.5ex
},postaction={decorate}](a.west) -- (a.east);
ты получишь
Обратите внимание, что точка, в которой вы размещаете узел, имеет значение, поскольку преобразование нелинейно, поэтому в этом примере, чем дальше вы размещаете узел, тем более выраженным будет эффект. И вы можете видеть верхнее белое пространство, выходящее из преобразованного холста. Поиграйте с координатами кривой Безье, и вы получите нелепые результаты :)