Как создать временную шкалу с LaTeX?


80

В учебниках истории часто бывает шкала времени, где события и периоды отмечены на линии на правильном относительном расстоянии друг от друга. Как можно создать что-то подобное в LaTeX?


3
вот мой ответ: tex.stackexchange.com/questions/183046/… Надеюсь, это может помочь
flav

Ответы:


48

В пакете 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, но это дает хороший график, который выглядит так:

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


Результат выглядит хорошо. Синтаксис не так прост, как я надеялся, но я думаю, что могу создать несколько команд, чтобы упростить работу. Спасибо за это предложение.
Mnementh

76

Существует новая chronology.sty по Леви Уайзман . В документации (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 @ step уже определена», когда пытаюсь использовать более одного.
russellpierce

3
Я попытался изменить файл chronology.sty, чтобы получить вертикальную временную шкалу, но безуспешно. Есть ли у него вертикальная версия?
highsciguy

1
Что входит в пакет \textwidth?
Хит Ханникатт,

1
@KarlRichter попробуйте эту ссылку
DocBuckets

2
Тем, кто столкнулся с ошибкой «отсутствующий номер» при компиляции этого примера, см. Следующий вопрос: tex.stackexchange.com/questions/233781/… (удалить {3ex}).
badroit

22

Также хорошим решением является пакет chronosys . Вот пример из руководства пользователя:

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


3
благодаря! как ни странно, парень, который написал документацию, продолжает называть временную шкалу «фризом», как будто это то же самое, что и временная шкала. просто поместите это здесь на случай, если кто-то еще прочитает документацию.
Джонатан Комар

1
@JonathanKomar это от французского фризе, от средневекового латинского frisium. Это широкая горизонтальная полоса скульптурного или раскрашенного декора, а также горизонтальная бумажная полоса.
Жорж

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(ссылка на Internet Archive 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 для преобразования дат в «ключи сортировки» в контексте пакета.


0

Я изо всех сил пытался найти правильный способ создания временной шкалы, что я наконец смог сделать с этой модификацией. Обычно при создании временной шкалы проблема заключалась в том, что я не мог добавить текст, чтобы четко объяснить каждую дату более длинным текстом. Я модифицировал и использовал латексный скрипт @Zoe Gagnon. Не стесняйтесь видеть следующее:

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

К сожалению, более длинные тексты не допускаются. Это будет выглядеть так: визуальное изображение временной шкалы выше

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.