moderncv/moderncvverticaltimeline.sty

80 lines
3 KiB
TeX

%% start of file `moderncvverticaltimeline.sty'.
%% Copyright 2023 Javier Lopez-Gomez (javier.lopez.gomez@proton.me), 2024-2026 moderncv maintainers (github.com/moderncv).
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License version 1.3c,
% available at http://www.latex-project.org/lppl/.
%-------------------------------------------------------------------------------
% identification
%-------------------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{moderncvverticaltimeline}[2026-01-31 v2.5.1 modern curriculum vitae vertical timeline]
%-------------------------------------------------------------------------------
% required packages
%-------------------------------------------------------------------------------
\RequirePackage{tikz}
\usetikzlibrary{babel}
%-------------------------------------------------------------------------------
% vertical timeline implementation
%-------------------------------------------------------------------------------
\tikzset{
tl_milestone/.style={circle,inner sep=1.5pt,draw=color0!20,label={west:#1}},
tl_link/.style={thick,densely dotted,color0!20},
}
\newcounter{tl@chainidx}\setcounter{tl@chainidx}{0}
\newcounter{tl@nodeidx}\setcounter{tl@nodeidx}{0}
% Mark the end of the current chain; any `\tl@milestone` issued afterward will be on a new timeline.
\def\tl@resetchain{%
\stepcounter{tl@chainidx}%
\setcounter{tl@nodeidx}{0}%
}
% Create a node in the current timeline and link it to the previous node; if the previous milestone
% is on the last shipped out page, draw a line that extends until the top margin. The argument is laid out as a label (default left).
\def\tl@milestone#1{%
\edef\@tl@prev{tl-\thetl@chainidx-\thetl@nodeidx}%
\stepcounter{tl@nodeidx}%
\edef\@tl@this{tl-\thetl@chainidx-\thetl@nodeidx}%
\tikz[remember picture,overlay] {
\node[tl_milestone={#1}] (\@tl@this) {};
\ifnum\thetl@nodeidx>1
\pgfpointdiff{\pgfpointanchor{\@tl@prev}{center}}{\pgfpointanchor{\@tl@this}{center}}
\ifnum\pgf@y>0
\draw[tl_link] (\@tl@this) -- ([yshift=-1em] \@tl@this |- current page.north);
\else
\draw[tl_link] (\@tl@this) -- (\@tl@prev);
\fi
\fi
}
}
\AddToHook{shipout/background}{%
% If there are follow-up milestones in the current timeline, draw a line that extends until the bottom margin
\edef\@tl@prev{tl-\thetl@chainidx-\number\numexpr\thetl@nodeidx-1}%
\edef\@tl@this{tl-\thetl@chainidx-\thetl@nodeidx}%
\tikz[remember picture,overlay] {
\ifnum\thetl@nodeidx>1
\pgfpointdiff{\pgfpointanchor{\@tl@prev}{center}}{\pgfpointanchor{\@tl@this}{center}}
\ifnum\pgf@y>0
\draw[tl_link] (\@tl@prev) -- ([yshift=1em] \@tl@prev |- current page.south);
\fi
\fi
}
}
\AtEndDocument{\tl@resetchain}
\let\@old@section=\section%
\RenewDocumentCommand{\section}{sm}{\tl@resetchain\@old@section{#1}}
\endinput
%% end of file `moderncvverticaltimeline.sty'.