¿Cómo crear una línea de tiempo con LaTeX?

79

En los libros de historia, a menudo tiene una línea de tiempo, donde los eventos y períodos están marcados en una línea a la distancia relativa correcta entre sí. ¿Cómo es posible crear algo similar en LaTeX?

Mnementh
fuente
2
aquí mi respuesta: tex.stackexchange.com/questions/183046/… Espero que pueda ayudar
flav

Respuestas:

46

El paquete tikz parece tener lo que quieres.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{snakes}

\begin{document}

  \begin{tikzpicture}[snake=zigzag, line before snake = 5mm, line after snake = 5mm]
    % draw horizontal line   
    \draw (0,0) -- (2,0);
    \draw[snake] (2,0) -- (4,0);
    \draw (4,0) -- (5,0);
    \draw[snake] (5,0) -- (7,0);

    % draw vertical lines
    \foreach \x in {0,1,2,4,5,7}
      \draw (\x cm,3pt) -- (\x cm,-3pt);

    % draw nodes
    \draw (0,0) node[below=3pt] {$ 0 $} node[above=3pt] {$   $};
    \draw (1,0) node[below=3pt] {$ 1 $} node[above=3pt] {$ 10 $};
    \draw (2,0) node[below=3pt] {$ 2 $} node[above=3pt] {$ 20 $};
    \draw (3,0) node[below=3pt] {$  $} node[above=3pt] {$  $};
    \draw (4,0) node[below=3pt] {$ 5 $} node[above=3pt] {$ 50 $};
    \draw (5,0) node[below=3pt] {$ 6 $} node[above=3pt] {$ 60 $};
    \draw (6,0) node[below=3pt] {$  $} node[above=3pt] {$  $};
    \draw (7,0) node[below=3pt] {$ n $} node[above=3pt] {$ 10n $};
  \end{tikzpicture}

\end{document}

No soy demasiado experto en tikz, pero esto da una buena línea de tiempo, que se ve así:

ingrese la descripción de la imagen aquí

Zoe Gagnon
fuente
La salida se ve bien. La sintaxis no es tan simple como esperaba, pero creo que puedo crear algunos comandos para simplificar las cosas. Gracias por esta sugerencia.
Mnementh
75

Hay una nueva cronología de Levi Wiseman . La documentación (pdf) dice:

La mayoría de los paquetes de línea de tiempo y las soluciones para LATEX se utilizan para transmitir mucha información y, por lo tanto, están diseñados verticalmente. Si solo está intentando asignar etiquetas a las fechas, una línea de tiempo más tradicional podría ser más apropiada. Para eso es la cronología.

Aquí hay un código de ejemplo:

\documentclass{article}
\usepackage{chronology}
\begin{document}

\begin{chronology}[5]{1983}{2010}{3ex}[\textwidth]
\event{1984}{one}
\event[1985]{1986}{two}
\event{\decimaldate{25}{12}{2001}}{three}
\end{chronology}

\end{document}

Que produce esta salida:

ejemplo de salida de chronology.sty

nibot
fuente
2
Cabe señalar que este paquete parece admitir solo una línea de tiempo por documento. Al menos para mí, aparece el error "comando \ c @ paso ya definido" cuando intento tener más de uno.
russellpierce
3
Traté de modificar el archivo chronology.sty para obtener una línea de tiempo vertical, pero no tuve éxito. ¿Existe una versión vertical?
highsciguy
1
¿Qué paquete contiene \textwidth?
Heath Hunnicutt
1
@KarlRichter prueba este enlace
DocBuckets
2
Para aquellos que experimentan un error de "número faltante" al compilar este ejemplo, consulte la siguiente pregunta: tex.stackexchange.com/questions/233781/… (eliminar {3ex}).
Badroit
21

Además, el paquete chronosys ofrece una buena solución. Aquí hay un ejemplo del manual del usuario:

ingrese la descripción de la imagen aquí

Alessandro Cuttin
fuente
3
¡Gracias! Aunque es extraño, el tipo que escribió la documentación sigue llamando a la línea de tiempo un "friso" como si eso fuera lo mismo que una línea de tiempo. simplemente poniendo eso aquí en caso de que alguien más lea la documentación.
Jonathan Komar
1
@JonathanKomar es de frise francés, del frisium medieval latino. Se refiere a una amplia banda horizontal de decoración esculpida o pintada, o también a una tira de papel horizontal.
Georges
15

Solo una actualización.

El paquete actual de TiKZ emitirá: Paquete tikz Advertencia: Las serpientes han sido reemplazadas por decoraciones. Utilice las bibliotecas de decoración en lugar de la biblioteca de serpientes en la línea de entrada. . .

Entonces, la parte correspondiente del código debe cambiarse a:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations}
\begin{document}
\begin{tikzpicture}
%draw horizontal line
\draw (0,0) -- (2,0);
\draw[decorate,decoration={snake,pre length=5mm, post length=5mm}] (2,0) -- (4,0);
\draw (4,0) -- (5,0);
\draw[decorate,decoration={snake,pre length=5mm, post length=5mm}] (5,0) -- (7,0);

%draw vertical lines
\foreach \x in {0,1,2,4,5,7}
\draw (\x cm,3pt) -- (\x cm,-3pt);

%draw nodes
\draw (0,0) node[below=3pt] {$ 0 $} node[above=3pt] {$   $};
\draw (1,0) node[below=3pt] {$ 1 $} node[above=3pt] {$ 10 $};
\draw (2,0) node[below=3pt] {$ 2 $} node[above=3pt] {$ 20 $};
\draw (3,0) node[below=3pt] {$  $} node[above=3pt] {$  $};
\draw (4,0) node[below=3pt] {$ 5 $} node[above=3pt] {$ 50 $};
\draw (5,0) node[below=3pt] {$ 6 $} node[above=3pt] {$ 60 $};
\draw (6,0) node[below=3pt] {$  $} node[above=3pt] {$  $};
\draw (7,0) node[below=3pt] {$ n $} node[above=3pt] {$ 10n $};
\end{tikzpicture}

\end{document}

HTH

Cesar Rabak
fuente
2
Creo que esto se ha convertido en: \usetikzlibrary{decorations.pathmorphing}. Además, hágalo \documentclass[tikz]{standalone}si desea insertar una imagen muy recortada en otro documento.
PatrickT
14

Tim Storer escribió uno más flexible y de mejor apariencia timeline.sty(enlace de Internet Archive Wayback Machine, ya que el original ya no existe). Además, la línea es horizontal en lugar de vertical. Entonces, por ejemplo:

\begin{timeline}{2008}{2010}{50}{250}
  \MonthAndYearEvent{4}{2008}{First Podcast}
  \MonthAndYearEvent{7}{2008}{Private Beta}
  \MonthAndYearEvent{9}{2008}{Public Beta}
  \YearEvent{2009}{IPO?}
\end{timeline}

produce una línea de tiempo que se ve así:

2008                              2010
 · · April, 2008 First Podcast    ·
       · July, 2008 Private Beta
           · September, 2008 Public Beta
                · 2009 IPO?

Personalmente, encuentro esta solución más agradable que las otras respuestas. Pero también me encuentro modificando el código para acercarme a lo que creo que debería ser una línea de tiempo. Entonces no hay una solución definitiva en mi opinión.

Jon Ericson
fuente
11

Primero, prefiero tikz solución guiada, porque te da más libertad. En segundo lugar, no voy a publicar nada totalmente nuevo. Obviamente, es similar a la respuesta de Zoe Gagnon, porque mostró el camino.

Necesitaba un cronograma de un año y me tomó algo de tiempo (¡qué sorpresa!) Hacerlo, así que estoy compartiendo los resultados. Espero que te guste.

\documentclass[tikz]{standalone}
\usepackage{verbatim}
\begin{document}
\newlength\yearposx
\begin{tikzpicture}[scale=0.57] % timeline 1990-2010->
    % define coordinates (begin, used, end, arrow)
    \foreach \x in {1990,1992,2000,2002,2004,2005,2008,2009,2010,2011}{
        \pgfmathsetlength\yearposx{(\x-1990)*1cm};
        \coordinate (y\x)   at (\yearposx,0);
        \coordinate (y\x t) at (\yearposx,+3pt);
        \coordinate (y\x b) at (\yearposx,-3pt);
    }
    % draw horizontal line with arrow
    \draw [->] (y1990) -- (y2011);
    % draw ticks
   \foreach \x in {1992,2000,2002,2004,2005,2008,2009}
        \draw (y\x t) -- (y\x b);
    % annotate
    \foreach \x in {1992,2002,2005,2009}
        \node at (y\x) [below=3pt] {\x};
    \foreach \x in {2000,2004,2008}
        \node at (y\x) [above=3pt] {\x};
    \begin{comment}
    % for use in beamer class
    \only<2>    {\fill      (y1992) circle (5pt);}
    \only<3-5>  {\fill      (y2000) circle (5pt);}
    \only<4-5>  {\fill      (y2002) circle (5pt);}
    \only<5>    {\fill[red] (y2004) circle (5pt);}
    \only<6>    {\fill      (y2005) circle (5pt);}
    \only<7>    {\fill[red] (y2005) circle (5pt);}
    \only<8-11> {\fill      (y2008) circle (5pt);}
    \only<11>   {\fill      (y2009) circle (5pt);}
    \end{comment}
\end{tikzpicture}
\end{document}

Como puede ver, está adaptado a la presentación del proyector (seleccione la parte y también la opción de escala), pero si realmente desea probarlo en una presentación, entonces debe moverse \newlength\yearposxfuera de la definición del marco, porque de lo contrario obtendrá un error que indique verdaderamente ese comando \yearposxya está definido (a menos que elimine la parte de selección y cualquier otro comando de división de cuadros de su cuadro).

ingrese la descripción de la imagen aquí

przemoc
fuente
gracias por compartir: agregué un preámbulo al código y una imagen de la salida, espero que no te importe.
PatrickT
1
@PatrickT: Cualquier mejora en las respuestas siempre es bienvenida, así que obviamente no me importa. :)
przemoc
2

Si está buscando diagramas de secuencia UML, es posible que le interese pkf-umlsd , que se basa en TiKZ. Se pueden encontrar buenas demostraciones aquí .

wr.
fuente
No, estaba más interesado en una línea de tiempo como en un libro de historia. Pero gracias, no obstante, los diagramas UML en LaTeX pueden aparecer también en otro proyecto.
Mnementh
2

Hay timeline.sty flotando alrededor.

La sintaxis es más simple que usar tikz:

%%% In LaTeX:
%%% \begin{timeline}{length}(start,stop)
%%%   .
%%%   .
%%%   .
%%% \end{timeline}
%%%
%%% in plain TeX
%%% \timeline{length}(start,stop)
%%%   .
%%%   .
%%%   .
%%% \endtimeline
%%% in between the two, we may have:
%%% \item{date}{description}
%%% \item[sortkey]{date}{description}
%%% \optrule
%%%
%%% the options to timeline are:
%%%      length The amount of vertical space that the timeline should
%%%                use.
%%%      (start,stop) indicate the range of the timeline. All dates or
%%%                sortkeys should lie in the range [start,stop]
%%%
%%% \item without the sort key expects date to be a number (such as a
%%%      year).
%%% \item with the sort key expects the sort key to be a number; date
%%%      can be anything. This can be used for log scale time lines
%%%      or dates that include months or days.
%%% putting \optrule inside of the timeline environment will cause a
%%%      vertical rule to be drawn down the center of the timeline.

He usado datetime.data.toordinal de python para convertir fechas en 'claves de clasificación' en el contexto del paquete.

saffsd
fuente