Пакетjwjournal

Пакетjwjournal

Как следует из названия, я хотел бы использовать 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.

Связанный контент