如何寫一本字母彙編的書

如何寫一本字母彙編的書

我想用 LaTeX 寫一本由幾封信組成的書。

我嘗試了以下方法:

  • 主要文件是書籍類型:

\documentclass[a4paper,12pt,twoside]{book}
\usepackage[utf8]{inputenc}
\usepackage[spanish,es-tabla]{babel}
\usepackage[T1]{fontenc}
\usepackage{pdfpages}
\usepackage{listings}
\usepackage{fancyhdr}
\title{TITLE}
\author{ME}
\date{}
\begin{document}
\maketitle
\tableofcontents
\chapter{1942}
\section{Julio}
\includepdf[pages=-,pagecommand=\thispagestyle{fancy}]{Carta1}
\end{document}
  • 此主文檔包括從以下位置取得的 PDF 頁面Carta1.tex

\documentclass[a4paper,12pt]{letter}
\longindentation=0pt 
\usepackage[utf8]{inputenc}
\usepackage[spanish,es-tabla]{babel}
\signature{Me}
\address{This place}
\date{1 1 1111}
\begin{document}
\begin{letter}{}
\opening{Dear you:}
\dots
\closing{Bye,}
\ps{PS}
\end{letter}
\end{document}

然而,由於以下原因,這種方法對我來說不可用:

  1. 每封信都來自 PDF,這意味著它將插入到主文件的不同頁面中。這樣,當有新的章節或章節時,該頁面將只包含該章節或章節的標題,字母在下一頁,看起來很糟糕。

  2. 會有數百封信,這意味著有數百份簡短的獨立.tex文件,我不喜歡這樣,因為它會變得太混亂。這意味著例如我無法在單一文件中搜尋和替換。

請讓我知道我可以嘗試什麼。

答案1

這是一個非常快速且骯髒的解決方案,經過了非常簡單的測試。基本上我已經拆解了它letter.cls的大部分程式碼並將其放入包形式中。然後你就可以使用letter書中的環境了。我使用代碼letter.cls只是為了方便。如果您還沒有輸入任何字母,那麼您無需letter直接使用類別代碼,而是製作一個包含letter環境的更簡單的包,以及您需要的任何其他標記命令(\to\from\opening\closing等) 。 :信件內部不會有單獨的頁碼,例如,您使用pdfpages;包含它們。如果您需要該方法,則需要進行一些重大修改。

如果您確實有數百個字母,在我看來,最好將每個字母儲存為單獨的檔案(基本上只是環境letter),使用 CSV 形式的 Excel 電子表格追蹤它們,然後使用datatool這些\input檔案。我認為這將使管理比單一巨大文件容易得多。

letter-package.sty

\ProvidesPackage{letter-package}[2019/08/09 package version of letter.cls]
% The following code is taken directly from the letter.cls 
% The {letter} environment has been simplified for inclusion into another document
% Proof of concept. Very lightly tested. Use at your own risk.
% It’s likely this code could be simplified further but using the actual code
% from the class allows a kind of backwards compatibility.
% 
\newenvironment{letter}[1]
  {\@processto{\leavevmode\ignorespaces #1}}
  {\par}
\long\def\@processto#1{%
  \@xproc #1\\@@@%
  \ifx\toaddress\@empty
  \else
    \@yproc #1@@@%
  \fi}
\long\def\@xproc #1\\#2@@@{\def\toname{#1}\def\toaddress{#2}}
\long\def\@yproc #1\\#2@@@{\def\toaddress{#2}}

\DeclareRobustCommand\@nobreakvspace
   {\@ifstar\@nobreakvspacex\@nobreakvspacex}
\def\@nobreakvspacex#1{%
  \ifvmode
    \nobreak\vskip #1\relax
  \else
    \@bsphack\vadjust{\nobreak\vskip #1}\@esphack
  \fi}
\def\@nobreakcr{\@ifstar{\@normalcr*}{\@normalcr*}}
\newdimen\longindentation
\longindentation=.5\textwidth
\newdimen\indentedwidth
\indentedwidth=\textwidth
\advance\indentedwidth -\longindentation
\newcommand*{\name}[1]{\def\fromname{#1}}
\newcommand*{\signature}[1]{\def\fromsig{#1}}
\newcommand*{\address}[1]{\def\fromaddress{#1}}
\newcommand*{\location}[1]{\def\fromlocation{#1}}
\newcommand*{\telephone}[1]{\def\telephonenum{#1}}
\name{}
\signature{}
\address{}
\location{}
\telephone{}
\newcommand*{\opening}[1]{\ifx\@empty\fromaddress
    {\raggedleft\@date\par}%
  \else  % home address
    {\raggedleft\begin{tabular}{l@{}}\ignorespaces
      \fromaddress \\*[2\parskip]%
      \@date \end{tabular}\par}%
  \fi
  \vspace{2\parskip}%
  {\raggedright \toname \\ \toaddress \par}%
  \vspace{2\parskip}%
  #1\par\nobreak}
\newcommand{\closing}[1]{\par\nobreak\vspace{\parskip}%
  \stopbreaks
  \noindent
  \ifx\@empty\fromaddress\else
  \hspace*{\longindentation}\fi
  \parbox{\indentedwidth}{\raggedright
       \ignorespaces #1\\[6\medskipamount]%
       \ifx\@empty\fromsig
           \fromname
       \else \fromsig \fi\strut}%
   \par}
\medskipamount=\parskip
\newcommand*{\cc}[1]{%
  \par\noindent
  \parbox[t]{\textwidth}{%
    \@hangfrom{\normalfont\ccname: }%
    \ignorespaces #1\strut}\par}
\newcommand*{\encl}[1]{%
  \par\noindent
  \parbox[t]{\textwidth}{%
    \@hangfrom{\normalfont\enclname: }%
    \ignorespaces #1\strut}\par}
\newcommand*{\stopbreaks}{%
  \interlinepenalty\@M
  \def\par{\@@par\nobreak}%
  \let\\\@nobreakcr
  \let\vspace\@nobreakvspace}
\DeclareRobustCommand\@nobreakvspace
   {\@ifstar\@nobreakvspacex\@nobreakvspacex}
\def\@nobreakvspacex#1{%
  \ifvmode
    \nobreak\vskip #1\relax
  \else
    \@bsphack\vadjust{\nobreak\vskip #1}\@esphack
  \fi}
\def\@nobreakcr{\@ifstar{\@normalcr*}{\@normalcr*}}
\newcommand*{\startbreaks}{%
  \let\\\@normalcr
  \interlinepenalty 200%
  \def\par{\@@par\penalty 200\relax}}
\newcommand*{\ps}{\par\startbreaks}
\newcommand*{\stopletter}{}
\newcommand*{\returnaddress}{}
\newcommand*{\ccname}{cc}
\newcommand*{\enclname}{encl}
\newcommand*{\pagename}{Page}
\newcommand*{\headtoname}{To}
\endinput

樣本文件

\documentclass[a4paper]{book}
\usepackage[margin=2cm]{geometry}
\usepackage{letter-package}
\usepackage{kantlipsum}
\begin{document}
\chapter{A chapter}
\begin{letter}{}
\signature{Me}
\address{This place}
\date{1 1 1111}

\opening{Dear you:}
\kant[1]
\closing{Bye,}
\ps{PS}
\end{letter}
\begin{letter}{}
\signature{Someone}
\address{That place}
\date{2 2 2222}

\opening{Dear person:}
\kant[2]
\closing{Yours truly,}
\ps{PS}
\end{letter}
\end{document}

程式碼的輸出

相關內容