Gerador para calendários editáveis

Gerador para calendários editáveis

Estou procurando uma maneira simples de gerar páginas de calendário em LaTeX, algo assim:http://www.latextemplates.com/template/monthly-calendar- porém sem que eu tenha que pensar nos dias da semana "corretos" para os alinhamentos do calendário. Deve ser possível fazer o layout correto das páginas automaticamente, especificando a data (por exemplo, fevereiro de 2017).

Além disso, deve serÉ possíveleditaro texto no calendário facilmente em LaTeX,então isso não é apenas para imprimir e preencher com tinta. Acho que o melhor seria um processo em duas etapas, quegera o arquivo LaTeXcom entradas para todos os dias, e então pode-se editar a agenda de determinados dias. Outra possibilidade é ter as entradas do calendário em algum formato de texto mais simples (deveria ser possível ter isso no controle de versão do git) eanalisar e inserircorretamente a partir do arquivo latex.

Responder1

Tirandominha respostade outra pergunta e ajustando-a com:

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

onde \eventscontém uma lista de coisas que você deseja compor dentro das caixas de nós fornecidas, eventsque adiciona a parte do texto ao nó do dia onde estou usando uma \parshapesolução para cortar uma área no lado direito (onde fica o número do dia) .

Tudo que você precisa agora é preencher as \eventsmacros.

Você pode combinar isso com a abordagem zjr adotadaem outra respostaonde estou usando várias macros e permito estilos diferentes para que você possa usar vários tipos de eventos para serem adicionados ao seu calendário.

Porém, tente garantir que você tenha apenas um evento por dia, caso contrário, você precisará de algo como[1]ou[2].

Há também uma solução onde otrechos de calendáriopara que sempre preencha a página.


A \parshapeimplementação é bastante rudimentar porque usa apenas 1.9emcomo preenchimento extra à direita, seria mais inteligente medir a largura do texto do dia no canto e usar isso.

Também ajustei o loop principal e adicionei trim lefte trim rightpara suprimir avisos excessivos do 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}

Saída

insira a descrição da imagem aqui

informação relacionada