No final da página você encontra um link para o documento que iremos produzir.
Nesse artigo, tentarei começar com os códigos básicos e ir recheando de acordo com as intenções de cada etapa. Primeiramente, a classe escolhida foi a mais simples (article) com as seguintes opções:
Não vou me preocupar com as margens do documento impostas pela classe, pois iremos atropelá-las com a ajuda de um pacote chamado "TikZ". Se você ainda não o conhece, dê uma olhada neste site e terá ideia do tamanho do poder desta ferramenta que fará todo o trabalho duro neste projeto. Além dele, alguns pacotes para tratar codificação de entrada (inputenc) e de saída (fontenc), a separação das palavras (babel) e para facilitar cálculos (calc) foram incluídos. Dessa forma, nosso código mínimo ficará assim.
\documentclass[a4paper, landscape]{article}
\usepackage[utf8]{inputenc} % para windows: \usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\usepackage{calc}
\usepackage{tikz}
\begin{document}
\end{document}
Bom, com infraestrutura montada, agora precisamos começar a implementar a agenda em si. O próprio TikZ possui algumas coisas prontas para isso, mas não serão suficientes aqui. Por isso, entraremos em contato com uma parte um pouco mais profunda que é o PGF, que em uma analogia razoável seria o framework para o TikZ. É necessário, então, adicionar a biblioteca "calendar" do TikZ . O comando utilizado será o
\pgfcalendar{ prefixo }{ data inicial }{ data final }{ código }
Explicando melhor cada campo:
E aproveitando esse interlúdio, vou aproveitar para mostrar alguns comandos que serão úteis:
No próximo código, faremos um calendário semanal (prefiro este tipo, pois posso ter uma visão geral da semana toda). Vale ressaltar que, para diminuir o número de cálculos nessas versões iniciais, usarei o período mais curto, de dois meses, que servirá como exemplo. As datas são escritas da forma invertida (ano-mes-dia) e a opção "ano-mes-last" representa o último dia de um determinado mês, já que isso varia.
\documentclass[a4paper, landscape] {article}
\usepackage[utf8]{inputenc} % para windows: \usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calendar}
\begin{document}
\pgfcalendar{cal}{2012-1-1}{2012-2-last}{
\ifdate{Monday}{\clearpage}{}
\pgfcalendarcurrentday
}
\end{document}
Como você pôde perceber, ao processar esse código, uma nova página era criada a cada segunda-feira. Porém, devido às margens impostas pela memoir, o conteúdo fica sambando de um lado para o outro. Para evitar isso, faremos uso do posicionamento absoluto (current page, remember picture, overlay) oferecido pelo TikZ.
Além disso, é saudável que os dias do mês estejam organizados de acordo com os dias da semana. No próximo passo, criaremos um ponto no canto superior esquerdo, chamado de "base", que será usado como referência. A partir dele, outros nós são posicionados s usando uma distância (\fieldsize) relativamente ao dia da semana. Por exemplo, a "segunda" vai ficar sobre o ponto de referência, a "terça" será deslocada de um "\fieldsize", a quarta de dois "\fieldsize", e por aí vai. Depois que os dias da semana estão posicionados, é só colocar os dias do mês abaixo deles.
Outras observações importantes:
\documentclass[a4paper, landscape] {article}
\usepackage[utf8]{inputenc} % para windows: \usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calendar}
\usetikzlibrary{positioning}
\pagestyle{empty}
\begin{document}
\newlength{\fieldsize}
\setlength{\fieldsize}{4.1cm}
\pgfcalendar{cal}{2012-1-1}{2012-2-last}{
\ifdate{Monday}{\clearpage}{}
\pgfmathsetlengthmacro{\absolutespaceweekday}{\fieldsize * \pgfcalendarcurrentweekday}
\begin{tikzpicture} [remember picture, overlay]
\coordinate [xshift = 0.5cm , yshift = -3cm] (base) at (current page.north west);
\node [right = \absolutespaceweekday of base, minimum width = \fieldsize] (temp) {};
\node at (temp.center) {\pgfcalendarweekdayname{\pgfcalendarcurrentweekday}};
\node [below = 0.5cm of temp, minimum width = \fieldsize] (temp) {};
\node at (temp.center) {\pgfcalendarcurrentday};
\end{tikzpicture}
}
\end{document}
E agora já é possível ver o calendário tomando forma. Como "agenda que é agenda" facilita a marcação de horários, incluirei uma linha para cada hora do dia. Para tanto, usarei mais um recurso pouco conhecido no LaTeX, o laço de repetição (foreach) que explico melhor abaixo. Em cada iteração, incluo um nó (node) com um determinado tamanho e uso suas coordenadas inferiores ("south west" e "south east") para fazer uma linha (draw) e sua cordenada oest (west) para incluir a hora. Além disso, para que as semanas não fiquem soltas, é necessário também que um título seja colocado com o nome do mês em questão. Para isso, novamente usa-se o recurso de posicionamento absoluto do TikZ.
Outras observações:
Segue o código atualizado:
\documentclass[a4paper, landscape]{article}
\usepackage[utf8]{inputenc} % para windows: \usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calendar}
\usetikzlibrary{positioning}
\pagestyle{empty}
\newcounter{hour}
\begin{document}
\newlength{\fieldsize}
\setlength{\fieldsize}{4.1cm}
\pgfcalendar{cal}{2012-1-1}{2012-2-last}{
\ifdate{Monday}{
\clearpage
\tikz[remember picture, overlay]
\node [anchor = north, yshift = -0.5cm, inner ysep = 0pt] at (current page.north) {\fontsize{1.5cm}{1.5cm} \selectfont \pgfcalendarmonthname{\pgfcalendarcurrentmonth}};
}{}
\pgfmathsetlengthmacro{\absolutespaceweekday}{\fieldsize * \pgfcalendarcurrentweekday}
\begin{tikzpicture} [remember picture, overlay]
\coordinate [xshift = 0.5cm , yshift = -3cm] (base) at (current page.north west);
\node [right = \absolutespaceweekday of base, minimum width = \fieldsize] (temp) {};
\node at (temp.center) {\pgfcalendarweekdayname{\pgfcalendarcurrentweekday}};
\node [below = 0.5cm of temp, minimum width = \fieldsize] (temp) {};
\node at (temp.center) {\pgfcalendarcurrentday};
\foreach \hl in {1,...,24} {
\node [below = 0.65 * \hl cm of temp, minimum width = 0.95\fieldsize] (temp2) {};
\draw (temp2.south west) -- (temp2.south east);
\setcounter{hour}{\hl - 1}
\node [anchor = west, yshift = 0.1cm] at (temp2.west) {\thehour};
}
\end{tikzpicture}
}
\end{document}
Bom, pode-se dizer que a agenda está finalizada. Porém, para mim os nomes apareceram em inglês, o que significa que o recurso de tradução oferecido pelo TikZ, e atrelado ao pacote babel, não funcionou. Existe uma solução simples, mas um pouco trabalhosa para isso. É só testar cada dia da semana e mês, atribuindo valores adequados a novas variáveis que serão impressas no lugar dos recursos oferecidos pela biblioteca calendar do TikZ. Segue a versão final do código. Não se esqueçam de mudar o intervalo do calendário produzido!
Ah! E como o ano não começa numa segunda e consequentemente, a primeira semana fica sem título. Então, coloquei um comando antes de tudo com a finalidade de corrigir essa pequena falha. É fácil de identificá-lo.
\documentclass[a4paper, landscape] {article}
\usepackage[utf8]{inputenc} % para windows: \usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[brazilian]{babel}
\usepackage{calc}
\usepackage{tikz}
\usetikzlibrary{calendar}
\usetikzlibrary{positioning}
\pagestyle{empty}
\newlength{\fieldsize}
\newcounter{hour}
\newcommand{\weekday}{}
\newcommand{\monthname}{}
\begin{document}
\setlength{\fieldsize}{4.1cm}
\tikz[remember picture, overlay]
\node [anchor = north, yshift = -0.5cm, inner ysep = 0pt] at (current page.north) {\fontsize{1.5cm}{1.5cm} \selectfont Janeiro};
\pgfcalendar{cal}{2012-1-1}{2012-12-last}{
\ifdate{Monday}{\renewcommand{\weekday}{Segunda}}{}
\ifdate{Tuesday}{\renewcommand{\weekday}{Terça}}{}
\ifdate{Wednesday}{\renewcommand{\weekday}{Quarta}}{}
\ifdate{Thursday}{\renewcommand{\weekday}{Quinta}}{}
\ifdate{Friday}{\renewcommand{\weekday}{Sexta}}{}
\ifdate{Saturday}{\renewcommand{\weekday}{Sábado}}{}
\ifdate{Sunday}{\renewcommand{\weekday}{Domingo}}{}
\ifdate{between=1-1 and 1-last}{\renewcommand{\monthname}{Janeiro}}{}
\ifdate{between=2-1 and 2-last}{\renewcommand{\monthname}{Fevereiro}}{}
\ifdate{between=3-1 and 3-last}{\renewcommand{\monthname}{Março}}{}
\ifdate{between=4-1 and 4-last}{\renewcommand{\monthname}{Abril}}{}
\ifdate{between=5-1 and 5-last}{\renewcommand{\monthname}{Maio}}{}
\ifdate{between=6-1 and 6-last}{\renewcommand{\monthname}{Junho}}{}
\ifdate{between=7-1 and 7-last}{\renewcommand{\monthname}{Julho}}{}
\ifdate{between=8-1 and 8-last}{\renewcommand{\monthname}{Agosto}}{}
\ifdate{between=9-1 and 9-last}{\renewcommand{\monthname}{Setembro}}{}
\ifdate{between=10-1 and 10-last}{\renewcommand{\monthname}{Outubro}}{}
\ifdate{between=11-1 and 11-last}{\renewcommand{\monthname}{Novembro}}{}
\ifdate{between=12-1 and 12-last}{\renewcommand{\monthname}{Dezembro}}{}
\ifdate{Monday}{
\clearpage
\tikz[remember picture, overlay]
\node [anchor = north, yshift = -0.5cm, inner ysep = 0pt] at (current page.north) {\fontsize{1.5cm}{1.5cm} \selectfont \monthname};
}{}
\pgfmathsetlengthmacro{\absolutespaceweekday}{\fieldsize * \pgfcalendarcurrentweekday}
\begin{tikzpicture} [remember picture, overlay]
\coordinate [xshift = 0.5cm , yshift = -3cm] (base) at (current page.north west);
\node [right = \absolutespaceweekday of base, minimum width = \fieldsize] (temp) {};
\node at (temp.center) {\weekday};
\node [below = 0.5cm of temp, minimum width = \fieldsize] (temp) {};
\node at (temp.center) {\pgfcalendarcurrentday};
\foreach \hl in {1,...,24} {
\node [below = 0.65 * \hl cm of temp, minimum width = 0.95\fieldsize] (temp2) {};
\draw (temp2.south west) -- (temp2.south east);
\setcounter{hour}{\hl - 1}
\node [anchor = west, yshift = 0.1cm] at (temp2.west) {\thehour};
}
\end{tikzpicture}
}
\end{document}
O PoliGNU é um grupo formado por estudantes de diversos cursos da Escola Politécnica, bem como de outros cursos da USP, que se dedicam ao desenvolvimento e à divulgação de tecnologia, software e cultura livres, especialmente no que se relaciona à engenharia. O grupo já tem mais de três anos de existência e é aberto à participação de quaisquer interessados(as).
Nosso mailing:
polignu(arroba)googlegroups(ponto)com
Exceto menção em contrário, todo o conteúdo deste site está licenciado sob uma
Licença Creative Commons Atribuição-Compartilhamento pela mesma Licença 3.0 Brasil.