Formatierung von Schildern.

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Formatierung von Schildern.

von Fabian96 » Mi 3. Jul 2019, 11:42

Alles klar, dann vielen Dank für die Erklärung. Ich denke den Rest sollte ich passend modifizieren können!

Grüße
Fabian

von Gast » Di 2. Jul 2019, 14:00

Achso, der \linebreak-Befehl dient dazu, kein Leerzeichen zwischen den picture-Umgebungen zu erzwingen, aber trotzdem einen Zeilenumbruch zu ermöglichen.

von Gast » Di 2. Jul 2019, 13:58

Entscheidend war die Fehler sowohl im Datensatz als auch bezüglich der Verwendung von \exp_args_NV außerhalb des Wirkungsbereichs von \ExplSyntaxOn (das im Argument von \DTLforearch ist ja, wie erklärt wirkungslos) zu entfernen und natürlich die Korrektur des Größenarguments der inneren picture-Umgebung.

Das Entfernen überflüssigen äußeren picture-Umgebung spielt eher eine Rolle dafür, wo auf der Seite das Ergebnis landet.

Der Spalt zwischen den Karten nützt IMHO für das Laminieren nichts. Die müssen ja ohnehin vor dem Laminieren ausgeschnitten werden. Mir ist aber letztlich egal, wie Du das auf der Seite verteilt haben willst. Das generelle Prinzip funktioniert jetzt, ich habe erklärt, worauf es ankommt, jetzt solltest Du in der Lage sein, das selbst so zu modifizieren, wie Du es am Ende haben willst.

von Fabian96 » Di 2. Jul 2019, 13:07

Vielen Dank für die Hilfe @Gast!

Ich habe deine Änderungen in den Daten übernommen. Deine Variante war sehr lauffähig und entspricht dem was ich mir vorgestellt habe!

Die Größenangaben innherhalb der picture-Umgebung resultieren daher, dass diese Karten im weiteren Verlauf laminiert werden sollen. Der 'Spalt' zwischen den Karten ist also durchaus gewollt.

Aber bitte verrate mir was du genau geändert hat, damit die Karten so hintereinander erscheinen? Ist es wirklich nur der \linebreak[3]-Befehl?

Grüße
Fabian

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.

von Fabian96 » Mo 1. Jul 2019, 15:23

\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[pdftex]{graphicx}
\usepackage{textcomp}
\usepackage{qrcode}
\usepackage{datatool}
\usepackage{algorithm2e}
\usepackage{xstring}
\usepackage{xifthen}
\usepackage{xparse}
\usepackage{etoolbox}
\usepackage{expl3}

% Seiten-Layout
\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}{Testdaten.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.
	
%	\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}(51,89)(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 -----------------------------------------------------------------
								
				%Expandiere den ersten Buchstaben der neuen Bezeichnung in die Variable \firstletter
				\ExplSyntaxOn
					\exp_args:NV \StrLeft \nBez {1} [\firstletter]
		       	\ExplSyntaxOff
				
				% 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[scale=0.60]{Logo.jpg}}
						
			% 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}
			
			
			
			%}
			%}}
\end{picture}

\end{document}

% ENDE
Ich habe heute den ganzen Tag dran gesessen und einige Fehler ausmerzen können. Die Vorlage wie sie jetzt hier steht funktioniert.

Allerding tut sie das nur für die angegebenen Daten aus der Alternativdefinition.

Kann mir jemand verraten, wie ich LaTeX vermittelt bekomme, dass es doch bitte 10 dieser Kärtchen pro Blatt, mit dem jeweils nächsten Datensatz aus der CSV Datei erstellen soll?

Wenn ich die \multiput Funktion dazuschalte, erhalte ich allerhöchstens 10x die gleiche Karte.

Vielen Dank für eure Hilfe im vorraus!

Grüße
Fabian

von Fabian96 » So 30. Jun 2019, 21:52

Hier nochmal die Testdaten als .txt_Datei.

Vielen Dank für den Tipp Bartman!
Ich werdes auch das morgen einarbeiten.

Jedoch fehlt mir immernoch der springende Punkt mit den Datensätzen je Karte.
Wie kann ich Latex dazu animieren auf jeder Karte die Daten eines Datensatzes abzubilden?

Vielen Dank im vorraus!
Grüße
Fabian

[Edit 1 - einmal mit dem Duden drüber geschwischt]
Dateianhänge
Testdaten.txt
(253 Bytes) 190-mal heruntergeladen

von Bartman » So 30. Jun 2019, 15:39

Eine csv-Datei enthält Text und txt-Dateien werden hier als Anhang zugelassen. Für Deine wenigen Zeilen genügt mein Vorschlag.

Es gibt für Deine bedingten Befehle weitere Möglichkeiten:
  • Mit etoolbox können die jeweils zwei Befehle zu einem verkürzt werden.
  • Wenn Du die vorhandenen Bedingungsprüfungen durch
    \ifdefined\sLen dann \else sonst\fi

    und
    \ifdim\sLen<40mm wahr \else falsch\fi


    ersetzt, kommst Du ohne xifthen aus.
Soweit ich es überblicke, brauchst Du keinen Deiner \normalsize-Befehle.

Testdaten

von Fabian96 » So 30. Jun 2019, 13:39

Ich habe mich mal eben fix angemeldet, jetzt hab ich ja Zugriff auf meine private Mail.

@Bartman vielen Dank für den Tipp, den werde ich Montag sofort einarbeiten.

Ich habe nun auch die Testdaten als Excel-Datei anhängen können.( Bitte einfach auf dem eigenen PC als CSV abspeichern. Ein direkter Upload wurde mir vom Forenfiltere untersagt)

Mein prinzipielles Problem ist die Darstellung. Es sollen pro 'Visitenkarte' die Daten von einer Datensatzzeile verarbeitet und abgebildet werden. Könnt ihr mir da weiterhelfen?

Mit freundlichen Grüßen
Forenneuling Fabian
Dateianhänge
Testdaten.xls
(26 KiB) 181-mal heruntergeladen

von Bartman » Fr 28. Jun 2019, 18:50

%Fülle oberes linkes Feld
           
      \put(5,43){\underline{{msArt{\StrLeft{\nBez}{1}} \normalsize}}
Die öffnende geschweifte Klammer vor msArt ist zu viel.

Für Testdaten mit überschaubarer Zeilenanzahl bietet sich die Alternative im Beispiel an.

Nach oben