빈 필드가 있는 csv 데이터가 포함된 LaTeX 문서

빈 필드가 있는 csv 데이터가 포함된 LaTeX 문서

라텍스로 양식 편지를 쓰고 있습니다. 주소는 외부 데이터 소스에서 가져옵니다. 문제는 데이터 소스(아래 참조)에 빈 필드가 실제로 매우 자주 발생한다는 것입니다. 따라서 \def\chopline#1,#2,#3,#4,#5,#6,#7,#8 \\줄 때문에 \expandafter\chopline\zeile\\쉼표 뒤에 적어도 하나의 문자가 있을 것으로 예상하고 이를 소비합니다. 한 필드에 데이터가 없으면 쉼표만 "먹고" 다음 데이터 필드를 포함하게 되어 완전히 혼란스러워집니다. 문제를 완화하는 방법에 대한 조언이 도움이 될 것입니다.

게다가, 나는 이 예제를 얼마 전에 복사했는데 모든 명령과 그 의미를 이해하지 못합니다. 내가 사용하는 구조는 다소 오래되었고 내가 원하는 동작을 구현하는 가장 안전한 방법이 아닐 수도 있다는 인상을 받았습니다. 양식 편지를 구현하는 코드를 개선하기 위해 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}

관련 정보