¿Cómo puedo dibujar diagramas de cadenas CS?

¿Cómo puedo dibujar diagramas de cadenas CS?

¿Existe un paquete específico para representar diagramas de cadenas (cadenas de CS, no cadenas de física) como la siguiente figura?

diagrama de cuerdas

Alternativamente, ¿cómo crearías esa figura? ¿Puede darnos un ejemplo (muy) mínimo?

Respuesta1

Aquí tienes una forma de hacerlo con Tikz.

Ideas básicas:

  • dibuja algunas líneas
  • Pon algunas \nodes para las etiquetas a continuación.
  • \drawalgunos caminos decorados arriba
  • recordar coordinatelas relevantes para apoyar estas acciones
  • defina /.styles a medida que avanza para simplificar el código y realizar cambios de parámetros en un solo lugar
  • probar un enfoque equilibrado, que no es demasiado difícil de seguir como principiante Y usar algunas características de ruta para obtener un código más agradable

resultado

Líneas:

Digamos el primero.

    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};

Piense en dibujar una línea simple, primero en coordenadas absolutas:

    \draw (0,0) -- (1.5,0);

Debido a que Tikzse trata de rutas, que terminan con un punto y coma ;, podríamos agregar un nodo y eliminarlo \antes de que finalice la ruta. Entonces este pone un nodo con texto (etiqueta) después de haber llegado a (1.5,0); acepta texto con cierto estilo a, es decir, en modo matemático $a$:

    \draw (0,0) -- (1.5,0) node[a]{$a$};

Coloque la información de estilo para la línea al frente Y déjela en la sección de estilo al principio para especificar en detalle qué dibujar aquí:

    \draw[bar] (0,0) -- (1.5,0) node[a]{$a$};

Finalmente agregue la \coordinatedeclaración en la ruta, para recordar ciertas ubicaciones, Y suéltela \porque todavía está en la misma ruta para dibujar. Ahí tienes:

    \draw[bar] (0,0) coordinate (A) -- (1.5,0)  coordinate (B) node[a]{$a$};

Los otros caminos se hacen similares, usando una combinación de movimientos relativos --++(1.5,0), coordenadas absolutas y usando conocimiento sobre el ancho mínimo de esos nodos que se han definido aquí como 5 mm. Sin duda, esto se puede hacer de forma más sistemática.

Etiquetas a continuación:

    % ~~~ labels below ~~~~~~~~~~
    \node[mth] at                (A) {$1$};
    \node[mth] at ([xshift=-2.5mm]C) {$f(i) + 1$};

Esto es bastante sencillo. La primera línea coloca el texto $1$en la posición recordada (A), usando estilo mth, lo que desplaza ese texto un poco hacia abajo en la dirección y.

El segundo es muy similar, además de alguna complicación que introduce al poner el nodo como $a$lo hice yo. Entonces, una forma de corregir la posición es usarla (C)y desplazarla un poco hacia atrás (la mitad del ancho mínimo):

([xshift=-2.5mm]C).

Overbrace:

    % ~~~ labels above ~~~~
    \draw[decorate,blue] ([ys]A) -- ([ys]B) node[alf]{$\alpha$};
    \draw[decorate,blue] ([ys]D) -- ([ys]E) node[alf]{$\alpha$};

Combina conceptos anteriores, mientras usa decorate, que es proporcionado por la biblioteca tikz decorations.pathreplacing:

  • dibuja un camino desde arriba (A) hasta arriba (B)
  • lo reemplaza por un aparato ortopédico
  • en azul
  • poniendo un nodo a mitad de camino y un poco arriba para $\alpha$.

Bloque de estilo:

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

Al menos para mí, esta parte se desarrolla a medida que avanzo, por ejemplo, así:

  • recordar la parte de la línea descrita anteriormente
  • poner opciones de estilo útiles directamente para drawynode
  • ¿son demasiado largos? ¿O los necesitaré al menos dos veces?
  • luego muévelos aquí, con algunos nombres útiles
  • Luego podría ajustar fácilmente todos esos cambios de etiquetas, etc. aquí mismo.

Código:

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

información relacionada