Jak stworzyć oś czasu za pomocą LaTeX?

80

W podręcznikach historii często masz oś czasu, na której wydarzenia i okresy są zaznaczone na linii we właściwej odległości od siebie. Jak można stworzyć coś podobnego w LaTeX?

Mnementh
źródło
3
tutaj moja odpowiedź: tex.stackexchange.com/questions/183046/ ... Mam nadzieję, że to pomoże
smak

Odpowiedzi:

49

TikZ pakiet wydaje się mieć, co chcesz.

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

Nie jestem zbyt ekspertem w zakresie tikz, ale daje to dobrą oś czasu, która wygląda następująco:

wprowadź opis obrazu tutaj

Zoe Gagnon
źródło
Wynik wygląda dobrze. Składnia nie jest tak prosta, jak się spodziewałem, ale myślę, że mogę stworzyć kilka poleceń, aby uprościć wszystko. Dziękuję za tę sugestię.
Mnementh
76

Jest nowa chronologia .sty autorstwa Levi Wisemana . Dokumentacja (pdf) mówi:

Większość pakietów i rozwiązań dotyczących osi czasu dla LATEX służy do przekazywania wielu informacji i dlatego jest projektowana pionowo. Jeśli próbujesz tylko przypisać etykiety do dat, bardziej odpowiednia może być bardziej tradycyjna oś czasu. Po to jest chronologia.

Oto przykładowy kod:

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

Który generuje ten wynik:

przykładowe wyjście z chronology.sty

nibot
źródło
2
Należy zauważyć, że ten pakiet wydaje się obsługiwać tylko jedną oś czasu na dokument. Przynajmniej dla mnie pojawia się błąd „polecenie \ c @ krok już zdefiniowane”, gdy próbuję mieć więcej niż jeden.
russellpierce
3
Próbowałem zmodyfikować plik chronology.sty, aby uzyskać pionową oś czasu, ale nie udało mi się. Czy istnieje wersja pionowa?
highsciguy
1
Jaki pakiet zawiera \textwidth?
Heath Hunnicutt
1
@KarlRichter wypróbuj ten link
DocBuckets
2
Jeśli podczas kompilowania tego przykładu występuje błąd „brakującego numeru”, zobacz następujące pytanie: tex.stackexchange.com/questions/233781/… (usuń {3ex}).
badroit
22

Również pakiet chronosys zapewnia ładne rozwiązanie. Oto przykład z instrukcji obsługi:

wprowadź opis obrazu tutaj

Alessandro Cuttin
źródło
3
dzięki! dziwne jednak, że facet, który napisał dokumentację, wciąż nazywa oś czasu „fryzem”, jakby to było to samo, co oś czasu. umieszczając to tutaj na wypadek, gdyby ktoś inny czytał dokumentację.
Jonathan Komar
1
@JonathanKomar pochodzi z francuskiego frise, ze średniowiecznego łacińskiego frisium. Odnosi się do szerokiego poziomego pasma rzeźbionej lub malowanej dekoracji lub też poziomego paska papieru.
Georges
15

Tylko aktualizacja.

Obecny pakiet TiKZ wyda: Pakiet tikz Ostrzeżenie: Węże zostały zastąpione dekoracjami. Proszę używać bibliotek dekoracji zamiast biblioteki węży w linii wejściowej. . .

Zatem odpowiednia część kodu musi zostać zmieniona na:

\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
źródło
2
Myślę, że to stało się obecnie: \usetikzlibrary{decorations.pathmorphing}. Zrób również, \documentclass[tikz]{standalone}jeśli chcesz, aby mocno przycięty obraz został wstawiony do innego dokumentu.
PatrickT,
14

Tim Storer napisał bardziej elastyczny i ładniejszy wygląd timeline.sty(łącze Internet Archive Wayback Machine, ponieważ oryginał zniknął). Ponadto linia jest raczej pozioma niż pionowa. Na przykład:

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

tworzy oś czasu, która wygląda następująco:

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

Osobiście uważam to za bardziej przyjemne rozwiązanie niż inne odpowiedzi. Ale czuję też, że modyfikuję kod, aby zbliżyć się do tego, jak moim zdaniem powinna wyglądać oś czasu. Więc moim zdaniem nie ma ostatecznego rozwiązania.

Jon Ericson
źródło
11

Po pierwsze wolę tikzrozwiązanie z przewodnikiem, ponieważ daje Ci większą swobodę. Po drugie, nie publikuję niczego zupełnie nowego. Jest to oczywiście podobne do odpowiedzi Zoe Gagnon, ponieważ wskazał drogę.

Potrzebowałem kalendarza na jakiś rok i zajęło mi to trochę czasu (co za niespodzianka!), Aby to zrobić, więc dzielę się wynikami. Mam nadzieję że to polubisz.

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

Jak widać, jest dostosowany do prezentacji beamer (wybierz część, a także opcję skalowania), ale jeśli naprawdę chcesz to przetestować w prezentacji, powinieneś wyjść \newlength\yearposxpoza definicję ramki, ponieważ w przeciwnym razie pojawi się błąd o istnieniu to polecenie \yearposxjest już zdefiniowane (chyba że usuniesz część zaznaczenia i wszelkie inne polecenia podziału ramki z ramki).

wprowadź opis obrazu tutaj

przemoc
źródło
dzięki za udostępnienie: dodałem preambułę do kodu i obraz wyniku, mam nadzieję, że nie masz nic przeciwko.
PatrickT,
1
@PatrickT: Wszelkie ulepszenia odpowiedzi są zawsze mile widziane, więc oczywiście nie mam nic przeciwko. :)
przemoc
2

Jeśli szukasz diagramów sekwencji UML, możesz być zainteresowany pkf-umlsd , który jest oparty na TiKZ. Ładne dema można znaleźć tutaj .

wr.
źródło
Nie, bardziej interesowała mnie oś czasu, jak w książce do historii. Niemniej jednak dzięki, diagramy UML w LaTeX mogą pojawić się również w innym projekcie.
Mnementh
2

Wokół unosi się timeline.sty .

Składnia jest prostsza niż przy użyciu 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.

Użyłem pliku datetime.data.toordinal Pythona do konwersji dat na „klucze sortowania” w kontekście pakietu.

saffsd
źródło
0

Starałem się znaleźć właściwy sposób na stworzenie osi czasu, co w końcu mógłbym zrobić z tą modyfikacją. Zwykle podczas tworzenia osi czasu problem polegał na tym, że nie mogłem dodać tekstu, aby jasno wyjaśnić każdą datę za pomocą dłuższego tekstu. Zmodyfikowałem i dalej wykorzystałem lateksowy skrypt @Zoe Gagnon. Zapraszamy do zapoznania się z następującymi informacjami:

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

\begin{document}
    
\begin{center}
    \begin{tikzpicture}
        % draw horizontal line   
        \draw (-5,0) -- (6,0);
    
    
    % draw vertical lines
    \foreach \x in {-5,-4,-3,-2, -1,0,1,2}
    \draw (\x cm,3pt) -- (\x cm,-3pt);
    
    % draw nodes
    \draw (-5,0) node[below=3pt] {$ 0 $} node[above=3pt] {$  $};
    \draw (-4,0) node[below=3pt] {$ 1 $} node[above=3pt] {$\begin{turn}{45}
            All individuals vote
        \end{turn}$};
    \draw (-3,0) node[below=3pt] {$ 2 $} node[above=3pt] {$\begin{turn}{45} 
        Policy vector decided
        \end{turn}$};
    \draw (-2,0) node[below=3pt] {$ 3 $} node[above=3pt] {$\begin{turn}{45}  Becoming a bureaucrat \end{turn} $};
    \draw (-1,0) node[below=3pt] {$ 4 $} node[above=3pt] {$\begin{turn}{45} Bureaucrats' effort choice \end{turn}$};
    \draw (0,0) node[below=3pt] {$ 5 $} node[above=3pt] {$\begin{turn}{45} Tax evasion decision made \end{turn}$};
    \draw (1,0) node[below=3pt] {$  6$} node[above=3pt] {$\begin{turn}{45} $p(x_{t})$ tax evaders caught \end{turn}$};
    \draw (2,0) node[below=3pt] {$ 7 $} node[above=3pt] {$\begin{turn}{45} $q_{t}$ shirking bureaucrats \end{turn}$};
            \draw (3,0) node[below=3pt] {$ $} node[above=3pt] {$\begin{turn}{45} Public service provided  \end{turn}   $};
\end{tikzpicture}
\end{center} 
\end{document}

Niestety dłuższe teksty nie są dozwolone. Będzie to wyglądać tak:

wizualne przedstawienie powyższej osi czasu

Nurlan Jahangirli
źródło