Как следует из названия, я хотел бы использовать LaTeX для ведения личного дневника. Я сбрасывал свои записи в один файл, который со временем стал громоздким. В идеале я бы нашел пакет (или набор скриптов оболочки), который помог бы мне поддерживать согласованную структуру каталогов и автоматически снабжать записи заголовками с соответствующей датой.
Я не нашел ничего подходящего в репозитории CTAN, поэтому обращаюсь к вам за советом. Если нет готового решения, я, возможно, сяду и научусь создавать пользовательские пакеты.
Большое спасибо!
решение1
Поскольку вы пока не можете комментировать, вот предложение с использованием tufte-latex
класса и пользовательской среды. Это просто то, что я придумал, вы можете отредактировать свой вопрос, чтобы указать, какой формат и функции вам нужны. Пакет lipsum
просто используется для некоторого фиктивного текста.
\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}
Редактировать 1:Вот автоматизированная версия. Она предполагает, что ваш каталог имеет форму /Year/Month/Day.tex
, отформатированную как eg 2012/Aug/24.tex
, поэтому месяц — это только первые три буквы. Отдельные .tex
файлы имеют только требование иметь первую строку как \mytitle{<The actual title here>}
.
Это решение используетПитер Гриллответ на "Как перебрать имена файлов в папке".
Основной файл:
\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}
Пример файла записи журнала:
\mytitle{Something happened}
\lipsum[3-5]
Выход:
решение2
Мой новый код для дневников выглядит следующим образом. Он добавляет заметку сбоку, но без коробки, потому что использует пакет marginnote
.
Файл средыinput.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}
Файлы дневника хранятся в отдельной папке, например, 2013
а файлы хранятся в ней. Пример файла дневника 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}
Основной файл
\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}
Выход
Приложение
Чтобы использовать оранжевую боковую панель слева, а не справа, input.tex
файл был перекомпонован следующим образом:
\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}
И вывод такой:
решение3
Этот ответ не решает проблему управления файлами, но предлагает новый способ ведения дневников с помощью LaTeX, поэтому я все равно разместил его здесь.
Пакетjwjournal
Теперь есть новый класс документаjwjournal
для ведения дневников, доступно на CTAN.
Его главный принцип — простота. Он позволяет превратить простой текстовый ввод, например
2023-01-01 Sunny --- Botanical Garden
Today I visited the botanical garden!
[Food] And had ice-cream for lunch!
в красочный журнал, как этот:
color entry
в качестве альтернативы, с включенной опцией класса :
Для тех, кто привык к другим форматам даты, таким как mm-dd-yyyy
или dd-mm-yyyy
, вы можете использовать опцию класса month-day-year
или day-month-year
и записать строку даты так, как вы это обычно делаете.
Его также можно использовать /
вместо -
в строке даты.
Обратите внимание, что преобразование в 2023-01-01
происходит January 1, 2023
автоматически, и оно также вычислит, что эта дата равна Sunday
(вычисление, выполненное projlib-date
, в настоящее время работает только для современных дат, но здесь это не должно быть проблемой). Эта функция имеет многоязыковую поддержку, поэтому, если вы напишете \UseLanguage{French}
в преамбуле, результат будет таким:
Что касается цвета, то каждому дню недели соответствует свой цвет, который, конечно же, можно изменить по вашему желанию:
Я написал подробное объяснение в файле README, а также есть три демонстрационных документа на английском, французском и китайском языках соответственно.
О ежедневном использовании
Что касается ежедневного использования, я предпочитаю хранить ежемесячные журналы в отдельных файлах, например journal-2023-01.tex
, , journal-2023-02.tex
, и т. д. (так как я пишу только несколько предложений в день).
Конечно, также возможно записывать журнал каждого дня в отдельные (под)файлы и вводить их в главный каталог. Таким образом, каждый подфайл будет таким же чистым, как
2023-01-01 Weather --- Location
Some text...
...
И поскольку это важно, я повторю здесь этот момент, уже отмеченный в README:
Основные функции достигаются с помощью мощи регулярных выражений LaTeX3. Он сканирует содержимое абзац за абзацем и преобразует распознанные шаблоны в соответствующие команды TeX. [...] Однако это имеет свою цену: для сканирования содержимого оно сначала сохраняется в макросе
\g_jwjournal_content_tl
, что означает, что вы не можете использовать команды, как\verb
в вашем основном тексте.
Однако если вам действительно нужно ввести код, \lstinline
пакет, listings
похоже, работает нормально.
О названии класса и подтверждении
Можно подумать, что название класса произошло от моего собственного имени.Дж.вжru, но на самом деле это из-за моего соседа по комнате в колледжеДж.яжei (это удачное совпадение побудило меня назвать этот класс jw...
). Он предложил мне сделать что-то с LaTeX, чтобы помочь вести дневники, и предложил текущий синтаксис (он также предложил, чтобы день недели вычислялся автоматически после указания даты, что действительно заставило меня задуматься на некоторое время). Таким образом, я хотел бы выразить ему свою благодарность, без которого этот проект не появился бы на свет.
решение4
Посмотри наhttps://ankursinha.in/2016/03/05/calliope-helping-you-keep-a-diary-in-latex.html.
Это простой скрипт bash, который упрощает использование LaTeX для ведения журнала — наиболее полезен для ведения исследовательских журналов! Исходный код находится наhttps://github.com/sanjayankur31/calliope.