私は LaTeX で定型レターを書いています。アドレスは外部データ ソースから取得されます。問題は、データ ソース (下記参照) に空のフィールドが (実際にはかなり頻繁に) 発生することです。したがって、\def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\
行は\expandafter\chopline\zeile\\
何らかの理由で、カンマの後ろに少なくとも 1 つの文字を期待し、それを消費します。1 つのフィールドにデータがない場合、カンマを「消費」して次のデータ フィールドを含め、完全な混乱を引き起こします。この問題を軽減する方法についてアドバイスをいただければ助かります。
また、この例は以前コピーしたもので、すべてのコマンドとその意味を理解しているわけではありません。私が使用している構造はかなり古く、希望する動作を実装する最も安全な方法ではないのではないかという印象を受けます。LuaLaTeX が提供するより高度なツールを使用して、フォーム レターを実装するコードを改善できますか?
コードは次のとおりです:
\documentclass{scrlttr2}
\usepackage{etoolbox}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}
\setmonofont{Linux Libertine Mono O}
\def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\{
\def\lastname{#1}
\def\firstname{#2}
\def\fanilyname{#3}
\def\addrsuppa{#4}
\def\street{#5}
\def\addrsuppb{#6}
\def\postcode{#7}
\def\town{#8}
}
\newif\ifmore \moretrue
\begin{document}
\setkomavar{subject}{Subject}
\newread\quelle
\openin\quelle=../teilnehmer.csv
\read\quelle to \zeile
\loop
\read\quelle to \zeile
\ifeof\quelle
\global\morefalse
\else
\expandafter\chopline\zeile\\
\begin{letter}{\firstname\ \lastname \\
\postcode\ \town}
\opening{Sehr geehrte Familie \lastname,}
[content]
\closing{Best regards}
\end{letter}
\fi
\ifmore\repeat
\closein\quelle
\end{document}
ここにデータ ソースがあります (ダミーがいくつか含まれています)。
last_name,first_name,family_name,address_supplement_1,street,address_supplement_2,postcode,town,telephone_1,telephone_2,mail
Barnes,Helen,,Apartment 3,Potsdamer Platz 10,Neukölln,99823,Görlitz,3714 2487824,8797 9717692,[email protected]
Thomas,Brandon,,,Dorfstraße 34d,,20903,Aachen,9214 3252403,,[email protected]
Kelley,Juan,,,Hauptstraße 11,,00495,Hamburg,6265 9683011,6263 6235169,[email protected]
Fisher,Anne,,,Berliner Straße 99,,39856,Oldenburg,0666 6226586,7917 5816244,
Sanchez,Martha,Miller,,Mittelweg 23,,11932,Leverkusen,3728 6123496,,[email protected]
Morrison,Daniel,,,Schulstraße 8,,11943,Neustadt,9589 2520624,
Brown,David,Clark,Room 42,Bahnhofstraße 12,Amorbach,12821,Neckarsulm,9304 3674329,,[email protected]
Graham,Frank,,,Lindenallee 19,,32956,Neustadt,,,[email protected]
Price,Douglas,,,Mühlweg 5e,,04923,Neustadt,7934 4700638,7689 9255281,[email protected]
答え1
ここで解決策を紹介しますdatatool
(データが にあると仮定しtest.csv
、必要に応じて変更します):
\documentclass{scrlttr2}
\usepackage{etoolbox}
\usepackage{fontspec}
\setmainfont{Liberation Sans}% (I don't have the fonts from the original MWE)
\usepackage{datatool}
\DTLloaddb{mydata}{test.csv}
\begin{document}
\setkomavar{subject}{Subject}
\DTLforeach*{mydata}%
{\LastName=last_name,\FirstName=first_name,%
\AddrI=address_supplement_1,\Street=street,%
\AddrII=address_supplement_2,\PostCode=postcode,\Town=town}%
{%
\begin{letter}{\FirstName\ \LastName\\%
\DTLifnullorempty{\AddrI}{}{\AddrI\\}%
\DTLifnullorempty{\Street}{}{\Street\\}%
\DTLifnullorempty{\AddrII}{}{\AddrII\\}%
\PostCode\\\Town}
\opening{Sehr geehrt Familie \LastName,}
[content]
\closing{Best regards}
\end{letter}
}
\end{document}