Wie erstelle ich eine Zeitleiste mit LaTeX?

79

In Geschichtsbüchern gibt es häufig eine Zeitleiste, in der Ereignisse und Perioden in einer Linie im richtigen relativen Abstand zueinander markiert sind. Wie ist es möglich, in LaTeX etwas Ähnliches zu erstellen?

Mnementh
quelle
2
hier meine Antwort: tex.stackexchange.com/questions/183046/… Ich hoffe, es könnte helfen
Flav

Antworten:

46

Das Tikz- Paket scheint das zu haben, was Sie wollen.

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

Ich bin nicht zu erfahren mit Tikz, aber dies gibt eine gute Zeitleiste, die aussieht wie:

Geben Sie hier die Bildbeschreibung ein

Zoe Gagnon
quelle
Die Ausgabe sieht gut aus. Die Syntax ist nicht so einfach wie ich gehofft habe, aber ich denke, ich kann einige Befehle erstellen, um das Zeug zu vereinfachen. Vielen Dank für diesen Vorschlag.
Mnementh
75

Es gibt eine neue Chronologie von Levi Wiseman . Die Dokumentation (pdf) sagt:

Die meisten Timeline-Pakete und -Lösungen für LATEX werden zur Übermittlung vieler Informationen verwendet und sind daher vertikal gestaltet. Wenn Sie nur versuchen, Datumsangaben Beschriftungen zuzuweisen, ist möglicherweise eine traditionellere Zeitachse besser geeignet. Dafür ist Chronologie da.

Hier ist ein Beispielcode:

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

Welches erzeugt diese Ausgabe:

Beispielausgabe von chronology.sty

Nibot
quelle
2
Es ist zu beachten, dass dieses Paket anscheinend nur eine Zeitleiste pro Dokument unterstützt. Zumindest für mich erhalte ich den Fehler "Befehl \ c @ Schritt bereits definiert", wenn ich versuche, mehr als einen zu haben.
Russellpierce
3
Ich habe versucht, die Datei chronology.sty zu ändern, um eine vertikale Zeitleiste zu erhalten, aber es ist mir nicht ganz gelungen. Gibt es eine vertikale Version davon?
Highsciguy
1
Welches Paket enthält \textwidth?
Heath Hunnicutt
1
@ KarlRichter versuchen Sie diesen Link
DocBuckets
2
Informationen zum Fehler beim Kompilieren dieses Beispiels finden Sie in der folgenden Frage: tex.stackexchange.com/questions/233781/… (entfernen {3ex}).
Badroit
21

Auch das Paket chronosys bietet eine schöne Lösung. Hier ist ein Beispiel aus dem Benutzerhandbuch:

Geben Sie hier die Bildbeschreibung ein

Alessandro Cuttin
quelle
3
Vielen Dank! Seltsamerweise nennt der Typ, der die Dokumentation geschrieben hat, die Timeline immer wieder einen "Fries", als wäre das dasselbe wie eine Timeline. Setzen Sie das hier ein, falls jemand anderes die Dokumentation liest.
Jonathan Komar
@ Jonathan Komar ist aus Französisch Frise, aus dem mittelalterlichen lateinischen Frisium. Es bezieht sich auf ein breites horizontales Band aus skulptierter oder bemalter Dekoration oder auch auf einen horizontalen Papierstreifen.
Georges
15

Nur ein Update.

Das vorliegende TiKZ-Paket wird Folgendes herausgeben: Paket tikz Warnung: Schlangen wurden durch Dekorationen ersetzt. Bitte verwenden Sie die Dekorationsbibliotheken anstelle der Schlangenbibliothek in der Eingabezeile. . .

Der zugehörige Teil des Codes muss also geändert werden in:

\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
quelle
2
Ich denke das ist jetzt geworden : \usetikzlibrary{decorations.pathmorphing}. Tun \documentclass[tikz]{standalone}Sie dies auch, wenn Sie ein eng zugeschnittenes Bild in ein anderes Dokument einfügen möchten.
PatrickT
14

Tim Storer hat einen flexibleren und schöneren Look geschrieben timeline.sty(Link zur Internet Archive Wayback Machine, da das Original weg ist). Außerdem ist die Linie eher horizontal als vertikal. Also zum Beispiel:

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

erzeugt eine Zeitleiste, die folgendermaßen aussieht:

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

Persönlich finde ich dies eine angenehmere Lösung als die anderen Antworten. Aber ich ändere auch den Code, um etwas näher an das zu bringen, was meiner Meinung nach eine Zeitleiste aussehen sollte. Meiner Meinung nach gibt es also keine endgültige Lösung.

Jon Ericson
quelle
11

Erstens bevorzuge ich eine tikzgeführte Lösung, weil sie Ihnen mehr Freiheit gibt. Zweitens poste ich nichts völlig Neues. Es ist offensichtlich ähnlich wie Zoe Gagnons Antwort, weil er den Weg zeigte.

Ich brauchte einige Jahre Zeit und es dauerte einige Zeit (was für eine Überraschung!), Um dies zu tun, also teile ich die Ergebnisse. Ich hoffe du wirst es mögen.

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

Wie Sie sehen können, ist es auf die Beamer-Präsentation zugeschnitten (Teil auswählen und auch Skalierungsoption). Wenn Sie es jedoch wirklich in einer Präsentation testen möchten, sollten Sie sich \newlength\yearposxaußerhalb der Rahmendefinition bewegen , da Sie sonst nachweislich Fehler erhalten Dieser Befehl \yearposxist bereits definiert (es sei denn, Sie entfernen den Auswahlteil und andere Frame-Splitting-Befehle aus Ihrem Frame).

Geben Sie hier die Bildbeschreibung ein

przemoc
quelle
Vielen Dank für das Teilen: Ich habe dem Code eine Präambel und ein Bild der Ausgabe hinzugefügt. Ich hoffe, es macht Ihnen nichts aus.
PatrickT
1
@PatrickT: Verbesserungen in den Antworten sind immer willkommen, daher kann ich das natürlich nicht stören. :)
przemoc
2

Wenn Sie nach UML-Sequenzdiagrammen suchen, könnte Sie pkf-umlsd interessieren , das auf TiKZ basiert. Schöne Demos finden Sie hier .

wr.
quelle
Nein, ich interessierte mich mehr für eine Zeitleiste wie für ein Geschichtsbuch. Trotzdem können UML-Diagramme in LaTeX auch in einem anderen Projekt auftauchen.
Mnementh
2

Es schwebt timeline.sty herum.

Die Syntax ist einfacher als die Verwendung von 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.

Ich habe die datetime.data.toordinal von Python verwendet, um Datumsangaben im Kontext des Pakets in 'Sortierschlüssel' zu konvertieren.

saffsd
quelle