von Gast » Di 2. Jul 2019, 09:03
Zunächst einmal ist Dein Beispiel schon so leider nicht lauffähig. Bitte ersetze externe Abbildungen grundsätzlich wie in der
Minimalbeispiel-Anleitung explizit angegeben!
Dann enthält die Kopfzeile der Daten ein Leerzeichen, so dass LEIT_ID nicht gefunden wird. Außerdem gibt es eine Zeile mit leeren Feldern, die auch raus sollte.
latin1 verwendet heute übrigens kein LaTeX-Editor mehr in der Voreinstellung. Also besser alles UTF8 codieren und dann utf8 als Option angeben. Seit über einem Jahr braucht LaTeX dann übrigens gar kein inputenc mehr.
Option pdftex sollte man grundsätzlich weglassen. Das können die Pakete selbst erkennen und bei Verwendung von anderen Engines stört es nur.
Wenn man dann die \DTLforeach-Schleife aktiviert, hat man das Problem, dass \ExplSyntaxOn innerhalb eines Arguments eines Befehls steht. Das funktioniert natürlich nicht, weil das Argument bereits gelesen ist, bevor die catcodes umgeschaltet werden können. Das macht aber eigentlich auch nichts, weil nämlich \StrLeft bereits selbst expandiert, wie der Anleitung zu [d]xstring[/d] zu entnehmen ist. Wäre dem nicht so, müsste man eben eine Anwenderanweisung schreiben, die intern dann l3-Anweisungen nutzt. Dann aber besser gleich auch noch
xstring eliminieren. Aber wie gesagt, das braucht es IMO nicht. Und dann wäre es natürlich gut, wenn die Maßangaben der inneren picture-Umgebung halbwegs stimmen würden. Sonst funktioniert es nicht, mehrere davon sauber hinter- und untereinander auszugeben. Wobei die äußere picture-Umgebung IMHO eher stört. Insgesamt landet man dann beispielsweise bei:
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.csv}
LEIT_ID;Alt_Bez;Neu_Bez;verbal_Bezeichnung
30005;B 0012;M 3452 0 0E 0;Datensatz 1
30006;D 5002;M 8967 0 0E 0;Datensatz 2
306;M 9986;M 7892 0 XX 0;Datensatz 3
308;D 8752;D 5821 0 XX 0;Datensatz 4
309;T 0036;M 8897 0 09 0;Datensatz 5
\end{filecontents*}
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}% Nur für veraltete LaTeX-Installationen wie Overleaf
\usepackage{graphicx}
\usepackage{textcomp}
\usepackage{qrcode}
\usepackage{datatool}
\usepackage{algorithm2e}
\usepackage{xstring}
\usepackage{xifthen}
\usepackage{xparse}
\usepackage{etoolbox}
% Seiten-Layout (Anmerkung: Besser geometry verwenden!)
\setlength{\textwidth}{7in}
\setlength{\hoffset}{0in}
\setlength{\voffset}{0in}
\setlength{\oddsidemargin}{-.8in}
\setlength{\evensidemargin}{-.8in}
\setlength{\textheight}{10in}
\setlength{\topmargin}{-1in}
% Mit diesem Kommando legt man fest, dass man
% z.B. keine Seitennummerierung haben will.
\pagestyle{empty}
%Messtellenklassifikation in Makro fassen
\newcommand*{\msArt}[1]{%
\IfStrEqCase{#1}{%
{M}{\renewcommand{\vMS}{MS-Art 1}}%
{D}{\renewcommand{\vMS}{MS-Art 2}}%
{B}{\renewcommand{\vMS}{MS-Art 3}}%
{T}{\renewcommand{\vMS}{MS-Art 4}}%
}[{\renewcommand{\vMS}{Undefinierte MS-Art}}]%
}
% Jetzt geht das eigentliche Dokument los:
\begin{document}
% Wir wollen immer als Einheit Millimeter verwenden.
\setlength{\unitlength}{1mm}
%Lade die entsprechende CSV_Tabelle mit den Messstellendaten
\DTLsetseparator{;}
\DTLloaddb{Messstellen}{\jobname.csv}
%Setze Standartwert 'Undefiniert' auf Variable um später mit \renewcommand neu besetzen zu können
\newcommand{\vBez}{M}
\newcommand{\vBezE}{M}
\newcommand{\vBezEE}{M}
\newcommand{\vMS}{M}
%Sinn der Zeilen Prüfen!
% Diese Kommando legt fest, dass ein Bild der angegebenen
% Groesse erzeugt werden soll.
%\begin{picture}(178,253)(-7,-1)
% Teile das Blatt in fuenf 51mm hohe,
% unteineinander liegenden Zeilen.
%\multiput(0,0)(0,51){5}{
% Nun wird jede Zeile in zwei 89mm breite
% Spalten geteilt.
%\multiput(0,0)(89,0){2}{
% In die nun erzeugten Kaesten sollen Bilder ``gemalt'' werden,
% die eine groesse von 51mm mal 89mm haben. Das ist dann die
% Groesse der Visitenkarten.
\noindent
\DTLforeach*{Messstellen}{\LEIT=LEIT_ID,%
\aBez=Alt_Bez,%
\nBez=Neu_Bez,%
\verBez=verbal_Bezeichnung}{%
%
%Alternativdefinition zum Code-Testen
%\newcommand{\LEIT}{30000}
%\newcommand{\aBez}{M 0815}
%\newcommand{\nBez}{M 2000 3 00 2}
%\newcommand{\verBez}{verbale Bezeichnung 1}
%
\begin{picture}(89,51)(0,0)
%Setze Linien die das Schild in 4 Bereiche unterteilen
\put(50,0){\line(0,1){51}}
\put(0,25.5){\line(1,0){89}}
% Fülle oberes linkes Feld -----------------------------------------------------------------
% In der Voreinstellung expandiert \StrLeft bereits
\StrLeft{\nBez}{1}[\firstletter]
% Suche entsprechend des \firstletter die entsprechende Messstellenart raus und plotte sie
\msArt{\firstletter}
\put(5,43){\underline{\textbf{\vMS}}}
% Definiere die Variable \sLen und Belege sie mit der Länge der verbalen Bezeichnung in mm
\ifdefined\sLen \settowidth{\sLen}{\verBez}
\else \newlength{\sLen} \settowidth{\sLen}{\verBez}
\fi
% Prüfe die Länge der verbalen Bezeichnung und ob ein Zeilenumbruch noetig ist
\ifdim\sLen < 40 mm \renewcommand{\vBez}{\verBez}
\put(5,34){\vBez}
\else \ifdim\sLen > 80 mm \renewcommand{\vBez}{\StrLeft{\verBez}{23}}
\renewcommand{\vBezE}{\StrMid{\verBez}{24}{48}}
\renewcommand{\vBezEE}{\StrMid{\verBez}{49}{72}}
\put(5,34){\vBez}
\put(5,30){\vBezE}
\put(5,26){\vBezEE}
\else \renewcommand{\vBez}{\StrLeft{\verBez}{23}}
\renewcommand{\vBezE}{\StrMid{\verBez}{24}{40}}
\put(5,34){\vBez}
\put(5,30){\vBezE}
\fi
\fi
% Fülle unteres linkes Feld ----------------------------------------------------------------
\put(5,20){\underline{\textbf{Bezeichnung}}}
\put(5,10){\LARGE \nBez}
\put(5,3){\small \textsf{(Alt : \aBez)}}
% Fülle oberes rechtes Feld ----------------------------------------------------------------
\put(56,28){\includegraphics[width=28mm,height=20mm]{example-image}}
% Fülle unteres rechtes Feld ---------------------------------------------------------------
\put(58,11){\qrset{height=1.5cm}}
\put(58,11){\qrcode{\LEIT - \nBez}}
% AB HIER SOLLTEST DU NICHTS MEHR AENDERN! -------------------------------------------------
% Schnittmarken:
% oben rechts
\put(88.5,50.5){\line(-1,0){3}}
\put(88.5,50.5){\line(0,-1){3}}
% oben links
\put(0.5,50.5){\line(1,0){3}}
\put(0.5,50.5){\line(0,-1){3}}
% unten links
\put(0.5,0.5){\line(1,0){3}}
\put(0.5,0.5){\line(0,1){3}}
% unten rechts
\put(88.5,0.5){\line(-1,0){3}}
\put(88.5,0.5){\line(0,1){3}}
% ENDE der Schnittmarken
% Jetzt muss noch gesagt werden,
% dass man mit allem fertig ist:
\end{picture}\linebreak[3]%
}
%}}
%\end{picture}
\end{document}
Das ist sicher noch nicht minimal. Auch sind sicher noch
signifikante Leerzeichen übrig, die beseitigt gehören. Und eventuell will man die picture-Umgebungen dicht an dicht packen, muss also die Größenangabe nochmal korrigieren. Das sehe ich aber nicht als meine Aufgabe.
Zunächst einmal ist Dein Beispiel schon so leider nicht lauffähig. Bitte ersetze externe Abbildungen grundsätzlich wie in der [m][/m]-Anleitung explizit angegeben!
Dann enthält die Kopfzeile der Daten ein Leerzeichen, so dass [tt]LEIT_ID[/tt] nicht gefunden wird. Außerdem gibt es eine Zeile mit leeren Feldern, die auch raus sollte.
[tt]latin1[/tt] verwendet heute übrigens kein LaTeX-Editor mehr in der Voreinstellung. Also besser alles UTF8 codieren und dann [tt]utf8[/tt] als Option angeben. Seit über einem Jahr braucht LaTeX dann übrigens gar kein [tt]inputenc[/tt] mehr.
Option [tt]pdftex[/tt] sollte man grundsätzlich weglassen. Das können die Pakete selbst erkennen und bei Verwendung von anderen Engines stört es nur.
Wenn man dann die [tt]\DTLforeach[/tt]-Schleife aktiviert, hat man das Problem, dass [tt]\ExplSyntaxOn[/tt] innerhalb eines Arguments eines Befehls steht. Das funktioniert natürlich nicht, weil das Argument bereits gelesen ist, bevor die catcodes umgeschaltet werden können. Das macht aber eigentlich auch nichts, weil nämlich [tt]\StrLeft[/tt] bereits selbst expandiert, wie der Anleitung zu [d]xstring[/d] zu entnehmen ist. Wäre dem nicht so, müsste man eben eine Anwenderanweisung schreiben, die intern dann l3-Anweisungen nutzt. Dann aber besser gleich auch noch [p]xstring[/p] eliminieren. Aber wie gesagt, das braucht es IMO nicht. Und dann wäre es natürlich gut, wenn die Maßangaben der inneren [tt]picture[/tt]-Umgebung halbwegs stimmen würden. Sonst funktioniert es nicht, mehrere davon sauber hinter- und untereinander auszugeben. Wobei die äußere [tt]picture[/tt]-Umgebung IMHO eher stört. Insgesamt landet man dann beispielsweise bei: [code]\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.csv}
LEIT_ID;Alt_Bez;Neu_Bez;verbal_Bezeichnung
30005;B 0012;M 3452 0 0E 0;Datensatz 1
30006;D 5002;M 8967 0 0E 0;Datensatz 2
306;M 9986;M 7892 0 XX 0;Datensatz 3
308;D 8752;D 5821 0 XX 0;Datensatz 4
309;T 0036;M 8897 0 09 0;Datensatz 5
\end{filecontents*}
\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}% Nur für veraltete LaTeX-Installationen wie Overleaf
\usepackage{graphicx}
\usepackage{textcomp}
\usepackage{qrcode}
\usepackage{datatool}
\usepackage{algorithm2e}
\usepackage{xstring}
\usepackage{xifthen}
\usepackage{xparse}
\usepackage{etoolbox}
% Seiten-Layout (Anmerkung: Besser geometry verwenden!)
\setlength{\textwidth}{7in}
\setlength{\hoffset}{0in}
\setlength{\voffset}{0in}
\setlength{\oddsidemargin}{-.8in}
\setlength{\evensidemargin}{-.8in}
\setlength{\textheight}{10in}
\setlength{\topmargin}{-1in}
% Mit diesem Kommando legt man fest, dass man
% z.B. keine Seitennummerierung haben will.
\pagestyle{empty}
%Messtellenklassifikation in Makro fassen
\newcommand*{\msArt}[1]{%
\IfStrEqCase{#1}{%
{M}{\renewcommand{\vMS}{MS-Art 1}}%
{D}{\renewcommand{\vMS}{MS-Art 2}}%
{B}{\renewcommand{\vMS}{MS-Art 3}}%
{T}{\renewcommand{\vMS}{MS-Art 4}}%
}[{\renewcommand{\vMS}{Undefinierte MS-Art}}]%
}
% Jetzt geht das eigentliche Dokument los:
\begin{document}
% Wir wollen immer als Einheit Millimeter verwenden.
\setlength{\unitlength}{1mm}
%Lade die entsprechende CSV_Tabelle mit den Messstellendaten
\DTLsetseparator{;}
\DTLloaddb{Messstellen}{\jobname.csv}
%Setze Standartwert 'Undefiniert' auf Variable um später mit \renewcommand neu besetzen zu können
\newcommand{\vBez}{M}
\newcommand{\vBezE}{M}
\newcommand{\vBezEE}{M}
\newcommand{\vMS}{M}
%Sinn der Zeilen Prüfen!
% Diese Kommando legt fest, dass ein Bild der angegebenen
% Groesse erzeugt werden soll.
%\begin{picture}(178,253)(-7,-1)
% Teile das Blatt in fuenf 51mm hohe,
% unteineinander liegenden Zeilen.
%\multiput(0,0)(0,51){5}{
% Nun wird jede Zeile in zwei 89mm breite
% Spalten geteilt.
%\multiput(0,0)(89,0){2}{
% In die nun erzeugten Kaesten sollen Bilder ``gemalt'' werden,
% die eine groesse von 51mm mal 89mm haben. Das ist dann die
% Groesse der Visitenkarten.
\noindent
\DTLforeach*{Messstellen}{\LEIT=LEIT_ID,%
\aBez=Alt_Bez,%
\nBez=Neu_Bez,%
\verBez=verbal_Bezeichnung}{%
%
%Alternativdefinition zum Code-Testen
%\newcommand{\LEIT}{30000}
%\newcommand{\aBez}{M 0815}
%\newcommand{\nBez}{M 2000 3 00 2}
%\newcommand{\verBez}{verbale Bezeichnung 1}
%
\begin{picture}(89,51)(0,0)
%Setze Linien die das Schild in 4 Bereiche unterteilen
\put(50,0){\line(0,1){51}}
\put(0,25.5){\line(1,0){89}}
% Fülle oberes linkes Feld -----------------------------------------------------------------
% In der Voreinstellung expandiert \StrLeft bereits
\StrLeft{\nBez}{1}[\firstletter]
% Suche entsprechend des \firstletter die entsprechende Messstellenart raus und plotte sie
\msArt{\firstletter}
\put(5,43){\underline{\textbf{\vMS}}}
% Definiere die Variable \sLen und Belege sie mit der Länge der verbalen Bezeichnung in mm
\ifdefined\sLen \settowidth{\sLen}{\verBez}
\else \newlength{\sLen} \settowidth{\sLen}{\verBez}
\fi
% Prüfe die Länge der verbalen Bezeichnung und ob ein Zeilenumbruch noetig ist
\ifdim\sLen < 40 mm \renewcommand{\vBez}{\verBez}
\put(5,34){\vBez}
\else \ifdim\sLen > 80 mm \renewcommand{\vBez}{\StrLeft{\verBez}{23}}
\renewcommand{\vBezE}{\StrMid{\verBez}{24}{48}}
\renewcommand{\vBezEE}{\StrMid{\verBez}{49}{72}}
\put(5,34){\vBez}
\put(5,30){\vBezE}
\put(5,26){\vBezEE}
\else \renewcommand{\vBez}{\StrLeft{\verBez}{23}}
\renewcommand{\vBezE}{\StrMid{\verBez}{24}{40}}
\put(5,34){\vBez}
\put(5,30){\vBezE}
\fi
\fi
% Fülle unteres linkes Feld ----------------------------------------------------------------
\put(5,20){\underline{\textbf{Bezeichnung}}}
\put(5,10){\LARGE \nBez}
\put(5,3){\small \textsf{(Alt : \aBez)}}
% Fülle oberes rechtes Feld ----------------------------------------------------------------
\put(56,28){\includegraphics[width=28mm,height=20mm]{example-image}}
% Fülle unteres rechtes Feld ---------------------------------------------------------------
\put(58,11){\qrset{height=1.5cm}}
\put(58,11){\qrcode{\LEIT - \nBez}}
% AB HIER SOLLTEST DU NICHTS MEHR AENDERN! -------------------------------------------------
% Schnittmarken:
% oben rechts
\put(88.5,50.5){\line(-1,0){3}}
\put(88.5,50.5){\line(0,-1){3}}
% oben links
\put(0.5,50.5){\line(1,0){3}}
\put(0.5,50.5){\line(0,-1){3}}
% unten links
\put(0.5,0.5){\line(1,0){3}}
\put(0.5,0.5){\line(0,1){3}}
% unten rechts
\put(88.5,0.5){\line(-1,0){3}}
\put(88.5,0.5){\line(0,1){3}}
% ENDE der Schnittmarken
% Jetzt muss noch gesagt werden,
% dass man mit allem fertig ist:
\end{picture}\linebreak[3]%
}
%}}
%\end{picture}
\end{document}[/code]
Das ist sicher noch nicht minimal. Auch sind sicher noch [url=https://komascript.de/signifikanteLeerzeichen]signifikante Leerzeichen[/url] übrig, die beseitigt gehören. Und eventuell will man die [tt]picture[/tt]-Umgebungen dicht an dicht packen, muss also die Größenangabe nochmal korrigieren. Das sehe ich aber nicht als meine Aufgabe.