创建一个带有具体日期(十进制日期)作为起点和终点的简约时间线?

创建一个带有具体日期(十进制日期)作为起点和终点的简约时间线?

我想创建一个如下所示的时间线:

在此处输入图片描述

应该可以使用特定日期或十进制日期作为时间线以及事件的起点和终点。几乎就像以下使用该chronology包的示例一样:

\documentclass{scrreprt}
\usepackage{chronology}

\begin{document}

\begin{chronology}[1]{\decimaldate{1}{8}{2016}}{\decimaldate{\day}{\month}{\year}}{\textwidth}
    \event[\decimaldate{1}{8}{2016}]{\decimaldate{31}{12}{2016}}{}
    \event[\decimaldate{1}{8}{2017}]{\decimaldate{31}{12}{2018}}{}
    \event[\decimaldate{25}{1}{2020}]{\decimaldate{\day}{\month}{\year}}{}
\end{chronology}

\end{document}

在此处输入图片描述

这里可以精确指定事件的起点和终点,但不能指定时间线本身。我希望时间线从 2016 年 8 月 1 日开始,到今天(2020 年 5 月 25 日)结束。而且它看起来很笨重,我希望它更简约,就像下面使用包的示例一样chronosys(修改后的版本来自此链接:我如何制定复杂的时间线?):

\documentclass{scrreprt}
\usepackage{chronosys}

\begin{document}
\startchronology[align=left, startyear=2016,stopyear=\year, height=0pt, startdate=false, stopdate=false, dateselevation=0pt, arrow=false, box=true]
%
\chronograduation[event][dateselevation=0pt]{1}
\chronoperiode[color=green, startdate=false, bottomdepth=0pt, topheight=8pt, textdepth=-25pt, stopdate=false]{2016}{2017}{}
\stopchronology
\end{document}

在此处输入图片描述

使用此chronosys包的时间线时,我无法指定确切的日期。使用 decimaldate 或 2016.5 之类的日期时会出错。

我还看到了 moderntimeline 包,它看起来可以解决我的问题,但是在没有 moderncv documentclass 的情况下使用它很困难,如下所示,它看起来不像原始的:没有 moderncv 的情况下如何使用 moderntimeline?

我想坚持使用 scrrepert。

答案1

tikz我仅使用绘图和一些基本计算就解决了我的问题xfp。结果如下:

在此处输入图片描述

\decimaldate命令来自chronosys包,可以使用以下公式来模仿:

在此处输入图片描述

这是我的代码(请注意自定义命令,它基本上与chronosys 包中的命令\decdate相同):\decimaldate

\documentclass{scrreprt}
\usepackage{xfp} % for basic calculations
\usepackage{tikz}

\newcommand{\decdate}[3]{ % convert date to decimal number
    \fpeval{(#1-1)/31/12+(#2-1)/12+#3}
}
\newcommand{\roundup}[1]{\fpeval{ceil(#1)}}
\newcommand{\rounddown}[1]{\fpeval{floor(#1)}}

\newcommand{\tlstart}{\decdate{1}{11}{2015}} % tl stands for timeline
\newcommand{\tlend}{\decdate{30}{6}{2020}}

\newcommand{\tlconvert}[1]{\fpeval{(#1-\tlstart)/(\tlend-\tlstart)}\linewidth} % calculate decimaldate

\newcommand{\tldraw}{\draw[thick] (\tlconvert{\tlstart}, 0) -- (\tlconvert{\tlend}, 0);
% loop through years and add years labels to timeline
\foreach \i in {\roundup{\tlstart},...,\rounddown{\tlend}}{
    \draw[thick] (\tlconvert{\i},0) -- (\tlconvert{\i},-0.15) node[anchor=north] {\i};
}}
\newcommand{\tlentry}[6]{\fill[color=green] (\tlconvert{\decdate{#1}{#2}{#3}}, 0) rectangle (\tlconvert{\decdate{#4}{#5}{#6}}, 0.25);}

\begin{document}
    
    \begin{tikzpicture}
        \tlentry{1}{8}{2016}{31}{12}{2016}
        \tlentry{1}{8}{2017}{31}{12}{2018}
        \tlentry{25}{1}{2020}{25}{5}{2020}
        \tldraw
    \end{tikzpicture}
    
\end{document}

答案2

编辑:利用新的phantom密钥克洛诺斯svn rev 9903 或更高版本。

克洛诺斯可以立即执行此操作,现在提供phantom创建无标签项目的选项。这些项目不再是不可见的。它们不再存在。

请注意,我相信了你的话:时间线恰好从指定的日期开始,并且不包含任何边距。

时空版本

\documentclass{article}
% ateb: https://tex.stackexchange.com/a/702342/
\usepackage{chronos}% https://codeberg.org/cfr/chronos

\begin{document}
\begin{chronos}
  [% ateb: https://tex.stackexchange.com/a/702342/
    somewhat plain,
    timeline={%
      dates={2016-08-01}:{2020-05-25},
      without eras,
      timeline margin'=0pt,
      timeline era margin'=0pt,
      timeline years=below,
    },
    frame=false,
    period/phantom,
    every period+={above,phantom},
    every lines+={line width=5pt,green},
    line yshift'=2.5pt,
    lines on=background,
  ]
  \chronosperiod{dates={{2016-08-01}:{2017-01-01}},name=period 1}
  \chronosperiod{dates={{2017-08-01}:{2018-12-31}},name=period 2}
\end{chronos}
\end{document}

请注意,即使项目没有标签,也必须命名。在创建坐标以表示时间线上的项目时chronos仍然使用name---并且如果需要,可以稍后使用项目的主坐标,就像创建带标签的项目一样。

相关内容