正如標題所暗示的,我想使用 LaTeX 來寫個人日記。我一直將我的條目轉儲到一個文件中,隨著時間的推移,該文件變得難以處理。理想情況下,我會找到一個套件(或 shell 腳本的集合),它可以幫助我維護一致的目錄結構並自動為條目加上各自的日期標題。
我在 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
,格式為 例如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
請注意, to的轉換January 1, 2023
是自動的,而且它還會計算出該日期Sunday
(由 完成的計算projlib-date
目前僅適用於現代日期,但這在這裡應該不是問題)。該功能具有多語言支持,因此如果您\UseLanguage{French}
在序言中寫入,結果將是這樣的:
至於顏色,一週中的每一天都有對應的顏色,當然可以依照自己的喜好進行修改:
我在README文件中寫了詳細的解釋,還有英文、法文和中文的三個示範文件。
關於日常使用
關於日常使用,我更喜歡將每個月的日記保存在單獨的文件中,所以journal-2023-01.tex
,journal-2023-02.tex
等等(因為我每天只寫幾句話)。
當然,也可以將每天的日誌寫入單獨的(子)檔案中,並將它們輸入到主目錄中。這樣每個子文件都會像
2023-01-01 Weather --- Location
Some text...
…
由於它很重要,我將在這裡重複自述文件中已經指出的這一點:
主要功能是透過 LaTeX3 的正規表示式功能來實現的。它逐段掃描內容並將識別的模式轉換為相應的 TeX 命令。 [...] 然而,這是有代價的:為了掃描內容,它首先儲存在巨集中
\g_jwjournal_content_tl
,這意味著您不能使用像\verb
在正文中那樣的命令。
但是,如果您確實需要輸入代碼,\lstinline
則從包中listings
似乎可以正常工作。
關於班級名稱和致謝
有人可能會認為類別名稱來自我自己的名字J在w嗯,不過其實是因為我的大學室友Jiawei(這個幸運的巧合促使我為這個類別命名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。