Як створити хронологію за допомогою LaTeX?


79

У книгах з історії у вас часто є хронологія, де події та періоди позначені на рядку на правильній відносній відстані один від одного. Як можна створити щось подібне в LaTeX?


2
ось моя відповідь: tex.stackexchange.com/questions/183046/… Я сподіваюся, це може допомогти
flav

Відповіді:


47

Tikz пакет , здається, що ви хочете.

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

Я не надто знавець з tikz, але це дає хороший графік, який виглядає так:

введіть тут опис зображення


Результат виглядає добре. Синтаксис не такий простий, як я сподівався, але я думаю, що можу створити кілька команд для спрощення матеріалів. Дякую за цю пропозицію.
Мнемент

75

З’явилася нова хронологія . Леві Вайсман . У документації (pdf) сказано:

Більшість часових шкал та рішень для LATEX використовуються для передачі великої кількості інформації, тому розроблені вертикально. Якщо ви просто намагаєтеся присвоїти мітки датам, більш доречним може бути більш традиційний графік. Для цього призначена хронологія.

Ось приклад коду:

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

Що дає цей результат:

приклад виходу з chronology.sty


2
Слід зазначити, що цей пакет, схоже, підтримує лише одну часову шкалу для кожного документа. Принаймні для мене, я отримую помилку "команда \ c @ вже визначений крок", коли намагаюся мати більше одного.
russellpierce

3
Я намагався змінити файл chronology.sty, щоб отримати вертикальну шкалу часу, але не вдалося. Чи існує його вертикальна версія?
highsciguy

1
Яка упаковка містить \textwidth?
Heath Hunnicutt

1
@KarlRichter спробуйте це посилання
DocBuckets

2
Для тих, у кого виникає помилка "відсутнє число" при складанні цього прикладу, див. Таке запитання: tex.stackexchange.com/questions/233781/… (видалити {3ex}).
badroit

21

Також пакет chronosys забезпечує приємне рішення. Ось приклад з посібника користувача:

введіть тут опис зображення


3
Дякую! дивно, однак, хлопець, який написав документацію, продовжує називати хронологію "фризом", ніби це те саме, що і хронологія. просто помістивши це тут на випадок, якщо хтось ще прочитає документацію.
Джонатан Комар,

1
@JonathanKomar це від французького фрізе, від середньовічного латинського фрізіуму. Це стосується широкої горизонтальної смуги ліпного або розписного оздоблення, а також горизонтальної паперової смужки.
Жорж

15

Просто оновлення.

Цей пакет TiKZ видасть: Пакет tikz Попередження: змій замінено декораціями. Будь ласка, використовуйте декоративні бібліотеки замість бібліотеки змій у рядку введення. . .

Тож відповідну частину коду слід змінити на:

\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


2
Я думаю , що це тепер стало: \usetikzlibrary{decorations.pathmorphing}. Також зробіть, \documentclass[tikz]{standalone}якщо ви хочете, щоб щільно обрізане зображення вставлялося в інший документ.
PatrickT

14

Тім Сторер написав більш гнучкий та приємний вигляд timeline.sty(посилання на Інтернет-архів Wayback Machine, оскільки оригінал зник). Крім того, лінія є горизонтальною, а не вертикальною. Так, наприклад:

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

створює часову шкалу, яка виглядає так:

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

Особисто я вважаю це більш приємним рішенням, ніж інші відповіді. Але я також виявляю, що модифікую код, щоб наблизити щось до того, що, на мою думку, має виглядати шкала часу. Отже, остаточного рішення, на мій погляд, немає.


11

По-перше, я віддаю перевагу tikzкерованому рішенню, оскільки воно дає вам більше свободи. По-друге, я не публікую нічого абсолютно нового. Очевидно, це схоже на відповідь Зої Ганьон, бо він показав дорогу.

Мені знадобився якийсь річний графік, і мені знадобився певний час (який сюрприз!), Щоб зробити це, тому я ділюсь результатами. Сподіваюся, вам сподобається.

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

Як бачите, він пристосований до променівної презентації (виберіть частину, а також параметр масштабу), але якщо ви дійсно хочете протестувати це в презентації, то вам слід перейти \newlength\yearposxза межі визначення кадру, оскільки в іншому випадку ви отримаєте помилку, в якій справді буде зазначено ця команда \yearposxвже визначена (якщо ви не видалите частину виділення та будь-які інші команди розділення кадру зі своєї рамки).

введіть тут опис зображення


дякую за обмін: я додав преамбулу до коду та зображення результату, сподіваюся, ви не проти.
PatrickT

1
@PatrickT: Будь-які покращення у відповідях завжди вітаються, тому, очевидно, я не можу проти. :)
przemoc

2

Якщо ви шукаєте діаграми послідовностей UML, вас може зацікавити pkf-umlsd , який базується на TiKZ. Приємні демонстраційні програми можна знайти тут .


Ні, мене більше цікавив графік, як у книзі історії. Але, тим не менше, UML-діаграми в LaTeX також можуть з'явитися в іншому проекті.
Mnementh

2

Навколо плаває timeline.sty .

Синтаксис простіший, ніж використання 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.

Я використовував python datetime.data.toordinal для перетворення дат у "ключі сортування" в контексті пакету.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.