Generator für editierbare Kalender

Generator für editierbare Kalender

Ich suche nach einer einfachen Möglichkeit, Kalenderseiten in LaTeX zu generieren, etwa so:http://www.latextemplates.com/template/monthly-calendar- allerdings ohne dass ich mir Gedanken über die "richtige" Zuordnung der Wochentage zum Kalender machen muss. Es sollte möglich sein, die Seiten durch die Angabe des Datums (z.B. Februar 2017) automatisch richtig zu layouten.

Darüber hinaus muss esmöglich zubearbeitenden Text im Kalender bequem in LaTeX,also nicht nur zum Ausdrucken und Ausfüllen mit Tinte. Ich denke, das Beste wäre ein zweistufiger Prozess, einer, dergeneriert die LaTeX-Dateimit Einträgen für jeden Tag, und dann kann man die Agenda einzelner Tage bearbeiten. Eine andere Möglichkeit ist, die Kalendereinträge in einem einfacheren Textformat zu haben (dies sollte in der Git-Versionskontrolle möglich sein) undParsen und Einfügensie korrekt aus der Latex-Datei.

Antwort1

Einnahmemeine Antwortaus einer anderen Frage und Anpassung mit:

\newcommand*\events{%
  \month-\day / Today,
  2023-04-10 / A very long text with math $e = mc^2$ and so much text that the whole box and its five lines are needed,
  12-31 / New Year's Eve,
  2023-04-11 / A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
}
\tikzset{
  day event/.style={
    node contents={%
      \parshape 5 0pt \dimexpr\textwidth-1.9em 0pt \dimexpr\textwidth-1.9em
      0pt \textwidth 0pt \textwidth 0pt \textwidth #1\par},
    text height=+1em,
    text depth=\pgfkeysvalueof{/pgf/minimum height}-2*(\pgfkeysvalueof{/pgf/inner ysep})-1em,
    text width=\pgfkeysvalueof{/pgf/minimum width}-2*(\pgfkeysvalueof{/pgf/inner xsep}),
    align=left,
  },
  events/.style args={#1/#2}{
    if = {(equals=#1) [every day/.append style={day event={#2}}]}
  }
}

wo \eventseine Liste der Dinge steht, die Sie in die Knotenfelder setzen möchten, die angegeben werden, eventswodurch der Textteil zum Tagesknoten hinzugefügt wird, wobei ich eine \parshapeLösung verwende, um einen Bereich auf der rechten Seite auszuschneiden (wo die Tagesnummer steht).

Jetzt müssen Sie nur noch die Makros füllen \events.

Sie können dies mit dem zjr-Ansatz kombinierenin einer anderen AntwortDabei verwende ich mehrere Makros und lasse unterschiedliche Stile zu, sodass Sie Ihrem Kalender verschiedene Ereignistypen hinzufügen können.

Versuchen Sie jedoch, nur eine Veranstaltung pro Tag zu haben, sonst benötigen Sie etwas wie[1]oder[2].

Es gibt auch eine Lösung, bei der dieKalender erstreckt sichsodass die Seite immer ausgefüllt wird.


Die \parshapeImplementierung ist eher rudimentär, da sie nur 1.9emals zusätzliche Polsterung auf der rechten Seite verwendet wird. Es wäre klüger, die Breite des Tagestextes in der Ecke zu messen und diese zu verwenden.

Ich habe auch die Hauptschleife angepasst und hinzugefügt trim left, trim rightum übermäßige Hbox-Warnungen zu unterdrücken.

Code

\documentclass[a4paper,landscape]{article}
\usepackage[margin={1cm},noheadfoot]{geometry}
\renewcommand*\thepage{}
\usepackage{libertine}
\usepackage{tikz}
\usetikzlibrary{calendar}
\tikzset{
  every weekday/.style={
    anchor=south west, black,
    name=weekday-\pgfcalendarcurrentmonth-\pgfcalendarcurrentweekday,
    node contents=\%wt},
  weekday above/.style={
    if = {(day of month=1) [days={append after command={
          node [at={(\tikzlastnode.north west)},
                alias=@firstweekday,
                every weekday]}}]},
    if = {(day of month=2, day of month=3, day of month=4, day of month=5, day of month=6, day of month=7) [
          days={append after command={
          node [at={(@firstweekday.south west-|\tikzlastnode.south west)}, every weekday]}}]}},
  wall calendar/.style={
    week list, weekday above, day text=,
    day and weekday/.style={
      draw, outer sep=+0pt,
      minimum width=\linewidth/7,
      minimum height=+.125\textheight},
    day xshift=\linewidth/7,
    day yshift=\textheight/8,
    every day label/.style={
      anchor=north east,
      font=\Large\itshape,
      node contents={\%d=},
      inner sep=+.7em},
    every day/.append style={
      day and weekday,
      anchor=center,
      label={[every day label]north east:}},
    every weekday/.append style={
      day and weekday,
      minimum height=+2em}}}
\newcommand*\Year{2023}
\newcommand*\events{%
  \month-\day / Today,
  2023-04-10 / A very long text with math $e = mc^2$ and so much text that the whole box and its five lines are needed,
  12-31 / New Year's Eve,
  2023-04-11 / A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
}
\tikzset{
  day event/.style={
    node contents={%
      \parshape 5 0pt \dimexpr\textwidth-1.9em 0pt \dimexpr\textwidth-1.9em
      0pt \textwidth 0pt \textwidth 0pt \textwidth #1\par},
    text height=+1em,
    text depth=\pgfkeysvalueof{/pgf/minimum height}-2*(\pgfkeysvalueof{/pgf/inner ysep})-1em,
    text width=\pgfkeysvalueof{/pgf/minimum width}-2*(\pgfkeysvalueof{/pgf/inner xsep}),
    align=left,
  },
  events/.style args={#1/#2}{
    if = {(equals=#1) [every day/.append style={day event={#2}}]}
  }
}
\begin{document}\sffamily
\centering
\foreach \mon in {01,0...,09,10,11,12}{% leading zero for trim left/right
  {\Huge \pgfcalendarmonthname{\mon}\par}
  {\huge \Year\par}
  \vspace{2em}
  \tikz[trim left=(weekday-\mon-0.west), trim right=(weekday-\mon-6.east)]
    \calendar[
      dates=\Year-\mon-01 to \Year-\mon-last,
      wall calendar,
      events/.list/.expand once=\events,
    ];

\pagebreak}
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen