Я хотел бы автоматически написать 5 писем с \documentclass[10pt]{lettre}
. У меня есть CSV-файл со всей информацией о получателях в mail_bd2.csv
виде:
Titre,Apostrophe,Prenom,Nom,Organisme,Rue,Ville
Monsieur,Cher,machin, truc, lala,13 rue du Four, 15478 LALA
и мой .tex
документ:
\documentclass[10pt]{lettre}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{datatool}
% Adjust margins for aesthetics
\addtolength{\voffset}{4cm}
\makeatletter
\newcommand*{\NoRule}{\renewcommand*{\rule@length}{0}}
\makeatother
\date{\today} % Date of the letter
\begin{document}
\DTLloaddb{adresses}{mail_bd2.csv}
% Initialisation des variables à utiliser par champ
\DTLforeach{adresses}{
\titre=Titre,
\apo=Apostrophe,
\prenom=Prenom,
\nom=Nom,
\org=Organisme,
\rue=Rue,
\ville=Ville,
%\mail=Email
}{
\begin{letter}{\titre{} \prenom{} \textsc{\nom}\\
\org\\
\rue\\
\textsc{\ville}}
\NoRule
\opening{\apo{} \prenom{},}
blablablabalbalbab
\closing{Veuillez agréer, \MakeLowercase{\apo{}} \prenom{}, l'expression de mes
sentiments les meilleurs.}
\end{lettre}
}
\end{document}
Это работает для 3 из 5 букв... и я не могу понять ошибку в log
файле:
l.66 }
Your command was ignored.
Type I <command> <return> to replace it with another command,
or <return> to continue without it.
! Too many }'s.
<argument> ...db@row@elt@end@ }{\@dtl@after }\fi }
{}\csname @dtl@endhook@\th...
l.66 }
You've closed more groups than you opened.
Such booboos are generally harmless, so keep going.
! Extra \else.
\@iwhilesw ...i ->#1\expandafter \@iwhilesw \else
\@gobbletwo \fi {#1}\fi
l.66 }
I'm ignoring this; it doesn't match any \if.
! Extra \else.
\@iwhilesw ...i ->#1\expandafter \@iwhilesw \else
\@gobbletwo \fi {#1}\fi
l.66 }
I'm ignoring this; it doesn't match any \if.
Runaway argument?
\@nil \@@ {adresses}\fi \ifthenelse {\boolean {true}}{\refstepcounter \ETC.
! Paragraph ended before \@dtl@next was complete.
<to be read again>
\par
l.66 }
I suspect you've forgotten a `}', causing me to apply this
control sequence to too much text. How can we recover?
My plan is to forget the whole thing and hope for the best.
Class lettre Message: Lettre 3.
[1
] (/usr/local/texlive/2014/texmf-dist/tex/latex/lettre/default.ins
Class lettre Message: Adresse precisee.
Class lettre Message: Numero de telephone precise.
Class lettre Message: Numero de fax precise.
Class lettre Message: Lieu precise.
)
Class lettre Message: Adresse precisee.
Class lettre Message: Numero de telephone precise.
Class lettre Message: Numero de fax supprime.
Class lettre Message: Numero d'E-Mail precise.
Class lettre Message: Lieu precise.
Class lettre Message: Signature simple.
! LaTeX Error: \begin{letter} on input line 66 ended by \end{lettre}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.66 }
Your command was ignored.
Type I <command> <return> to replace it with another command,
or <return> to continue without it.
! Too many }'s.
\@iwhilesw ...@iwhilesw \else \@gobbletwo \fi {#1}
\fi
l.66 }
You've closed more groups than you opened.
Such booboos are generally harmless, so keep going.
Class lettre Message: Nombre de lettres :3.
Class lettre Message: Nombre de telefax :0.
[2
] (./test_lettre.aux) )
(\end occurred when \ifnum on line 66 was incomplete)
(\end occurred when \ifnum on line 66 was incomplete)
(\end occurred when \ifnum on line 66 was incomplete)
Here is how much of TeX's memory you used:
5938 strings out of 493108
78082 string characters out of 6134853
189754 words of memory out of 5000000
9273 multiletter control sequences out of 15000+600000
6529 words of font info for 20 fonts, out of 8000000 for 9000
1141 hyphenation exceptions out of 8191
46i,7n,38p,798b,439s stack positions out of 5000i,500n,10000p,200000b,80000s
{/usr/local/texlive/2014/t
exmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc}</usr/local/texlive/2014/tex
mf-dist/fonts/type1/public/cm-super/sfcc1000.pfb></usr/local/texlive/2014/texmf
-dist/fonts/type1/public/cm-super/sfrm1000.pfb></usr/local/texlive/2014/texmf-d
ist/fonts/type1/public/cm-super/sfti1000.pfb></usr/local/texlive/2014/texmf-dis
t/fonts/type1/public/cm-super/sftt1000.pfb>
Output written on test_lettre.pdf (3 pages, 81465 bytes).
PDF statistics:
31 PDF objects out of 1000 (max. 8388607)
21 compressed objects within 1 object stream
0 named destinations out of 1000 (max. 500000)
1 words of extra memory for PDF output out of 10000 (max. 10000000)
кто-нибудь может помочь?
решение1
У вас три проблемы:
- Определения нет
\fromname
; - Вы начинаете с
\begin{letter}
и заканчиваете на\end{lettre}
; - Поскольку вы исключаете адрес электронной почты, вам следует удалить последнюю запятую в списке полей, указанных для
\DTLforeach{<db>}{<list>}{..}
, в противном случаеdatatool
ожидается что-то. И это что-то не может быть пустым.
Вот как должен выглядеть ваш документ:
\documentclass[10pt]{lettre}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{datatool}
% Adjust margins for aesthetics
\addtolength{\voffset}{4cm}
\makeatletter
\newcommand*{\NoRule}{\renewcommand*{\rule@length}{0}}
\makeatother
\date{\today} % Date of the letter
\begin{document}
\newcommand*\fromname{Someone Special}
\DTLloaddb{adresses}{mail_bd2.csv}
% Initialisation des variables à utiliser par champ
\DTLforeach{adresses}{
\titre=Titre,
\apo=Apostrophe,
\prenom=Prenom,
\nom=Nom,
\org=Organisme,
\rue=Rue,
\ville=Ville%,
%\mail=Email
}{
\begin{letter}{\titre{} \prenom{} \textsc{\nom}\\
\org\\
\rue\\
\textsc{\ville}}
\NoRule
\opening{\apo{} \prenom{},}
blablablabalbalbab
\closing{Veuillez agréer, \MakeLowercase{\apo{}} \prenom{}, l'expression de mes
sentiments les meilleurs.}
\end{letter}
}
\end{document}
Вот как должно выглядеть письмо, если вы не используетеdatatool
(просто для наглядности):
Вот тот же документ, воспроизведенныйбезкласс lettre
, но вместо этого используется значение по умолчанию article
(и datatool
):
\documentclass[10pt]{article}
\usepackage{filecontents}
\begin{filecontents*}{mail_bd2.csv}
Titre,Apostrophe,Prenom,Nom,Organisme,Rue,Ville
Monsieur,Cher,machin, truc, lala,13 rue du Four, 15478 LALA
\end{filecontents*}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{datatool}
% Adjust margins for aesthetics
\usepackage{geometry}
\geometry{%
margin=1.875in,
top=3in
}
\setlength{\parindent}{0pt}% No paragraph indent
\begin{document}
\newcommand*\fromname{Someone Special}
\DTLloaddb{adresses}{mail_bd2.csv}
% Initialisation des variables à utiliser par champ
\DTLforeach{adresses}{
\titre=Titre,
\apo=Apostrophe,
\prenom=Prenom,
\nom=Nom,
\org=Organisme,
\rue=Rue,
\ville=Ville%
}{
\clearpage\thispagestyle{empty}%
\hspace*{-1.25in}%
\begin{tabular}[t]{@{}l}
B.I.D.O.N \\
Rue Des Mots \\
80886 Sassonne-le-Creux \\[\normalbaselineskip]
Tél.: 987.64.20 \\
Fax.: 987.75.31
\end{tabular}
\hfill
\begin{tabular}[t]{l@{}}
Sassonne-le-Creux, \today
\end{tabular}
\bigskip
\mbox{}\hfill
\begin{tabular}{l@{}}
\phantom{Sassonne-le-Creux, \today} \\[-\normalbaselineskip]
\titre{} \prenom{} \textsc{\nom} \\
\org \\
\rue \\
\textsc{\ville}
\end{tabular}
\vspace{2in}
\apo{} \prenom{},
\medskip
blablablabalbalbab
\bigskip\bigskip
Veuillez agréer, \MakeLowercase{\apo{}} \prenom{}, l'expression de mes sentiments les meilleurs.
\vspace{1.25in}
\hfill
\fromname
}
\end{document}
Довольно просто воспроизвести это lettre
поведение, используя что-то, не требующее несколько неудобного интерфейса (на мой взгляд).
решение2
\documentclass[10pt]{lettre}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{datatool}
% Adjust margins for aesthetics
\addtolength{\voffset}{4cm}
\makeatletter
\newcommand*{\NoRule}{\renewcommand*{\rule@length}{0}}
\makeatother
\date{\today} % Date of the letter
\providecommand{\mclosing}[1]{
\protect #1
}
\begin{document}
\DTLsetseparator{,}
% \DTLloadrawdb{adresses}{mail-bd2.csv}
\DTLloadrawdb[keys={Titre,Apostrophe,Prenom,Nom,Organisme,Rue,Ville}]{adresses}{mail-bd2.csv} %took more robost loaddb
\DTLforeach{adresses}{\Titre=Titre,\Apostrophe=Apostrophe,\Prenom=Prenom,\Nom=Nom,\Organisme=Organisme,\Rue=Rue,\Ville=Ville}
{%
\begin{letter}{\Titre \Prenom \textsc{\Nom}\\ %Some spellingerrors
\Organisme \\
\Rue\\
\textsc{\Ville}}
\NoRule
\opening{\Apostrophe \Prenom,}
blablablabalbalbab
% \closing{Veuillez agréer, \MakeLowercase{\Apostrophe} \Prenom, l'expression de messentiments les meilleurs.} % here is the problem
\mclosing{Veuillez agréer, \MakeLowercase{\Apostrophe} \Prenom, l'expression de messentiments les meilleurs.}
\end{letter} \newpage %Some spellingerrors
}%
\end{document}
Проблема в команде \closing, не знаю почему. Это обходной путь, плохой...