I keep a personal journal using LaTeX. I'd like to create an environment that automatically keeps track of the date of every entry, without having to manually input them myself. This is the code so far
\documentclass{tufte-book}
\usepackage{datenumber, ifthen, xparse}
\usepackage{lipsum}
\setstartyear{2000}
\newcounter{day}
\setcounter{day}{0}
\newcounter{if_auxnewday_begun}
\setcounter{if_auxnewday_begun}{0}
\ExplSyntaxOn
\iow_new:N \g_journal_stream
\seq_new:N \g_journal_seq
\NewDocumentEnvironment{ newday }{ o }{
\addtocounter{day}{1}
\seq_gput_right:Nx \g_journal_seq {
{ \arabic{day} }
{ \datedayname,~\today }
{ \IfValueTF{ #1 }{ #1 }{} }
}
\file_if_exist_input:n {\c_sys_jobname_str.jrn}
}{
\int_compare:nNnT { \arabic{if_auxnewday_begun} } = { 1 }{
\end{ auxnewday}
\setcounter{if_auxnewday_begun}{0}
}
}
\NewDocumentCommand{ \saveday }{ mmm }{
\int_compare:nNnT { #1 } = { \arabic{day} }{
\begin{ auxnewday }{#2}{#3}
\setcounter{if_auxnewday_begun}{1}
}
}
\NewDocumentEnvironment{ auxnewday } { mm }{
\textbf{ #2 }
\marginnote{ #1} \\
}{
\vspace{0.5cm}
}
\AtEndDocument{
\iow_open:Nn \g_journal_stream { \c_sys_jobname_str.jrn }
\save_days:
\iow_close:N \g_journal_stream
}
\cs_new_protected:Nn \save_days: {
\seq_map_function:NN \g_journal_seq \__save_days:n
}
\cs_new_protected:Nn \__save_days:n {
\iow_now:Nn \g_journal_stream {
\saveday #1
}
}
\ExplSyntaxOff
\begin{document}
\begin{newday}[A day]
\lipsum[1-5]
\end{newday}
\begin{newday}[Another day]
\lipsum[6-9]
\end{newday}
\end{document}
As it is, the newday environment is just a more convoluted version of the much simpler
\NewDocumentEnvironment{ newday }{ o }{
\textbf{#1}
\marginnote{ \datedayname,~\today } \\
}{
\vspace{0.5cm}
}
The problem that I'd like to solve is this: suppose that I input a newday today, i.e. on the 25th of February, 2019. How do I keep the code from changing that entry's date when the day ends?
I started to code the first option thinking that it would allow me to keep every date on a separate file, but I quickly realised that the .jrn file gets overwritten every time I compile, so it's useless.
Any ideas on how to solve this problem?
EDIT problematic code
\documentclass[justified, symmetric]{tufte-book}
\usepackage{ifoddpage, ifthen, xparse}
\usepackage[calc, showdow, english]{datetime2}
\DTMnewdatestyle{mydateformat}{%
\renewcommand{\DTMdisplaydate}[4]{%
\DTMshortweekdayname{##4},\space% short weekday,
\DTMmonthname{##2}\nobreakspace% (full) Month
\number##3,\space% day,
\number##1% year
}%
\renewcommand{\DTMDisplaydate}{\DTMdisplaydate}%
}
\DTMsetdatestyle{mydateformat}
\usepackage{lipsum}
\newcounter{day}
\title{Title}
\author{Author}
\ExplSyntaxOn
% Declare variables
\seq_new:N \g_journal_seq
\seq_new:N \g_journal_out_seq
\iow_new:N \g_journal_stream
\tl_new:N \l_journal_date_tl
% At the beginning of the run, read the lines of the `.jrn` file into a sequence.
% These are the dates. If the file can not be opened, it probably does not exist and we treat it as empty.
\cs_new:Npn \readjournaldates {
\ior_open:NnT \g_journal_stream { \c_sys_jobname_str.jrn } {
\ior_map_inline:Nn \g_journal_stream {
\seq_gput_right:Nn \g_journal_seq { ##1 }
}
\ior_close:N \g_journal_stream
}
}
% The main environment:
\NewDocumentEnvironment{ newday }{ O{} }{
\stepcounter{day}
% If the sequence \g_journal_seq is not empty yet, then we already saved a date
% for the current day. Save this day in `\l_journal_date_tl` and delete it from
% the sequence. Otherwise we have not saved anything yet, so we choose the current date.
\seq_gpop_left:NNF \g_journal_seq \l_journal_date_tl {
\tl_set:Nx \l_journal_date_tl {\today}
}
% Now we have to save the chosen date for the next run. First, only store it in the
% sequence `\g_journal_out_seq`, we only write it to the file at the end to avoid
% overwriting the file if something fails:
\seq_gput_right:NV \g_journal_out_seq \l_journal_date_tl
\textbf{ #1 }
\marginnote{\checkoddpage\ifoddpage \l_journal_date_tl \else\raggedleft \l_journal_date_tl \fi} \\
}{
\vspace{0.5cm}
}
% At the end of the document, iterate over `\g_journal_out_seq` and write every entry into a line.
\AtEndDocument{
\iow_open:Nn \g_journal_stream { \c_sys_jobname_str.jrn }
\seq_map_inline:Nn \g_journal_out_seq {
\iow_now:Nn \g_journal_stream { #1 }
}
\iow_close:N \g_journal_stream
}
\ExplSyntaxOff
\readjournaldates
\begin{document}
\maketitle
\pagenumbering{arabic}
\begin{newday}[A day]
\lipsum[1]
\end{newday}
\begin{newday}[Yet another day]
\lipsum[2]
\end{newday}
\begin{newday}
\lipsum[3]
\end{newday}
\begin{newday}[Ciao]
\lipsum[4]
\end{newday}
\begin{newday}[A day]
\lipsum[1]
\end{newday}
\begin{newday}[Yet another day]
\lipsum[2]
\end{newday}
\begin{newday}
\lipsum[3]
\end{newday}
\begin{newday}[Ciao]
\lipsum[4]
\end{newday}
\begin{newday}[A day]
\lipsum[1]
\end{newday}
\begin{newday}[Yet another day]
\lipsum[2]
\end{newday}
\end{document}

.jrnfile might work (with a method that checks if a unique label has been mentioned before and if not, associates the current day with that label), but if you then accidentally delete the.jrnfile everything is gone. It seems much safer to keep the info directly in the.texfile to reduce the risk of accidental deletion. Mildly related: https://tex.stackexchange.com/q/474317/35864 – moewe Feb 25 '19 at 05:57.jrnfile, I'm screwed. But I like the fact of having that information on a separate file, so that my source file remains uncluttered. Is there a way to do both? – noibe Feb 25 '19 at 12:47\end{document}? Wouldn't that make it much less fragile? – noibe Feb 27 '19 at 17:05