Como o título indica, gostaria de usar o LaTeX para manter um diário pessoal. Tenho despejado minhas entradas em um único arquivo que se tornou complicado com o tempo. Idealmente, eu encontraria um pacote (ou coleção de scripts de shell) que me ajudasse a manter uma estrutura de diretórios consistente e a encaminhar automaticamente as entradas com suas respectivas datas.
Não encontrei nada relevante no repositório CTAN, então peço conselhos a você. Se não houver uma solução disponível, posso sentar e aprender como criar pacotes personalizados.
Muito obrigado!
Responder1
Como você ainda não pode comentar, aqui vai uma proposta usando a tufte-latex
classe e um ambiente customizado. Isso é exatamente o que eu inventei. Você pode editar sua pergunta para especificar o formato e os recursos que deseja. O lipsum
pacote é usado apenas para algum texto fictício.
\documentclass{tufte-book}
\usepackage{lipsum}
\newenvironment{loggentry}[2]% date, heading
{\noindent\textbf{#2}\marginnote{#1}\\}{\vspace{0.5cm}}
\begin{document}
\begin{loggentry}{2009-Oct-31}{Snow}
\lipsum[1]
\end{loggentry}
\begin{loggentry}{2010-Dez-31}{Water of Life}
\lipsum[2]
\end{loggentry}
\begin{loggentry}{2011-Nov-15}{Cold}
\lipsum[3-5]
\end{loggentry}
\begin{loggentry}{2012-Aug-24}{Sunrise}
\lipsum[6-7]
\end{loggentry}
\end{document}
Editar 1:Aqui está uma versão automatizada. Ele assume que seu diretório está no formato /Year/Month/Day.tex
, formatado como, por exemplo 2012/Aug/24.tex
, , então o mês contém apenas as três primeiras letras. Os arquivos individuais .tex
têm apenas o requisito de ter a primeira linha como \mytitle{<The actual title here>}
.
Esta solução faz uso dePedro Grilla resposta para "Como iterar pelo nome dos arquivos em uma pasta".
O arquivo principal:
\documentclass{tufte-book}
\usepackage{lipsum}
\usepackage{tikz}
\usepackage{xifthen}
\newenvironment{loggentry}[2]% date, heading
{\noindent\textbf{#2}\marginnote{#1}\par}{\vspace{0.5cm}}
\def\?#1{}
\pgfmathtruncatemacro{\StartYear}{2008}
\pgfmathtruncatemacro{\EndYear}{2012}
\newcommand{\writetitle}{0}
\newcommand{\mytitle}[1]
{ \ifthenelse{\writetitle=1}{#1}{}
}
\newread\mysource
\begin{document}
\foreach \Year in {\StartYear,...,\EndYear}
{ \foreach \Month in {Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}
{ \foreach \Day in {1,...,31}
{ \IfFileExists{\Year/\Month/\Day}
{ \openin\mysource=\Year/\Month/\Day.tex
\read\mysource to \firstline
\closein\mysource
\xdef\writetitle{1}
\begin{loggentry}{\Year - \Month - \Day}{\firstline}
\xdef\writetitle{0}
\input{\Year/\Month/\Day}
\end{loggentry}
}
{ % files does not exist, so nothing to do
}
}
}
}
\end{document}
Um exemplo de arquivo de entrada de log:
\mytitle{Something happened}
\lipsum[3-5]
A saída:
Responder2
Meu novo código para diários é o seguinte. Acrescenta uma nota na lateral, mas sem caixa porque utiliza a marginnote
embalagem.
O arquivo de ambienteinput.tex
\usepackage[top=4cm, bottom=2cm, outer=5cm, inner=2cm, heightrounded, marginparwidth=3.5cm, marginparsep=0.75cm]{geometry}
\newcommand{\mybox}[1]{%
\marginnote{{\color{red}CAUTION!}\\{#1}}
}
\newlength\sidebar
\newlength\envrule
\newlength\envborder
\setlength\sidebar{1.5mm}
\setlength\envrule{0.4pt}
\setlength\envborder{2mm}
\makeatletter
\long\def\fboxs#1{%
\leavevmode
\setbox\@tempboxa\hbox{%
\color@begingroup
\kern\fboxsep{#1}\kern\fboxsep
\color@endgroup}%
\@frames@x\relax}
\def\frameboxs{%
\@ifnextchar(%)
\@framepicbox{\@ifnextchar[\@frameboxs\fboxs}}
\def\@frameboxs[#1]{%
\@ifnextchar[%]
{\@iframeboxs[#1]}%
{\@iframeboxs[#1][c]}}
\long\def\@iframeboxs[#1][#2]#3{%
\leavevmode
\@begin@tempboxa\hbox{#3}%
\setlength\@tempdima{#1}%
\setbox\@tempboxa\hb@xt@\@tempdima
{\kern\fboxsep\csname bm@#2\endcsname\kern\fboxsep}%
\@frames@x{\kern-\fboxrule}%
\@end@tempboxa}
\def\@frames@x#1{%
\@tempdima\fboxrule
\advance\@tempdima\fboxsep
\advance\@tempdima\dp\@tempboxa
\hbox{%
\lower\@tempdima\hbox{%
\vbox{%
%\hrule\@height\fboxrule
\hbox{%
\vrule\@width\fboxrule
#1%
\vbox{%
\vskip\fboxsep
\box\@tempboxa
\vskip\fboxsep}%
#1%
}%\vrule\@width\fboxrule}%
}%\hrule\@height\fboxrule}%
}%
}%
}
\def\esefcolorbox#1#{\esecolor@fbox{#1}}
\def\esecolor@fbox#1#2#3{%
\color@b@x{\fboxsep\z@\color#1{#2}\fboxs}{\color#1{#3}}}
\makeatother
\definecolor{exampleborder}{HTML}{FE642E}
\definecolor{examplebg}{HTML}{CEF6EC}
\definecolor{statementborder}{rgb}{.9,0,0}
\definecolor{statementbg}{rgb}{1,1,1}
\newenvironment{eseframed}{%
\def\FrameCommand{\fboxrule=\the\sidebar \fboxsep=\the\envborder%
\esefcolorbox{exampleborder}{examplebg}}%
\MakeFramed{\FrameRestore}}%
{\endMakeFramed}
%\renewcommand\dateTurkish{\def\today{\number\day~%
%\ifcase \month \or Ocak\or Şubat\or Mart\or Nisan\or Mayıs\or Haziran\or
% Temmuz\or Ağustos\or Eylül\or Ekim\or Kasım\or Aralık\fi\space
%\number\year}}
%\dateTurkish
\newcounter{diary}
%\numberwithin{uygulama}
\renewcommand{\thediary}{\arabic{diary}}
%%% CODE ENVIRONMENT. PUT TEXT INTO COLORED FRAME %%%
\newenvironment{diary}[2]
{\par\medskip\refstepcounter{diary}%
\hbox{%
\fboxsep=\the\sidebar\hspace{-\envborder}\hspace{-.5\sidebar}%
\colorbox{exampleborder}{%
\hspace{\envborder}\footnotesize\sffamily\bfseries%
\textcolor{white}{{#1}\ {#2}\enspace\hspace{\envborder}}
%\today
}
}
\nointerlineskip\vspace{-\topsep}%
\begin{eseframed}\noindent\ignorespaces%
}
{\end{eseframed}\vspace{-\baselineskip}\medskip}
Os arquivos do diário são armazenados em uma pasta separada, por exemplo, 2013
e os arquivos são armazenados nela. Um exemplo de arquivo de diário 2013.tex
:
%2013 Notes
\begin{diary}{Hello!}{07.18.2013}
\mybox{Put some text here for caution.}
\lipsum[1]
\end{diary}
\begin{diary}{Second entry.}{07.19.2013}
\mybox{Put some text here for caution.}
\lipsum[2]
\end{diary}
Arquivo principal
\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage{framed}
\usepackage{datetime}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fourier}
\usepackage{marginnote}
\usepackage{tikz}
\input{input}
\title{\Huge My Diary}
\author{Someone}
\date{}
\begin{document}
\maketitle
\include{./2013/2013}
\end{document}
Saída
Termo aditivo
Para usar a barra lateral laranja à esquerda em vez da direita, o input.tex
arquivo foi reorganizado da seguinte forma:
\usepackage[top=4cm, bottom=2cm, outer=5cm, inner=2cm, heightrounded, marginparwidth=3cm, marginparsep=0.75cm]{geometry}
\newcommand{\mybox}[1]{%
\marginnote{{\color{red}CAUTION!}\\{#1}}
}
\newlength\sidebar
\newlength\envrule
\newlength\envborder
\setlength\sidebar{1.5mm}
\setlength\envrule{0.4pt}
\setlength\envborder{2mm}
\makeatletter
\long\def\fboxs#1{%
\leavevmode
\setbox\@tempboxa\hbox{%
\color@begingroup
\kern\fboxsep{#1}\kern\fboxsep
\color@endgroup}%
\@frames@x\relax}
\def\frameboxs{%
\@ifnextchar(%)
\@framepicbox{\@ifnextchar[\@frameboxs\fboxs}}
\def\@frameboxs[#1]{%
\@ifnextchar[%]
{\@iframeboxs[#1]}%
{\@iframeboxs[#1][c]}}
\long\def\@iframeboxs[#1][#2]#3{%
\leavevmode
\@begin@tempboxa\hbox{#3}%
\setlength\@tempdima{#1}%
\setbox\@tempboxa\hb@xt@\@tempdima
{\kern\fboxsep\csname bm@#2\endcsname\kern\fboxsep}%
\@frames@x{\kern-\fboxrule}%
\@end@tempboxa}
\def\@frames@x#1{%
\@tempdima\fboxrule
\advance\@tempdima\fboxsep
\advance\@tempdima\dp\@tempboxa
\hbox{%
\lower\@tempdima\hbox{%
\vbox{%
\hrule\@height\fboxrule
% \hbox{%
% \vrule\@width\fboxrule
#1%
\vbox{%
\vskip\fboxsep
\box\@tempboxa
\vskip\fboxsep}%
#1%
}\vrule\@width\fboxrule}%
}%\hrule\@height\fboxrule}%
% }%
% }%
}
\def\esefcolorbox#1#{\esecolor@fbox{#1}}
\def\esecolor@fbox#1#2#3{%
\color@b@x{\fboxsep\z@\color#1{#2}\fboxs}{\color#1{#3}}}
\makeatother
\definecolor{exampleborder}{HTML}{FE642E}
\definecolor{examplebg}{HTML}{CEF6EC}
\definecolor{statementborder}{rgb}{.9,0,0}
\definecolor{statementbg}{rgb}{1,1,1}
\newenvironment{eseframed}{%
\def\FrameCommand{\fboxrule=\the\sidebar \fboxsep=\the\envborder%
\esefcolorbox{exampleborder}{examplebg}}%
\MakeFramed{\FrameRestore}}%
{\endMakeFramed}
\newcounter{diary}
%\numberwithin{uygulama}
\renewcommand{\thediary}{\arabic{diary}}
%%% CODE ENVIRONMENT. PUT TEXT INTO COLORED FRAME %%%
\newenvironment{diary}[2]
{\par\medskip\refstepcounter{diary}%
\hbox{%
\fboxsep=\the\sidebar\hspace{-\envborder}\hspace{-0.5\sidebar}%
\colorbox{exampleborder}{%
\hspace{\envborder}\footnotesize\sffamily\bfseries%
\textcolor{white}{{#1}\ {#2}\enspace\hspace{\envborder}}
%\today
}
}
\nointerlineskip\vspace{-\topsep}%
\begin{eseframed}\noindent\ignorespaces%
}
{\end{eseframed}\vspace{-\baselineskip}\medskip}
E a saída é como:
Responder3
Esta resposta não aborda a questão do gerenciamento de arquivos, mas oferece uma nova maneira de manter diários com LaTeX, então postei aqui mesmo assim.
O pacotejwjournal
Agora existe uma nova classe de documentojwjournal
para manter diários, disponível no CTAN.
Seu princípio principal é a simplicidade. Ele permite que você transforme a entrada simples de texto puro, como
2023-01-01 Sunny --- Botanical Garden
Today I visited the botanical garden!
[Food] And had ice-cream for lunch!
em um diário colorido como este:
alternativamente, com a opção de classe color entry
ativada:
Para aqueles que estão acostumados com outros formatos de data como mm-dd-yyyy
ou dd-mm-yyyy
, você pode usar a opção de classe month-day-year
ou day-month-year
e escrever a string de data como costuma fazer.
Também pode ser usado /
em vez de -
na sequência de datas.
Observe que a conversão de 2023-01-01
to January 1, 2023
é automática, e também calculará que esta data é Sunday
(o cálculo, feito por projlib-date
, atualmente só funciona para datas modernas, mas isso não deve ser um problema aqui). Este recurso possui suporte multilíngue, portanto se você escrever \UseLanguage{French}
no preâmbulo, o resultado seria assim:
E sobre a cor, cada dia da semana tem uma cor correspondente, que claro pode ser modificada conforme sua preferência:
Escrevi explicações detalhadas no arquivo README e também há três documentos de demonstração em inglês, francês e chinês, respectivamente.
Sobre o uso diário
Sobre o uso diário, prefiro manter os diários de cada mês em arquivos separados, como journal-2023-01.tex
, journal-2023-02.tex
, etc. (já que escrevo apenas algumas frases por dia).
Claro, também é possível escrever o diário de cada dia em (sub)arquivos separados e inseri-los no catálogo principal. Dessa forma, cada subarquivo ficaria tão limpo quanto
2023-01-01 Weather --- Location
Some text...
...
E por ser importante, repetirei aqui este ponto já anotado no README:
Os principais recursos são alcançados com o poder da funcionalidade regex do LaTeX3. Ele verifica o conteúdo parágrafo por parágrafo e converte padrões reconhecidos em comandos TeX correspondentes. [...] Porém, isso tem um preço: para escanear o conteúdo, ele primeiro é armazenado em uma macro
\g_jwjournal_content_tl
, o que significa que você não pode usar comandos como\verb
no seu texto principal.
No entanto, se você realmente precisa inserir código, \lstinline
o pacote listings
parece funcionar bem.
Sobre o nome da turma e reconhecimento
Pode-se pensar que o nome da classe vem do meu próprio nomeJ.emcpt, mas na verdade é devido ao meu colega de faculdadeJ.I acei (essa feliz coincidência me motivou a nomear essa classe jw...
). Ele me sugeriu fazer algo com LaTeX para ajudar a manter diários, e sugeriu a sintaxe atual (ele também sugeriu que o dia da semana deveria ser calculado automaticamente assim que a data fosse informada, o que realmente me fez pensar por um bom tempo). Gostaria assim de expressar a minha gratidão a ele, sem o qual este projeto não teria nascido.
Responder4
Dê uma olhada emhttps://ankursinha.in/2016/03/05/calliope-helping-you-keep-a-diary-in-latex.html.
É um script bash simples que facilita o uso do LaTeX para manter diários - mais útil para manter diários de pesquisa! O código fonte está ativadohttps://github.com/sanjayankur31/calliope.