решение1
Вот как это сделать с помощью Tikz
.
Основные идеи:
- нарисуй несколько линий
- добавьте несколько
\node
s для меток ниже \draw
некоторые украшенные дорожки выше- помните соответствующие
coordinate
s для поддержки этих действий - Определите
/.style
s по мере необходимости, чтобы упростить код и вносить изменения параметров только в одном месте - попытка сбалансированного подхода, которому не так уж и сложно следовать новичку, И использование некоторых возможностей пути для более красивого кода
Строки:
Давайте разберем первый.
\draw[bar] (0,0) coordinate (A) -- (1.5,0) coordinate (B) node[a]{$a$};
Представьте себе рисование простой линии, сначала в абсолютных координатах:
\draw (0,0) -- (1.5,0);
Поскольку Tikz
речь идет о путях, которые заканчиваются точкой с запятой ;
, мы могли бы добавить узел, отбрасывая \
перед концом пути. Так что этот добавляет узел с текстом (меткой) после того, как достиг (1.5,0); он принимает текст с некоторым стилем a
, т. е. в математическом режиме $a$
:
\draw (0,0) -- (1.5,0) node[a]{$a$};
Поместите информацию о стиле для линии спереди и оставьте в разделе стилей в начале подробное указание того, что здесь рисовать:
\draw[bar] (0,0) -- (1.5,0) node[a]{$a$};
Наконец, добавьте \coordinate
оператор в путь, чтобы запомнить определенные места, И удалите , \
потому что он все еще находится на том же пути, который нужно нарисовать. Вот и все:
\draw[bar] (0,0) coordinate (A) -- (1.5,0) coordinate (B) node[a]{$a$};
Другие пути сделаны похожими, используя смесь относительных движений --++(1.5,0)
, абсолютных координат и используя знания о минимальной ширине этих узлов, которые были определены здесь как 5 мм. Это можно сделать более систематически, конечно.
Метки ниже:
% ~~~ labels below ~~~~~~~~~~
\node[mth] at (A) {$1$};
\node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};
Это довольно прямолинейно. Первая строка помещает текст $1$
в запомненную позицию (A)
, используя стиль mth
, который немного смещает этот текст вниз по оси Y.
Второй очень похож, за исключением некоторого усложнения, вызванного размещением узла так, $a$
как я это сделал. Поэтому один из способов исправить положение — использовать (C)
и сместить его немного назад (на половину минимальной ширины):
([xshift=-2.5mm]C)
.
Подпорка:
% ~~~ labels above ~~~~
\draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
\draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};
Он объединяет концепции, изложенные выше, используя при этом decorate
, который поставляется tikz-library decorations.pathreplacing
:
- он рисует путь выше (A) до выше (B)
- заменяет его на фигурную скобку
- в синем
- поместив узел посередине и немного выше для $\alpha$.
Стиль-блок:
\begin{tikzpicture}[
a/.style={anchor=west,minimum width=5mm}, % for the node containing "a"
bar/.style={{Bar[]}-{Bar[]}}, % start- and end-tipps as Bars
bar2/.style={-{Bar[]}}, % only end-tipp as bar
mth/.style={yshift=-5mm}, % for placing the math-labels
decoration=brace, % the overbrace
alf/.style={midway,yshift=3mm}, % placing \alpha there
ys/.style={yshift=5mm}, % shortcut for these yshifts
]
По крайней мере, у меня эта часть развивается по ходу дела, например, вот так:
- вспомните часть строки, описанную выше
- поместите полезные параметры стиля непосредственно для
draw
иnode
- они слишком длинные? ИЛИ они мне понадобятся как минимум дважды?
- затем переместите их сюда, дав им полезные названия
- так что позже я мог бы легко настроить все эти смещения меток и т.д. прямо здесь
Код:
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}[
a/.style={anchor=west,minimum width=5mm}, % for the node containing "a"
bar/.style={{Bar[]}-{Bar[]}}, % start- and end-tipps as Bars
bar2/.style={-{Bar[]}}, % only end-tipp as bar
mth/.style={yshift=-5mm}, % for placing the math-labels
decoration=brace, % the overbrace
alf/.style={midway,yshift=3mm}, % placing \alpha there
ys/.style={yshift=5mm}, % shortcut for these yshifts
]
% ~~~ lines ~~~~~~~~~~~~
\draw[bar] (0,0) coordinate (A) -- (1.5,0) coordinate (B) node[a]{$a$};
\draw[bar] (2,0) coordinate (C) -- (3.5,0) coordinate (D);
\draw[bar2](3.5,0) --++(1.5,0) coordinate (E) node[a]{$a$};
\draw[bar] (5.5,0) --++(1.5,0) node[a]{$P$};
% ~~~ labels below ~~~~~~~~~~
\node[mth] at (A) {$1$};
\node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};
\node[mth] at (D) {$i - f(i) + 1$};
\node[mth] at ([xshift=+2.5mm]E) {$i + 1$};
% ~~~ labels above ~~~~
\draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
\draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};
\end{tikzpicture}
\end{document}