Generador de calendarios editables

Generador de calendarios editables

Estoy buscando una forma sencilla de generar páginas de calendario en LaTeX, algo como esto:http://www.latextemplates.com/template/monthly-calendar- sin embargo, sin tener que pensar en los días de la semana "correctos" para las alineaciones del calendario. Debería ser posible diseñar automáticamente las páginas correctamente especificando la fecha (por ejemplo, febrero de 2017).

Además, debe serposible queeditarel texto en el calendario fácilmente en LaTeX,Así que esto no es sólo para imprimir y rellenar con tinta. Supongo que lo mejor sería un proceso de dos pasos, uno quegenera el archivo LaTeXcon entradas para todos los días, y luego se puede editar la agenda de días particulares. Otra posibilidad es tener las entradas del calendario en algún formato de texto más simple (debería ser posible tener esto en el control de versiones de git) yanalizar e insertarcorrectamente desde el archivo de látex.

Respuesta1

Tomandomi respuestade otra pregunta y ajustándola con:

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

donde \eventscontiene una lista de cosas que desea componer dentro de los cuadros de nodos que se proporcionan y eventsque agrega la parte de texto al nodo del día donde estoy usando una \parshapesolución para recortar un área en el lado derecho (donde se encuentra el número del día) .

Todo lo que necesitas ahora es completar las \eventsmacros.

Puedes combinar esto con el enfoque zjr adoptado.en otra respuestadonde estoy usando múltiples macros y permito diferentes estilos para que puedas usar varios tipos de eventos para agregar a tu calendario.

Sin embargo, trate de asegurarse de tener solo un evento por día; de lo contrario, necesitará algo como[1]o[2].

También hay una solución donde elcalendario se extiendepara que siempre llene la página.


La \parshapeimplementación es bastante rudimentaria porque solo se usa 1.9emcomo relleno adicional a la derecha, sería más inteligente medir el ancho del texto del día en la esquina y usarlo.

También ajusté el bucle principal y agregué trim lefty trim rightpara suprimir las advertencias excesivas de hbox.

Código

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

Producción

ingrese la descripción de la imagen aquí

información relacionada