datatool 套件中的類別字母錯誤

datatool 套件中的類別字母錯誤

我想自動寫 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}

它適用於 5 個字母中的 3 個......並且我無法理解文件中的錯誤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

你有三個問題:

  1. 沒有\fromname定義;
  2. 你以 開始\begin{letter}並結束\end{lettre};
  3. 由於您要排除電子郵件地址,因此您應該刪除為 指定的欄位清單中的最後一個逗號\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}

問題是 \close 指令,我不知道為什麼。這是一種解決方法,一個糟糕的方法...

相關內容