Как нарисовать диаграммы CS-строк?

Как нарисовать диаграммы CS-строк?

Существует ли специальный пакет для визуализации диаграмм струн (строк CS, а не физических строк), как на рисунке ниже?

диаграмма струны

Альтернативно, как бы вы создали такую ​​фигуру? Можете ли вы привести (очень) минимальный пример?

решение1

Вот как это сделать с помощью Tikz.

Основные идеи:

  • нарисуй несколько линий
  • добавьте несколько \nodes для меток ниже
  • \drawнекоторые украшенные дорожки выше
  • помните соответствующие coordinates для поддержки этих действий
  • Определите /.styles по мере необходимости, чтобы упростить код и вносить изменения параметров только в одном месте
  • попытка сбалансированного подхода, которому не так уж и сложно следовать новичку, И использование некоторых возможностей пути для более красивого кода

результат

Строки:

Давайте разберем первый.

    \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}

Связанный контент