QR-Codes – Probleme mit Leerzeichen und Zeilenende

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


White_Fox

QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von White_Fox »

Moin allerseits

Ich möchte eine vCard erstellen, und habe nun das Problem das mir Leerzeichen verloren gehen.
Z.B. steht in der vCard "DIEFIRMAGmbH", obwohl es "DIE FIRMA GmbH" heißen soll. Namen dito.

Das Problem scheint zu sein, daß ich einige Daten aus Befehlen hole, und dann irgendwie der Zeilenumbruch verloren geht. Befehle wie z.B.
EMAIL;type=WORK:\DTLifnullorempty{#6}{}{#6}
Ein weiteres Problem scheint mir bei Zeilenenden zu liegen. Mit angehängtem ^^J kann ich den QR-Code korrekt auslesen, wenn ich die ^^J weglasse erkennt die App zwar noch daß das eine vCard sein soll, liest aber nichts aus. Anscheinend steht dann Müll drin.
Andererseits läuft dieses Beispiel wunderbar und liefert genau das, was es soll:
\documentclass{article}
\usepackage{qrcode}
\begin{document}

default:\quad
\qrcode{BEGIN:VCARD
VERSION:4.0
EMAIL;type=WORK:Paul@pocketables.com
EMAIL;type=HOME:paul@pocketables.com
TEL;type=WORK:+1 ‪(615) 669-9734‬
NOTE:here's some random text to throw into the contact information
ADR;type=WORK:;;123 fake street;Nashville;TN;37228;United States of America
CATEGORIES: blogger, internet troll
GENDER:M
PHOTO;JPEG:https://secure.gravatar.com/avatar/4fdde8e771f209d9a50ceb0f02ba60b8?s=100&d=retro&r=pg
LOGO;JPEG:https://pocketables.com/wp-content/uploads/2010/05/Pocketables_logo_400x400.jpg
TZ:America/Chicago
URL:https://www.pocketables.com
FN:Paul E. King
N:Paul King
END:VCARD
}
\qquad
1 inch high (and wide):
\quad
\qrcode[height=1in]{BEGIN:VCARD
VERSION:4.0
EMAIL;type=WORK:Paul@pocketables.com
EMAIL;type=HOME:paul@pocketables.com
TEL;type=WORK:+1 ‪(615) 669-9734‬
NOTE:here's some random text to throw into the contact information
ADR;type=WORK:;;123 fake street;Nashville;TN;37228;United States of America
CATEGORIES: blogger, internet troll
GENDER:M
PHOTO;JPEG:https://secure.gravatar.com/avatar/4fdde8e771f209d9a50ceb0f02ba60b8?s=100&d=retro&r=pg
LOGO;JPEG:https://pocketables.com/wp-content/uploads/2010/05/Pocketables_logo_400x400.jpg
TZ:America/Chicago
URL:https://www.pocketables.com
FN:Paul E. King
N:Paul King
END:VCARD
}

\end{document}
Hier ist mein Code, der diese Probleme macht:
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage[zw32010,boxed]{ticket}
\usepackage{marvosym}
\usepackage{tikz}
\usepackage[lf]{carlito}
\usepackage{microtype}
\usepackage{afterpage}
\usepackage{datatool}
\usepackage{qrcode}
\DTLloaddb[
	keys={vorname,nachname,grad,email,telephon,mobil}
]{ma}{ma.csv}

\newcommand{\vcardfront}[6]{\ticket{}}
\newcommand{\vcardback}[6]{\ticket{}}
	
\begin{document}
\color{black}
\newcounter{numcards}

\renewcommand{\ticketdefault}{%
	}
	
\DTLforeach{ma}{%
	\vn=vorname, \nn=nachname, \grad=grad, \tele=telephon, \mobil=mobil, \em=email}{%

	\renewcommand{\vcardfront}[6]{\ticket{%
		\pagecolor{white}
		\color{black}
		
		%\put( 53, 27){\includegraphics[width=26mm,origin=bl]{Logo_Grafik.pdf}}
		\put(5, 5){\rotatebox{90}{\LARGE\bfseries #1}}
		\put(12, 5){\rotatebox{90}{\LARGE\bfseries #2}}
		\put(20, 5){\rotatebox{90}{\small #3}}
		
		\put( 30, 5){\rotatebox{90}{\color{red}\line(1,0){30}}}
		
		\DTLifnullorempty{#4}{}{\put(35, 5){\rotatebox{90}{\small \Mobilefone\ #4}}}
		\DTLifnullorempty{#5}{}{\put(40, 5){\rotatebox{90}{\small \Telefon\ #5}}}
		\DTLifnullorempty{#6}{}{\put(45, 5){\rotatebox{90}{\small \Email\ #6}}}
		
		\put( 55, 5){\rotatebox{90}{\color{red}\line(1,0){30}}}
		
		\put( 60, 5){\rotatebox{90}{\small \Letter }}
		\put( 60, 9){\rotatebox{90}{\small DIE FIRMA GmbH}}
		\put( 65,  9){\rotatebox{90}{\small Bahnhofstraße 3}}
		\put( 70,  9){\rotatebox{90}{\small 01360 Großstadt}}
		\put( 75,  5){\rotatebox{90}{\small \Mundus\ www.DIEFIRMA.de}}
	}}
	
	\renewcommand{\vcardback}[6]{\ticket{%
		\pagecolor{white}
		\color{black}
		
		\put(55, 15){\qrcode[height=1in]{BEGIN:VCARD^^J
VERSION:4.0^^J
EMAIL;type=WORK:\DTLifnullorempty{#6}{}{#6}^^J
TEL;type=WORK:\DTLifnullorempty{#5}{}{#5‬}^^J
TEL;type=WORK:\DTLifnullorempty{#4}{}{#4}^^J
ORG:DIE FIRMA GmbH^^J
ADR;type=WORK:;;Bahnhofstraße 3;Großstadt;;01360;Germany^^J
URL:https://www.DIEFIRMA.de^^J
FN:#1 #2^^J
N:#2;#1;;;^^J
END:VCARD^^J}}
	}}

	\sffamily
	\setcounter{numcards}{0}
	\whiledo{\value{numcards}<10}{%
		\stepcounter{numcards}%
		\vcardfront{\vn}{\nn}{\grad}{\mobil}{\tele}{\em}}
	\newpage
	
	\setcounter{numcards}{0}
	\whiledo{\value{numcards}<10}{%
		\stepcounter{numcards}%
		\vcardback{\vn}{\nn}{\grad}{\mobil}{\tele}{\em}}
	\newpage
}
\end{document}
ma.csv (ihr müßt noch eine Leerzeile am Schluß einfügen, die Forensoftware entfernt die):
vorname,nachname,grad,email,telephon,mobil
Marie,Juana,M. Eng.,marie.juana@diefirma.de,01352/99 88 77,

Hat jemand eine Idee, was ich da verkehrt mache?

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2534
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von Stefan Kottwitz »

Ich habe die Datei ma.csv mal zum Compiler hochgeladen. Jetzt kannst Du den Code hier mit Klick auf "LaTeX-Ausgabe" hier testen. Sieht aus als ob es funktioniert, oder? Ist es anders als bei Dir?

Stefan

White_Fox

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von White_Fox »

Vielen Dank für's Hochladen. Hätte das auch so funktioniert, wenn ich die .csv als Anhang angefügt hätte? Ich war mir da nicht so sicher.

Ja, genau so sieht es bei mir auch aus.

Ich glaube, ich habe gestern mit einer anderen Barcodeleseapp etwas einkreisen können. Wenn ich die "^^J" die Barcodeapp dann Müll einliest, sieht der gesamte Inhalt aus als wäre eine TRIM-Funktion an irgendeiner Stelle angewendet worden, also eine Funktion die sämtliche Whitecharacter (Leerzeichen, Newline und dergleichen...) entfernt und nur noch Buchstaben übrig läßt.

Wenn ich den Codescanner den Scan in eine Textdatei schreiben lasse, enthält die Datei nur eine einzige lange Zeile ohne Leerzeichen.
Nehme ich die "^^J" dagegen wieder rein, funktionieren die als Zeilenabschluß, dann fehlen nur noch Leerzeichen wie z.B. in "Marie Juana", stattdessen steht dann "MarieJuana" im Namensfeld.
Genau dasselbe mit dem Firmennamen. Es heißt ja "DIE FIRMA GmbH", in der vCard steht aber "DIEFIRMAGmbH" drin.

Wenn ich jetzt nur noch jemand wüßte, an welcher Stelle scheinbar überflüssige Weißzeichen entfernt werden...da hört es bei mir leider schon auf. Und warum findet das in dem ersten Beispiel nicht statt...ist da vielleicht das ticket-Paket dafür verantwortlich? Das wäre jetzt erstmal der erste offensichtliche Unterschied.

White_Fox

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von White_Fox »

Argh, tut mir leid daß da in meinem vorherigen Post so ein Wortsalat entstanden ist.

Vielleicht sollte ich mich hier doch mal anmelden, um das später wieder editieren zu können. Ich hoffe aber, man versteht mich trotzdem.

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2534
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von Stefan Kottwitz »

Einbinden oder Anhängen von Daten ist immer gut, so dass man testen kann. Ich musste es manuell zum Compiler hochladen.

Anmelden ist sinnvoll, damit kann man seine Beiträge wiederfinden und Emails erhalten, wenn es Antworten gibt. Das Forum ist privat und nicht an Anmeldedaten oder Email-Adressen interessiert, keine Werbung etc., der Administrator bin ich und brauche keine Nutzerdaten. Am besten immer mit Pseudonym anmelden und neutraler oder sogar Wegwerf-Adresse im Internet.

Von dem Wortsalat hab ich tatsächlich kaum was verstanden. :-D

Stefan

White_Fox

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von White_Fox »

Von dem Wortsalat hab ich tatsächlich kaum was verstanden. :-D
Oh je, dann fange ich am besten nochmal an. Also:
Das Beispiel im Eingangspost verhält sich exakt so wie mein Projekt hier auf meinem Rechner, d.h. das Problem ist schonmal erfolgreich reproduziert. Nochmal danke fürs Hochladen der .csv-Datei.

Das Beispiel einfach mal kompilieren, und mit einem Handy den Barcode in der PDF-Ausgabe scannen. Ach was solls, ich stell hier einfach mal rein was dabei rauskommt (und was rauskommen soll):

Was ich in den Rohdaten haben will, ist das hier, so soll das am Ende aussehen:

BEGIN:VCARD
VERSION:4.0
EMAIL;type=:marie.juana@diefirma.de
TEL;type=WORK:
TEL;type=WORK:01352/99 88 77
ORG:DIE FIRMA GmbH
ADR;type=WORK:;;Bahnhofstraße 3;Großstadt;;01360;Germany
URL:https://www.DIEFIRMA.de
FN:Marie Juana
N:Juana;Marie;;;
END:VCARD


Im MWE im ersten Post kann man sehen, daß ich jede Zeile (im Listing oben Zeile 59-69) mit einem ^^J beendet habe. Das gilt als Zeilenumbruch, ein QR-Code-Scanner erkennt daran daß z.B. die Emailadresse zu ende ist und ein neues Tag, z.B. die Telefonnummer, begonnen wird. Dann steht in den Rohdaten folgendes (ich markiere mal rot, wo man genau hinschauen muß):

BEGIN:VCARD
VERSION:4.0
EMAIL;type=:marie.juana@diefirma.de
TEL;type=WORK:
TEL;type=WORK:01352/998877
ORG:DIEFIRMAGmbH
ADR;type=WORK:;;Bahnhofstraße 3;Großstadt;;01360;Germany
URL:https://www.DIEFIRMA.de
FN:MarieJuana
N:Juana;Marie;;;
END:VCARD

Die Rohdaten werden zwar richtig als vCard erkannt, es werden aber alle Leerzeichen entfernt. Vor- und Nachname erscheinen als ein Wort mit einem Großbuchstaben in der Mitte, das GmbH-Suffix ist mit dem Firmennamen zusammengewachsen, usw.
Die Leerzeichen will ich nicht entfernt haben, die sollen bitte bleiben.


Das erste Beispiel (ist nicht von mir, sondern die Rohdaten von irgendeiner Webseite mit einem Codeschnipsel von Stackoverflow zusammenkopiert) in meinem Eingangspost hat diese ^^J-Zeilenenden nicht, da reicht der normale Zeilenumbruch im Code aus. Dort werden Leerzeichen korrekt wiedergegeben, z.B. in "Paul E. King". Wenn ich die ^^J jedoch in meinem eigene Code – der Marie-Juana-Visitenkarte – ebenfalls weglasse, erhalte ich folgendes (ich schreibe es mal in Codeformatierung, damit man es besser sieht):
BEGIN:VCARDVERSION:4.0EMAIL;type=:marie.juana@diefirma.deTEL;type=WORK:TEL;type=WORK:01352/998877ORG:DIE FIRMA GmbHADR;type=WORK:;;Bahnhofstraße 3;Großstadt;;01360;GermanyURL:https://www.DIEFIRMA.deFN:MarieJuanaN:Juana;Marie;;;END:VCARD
Wie man sieht: keiner Leerzeichen oder Zeilenumbrüche, die als Trenner erkannt werden würden, der ganze Datensalat ist eine einzige Zeile. Das vCard-Tag am Anfang wird noch richtig ausgelesen von der Scanner-App am Handy, aber da steht nichts drin weil alles was danach kommt aufgrund des fehlenden Trennsymbols (also Zeilenumbruch oder ^^J) die Rohdaten nicht mehr korrekt interpretiert werden können. Mir wird einfach eine leere vCard angezeigt.

Und ich hätte nun den QR-Code gerne so, wie er im funktionierenden Beispiel mit Paul E. King aussieht. Mit Leerzeichen in den Rohdaten. Wenn dann noch jemand wüßte, warum meine Rohdaten so verschandelt werden und wie ich das in Zukunft gleich vermeiden kann, wäre das großartig.

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2534
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von Stefan Kottwitz »

Ein Unterschied zum ersten Beispiel ist hier, dass Makros verwendet werden und nicht einfacher Text. Einfache Leerzeichen im Code zwischen Makros "verschwinden".

Eine Lösung ist hier, "\ " als Leerzeichen zu verwenden, wie 01352/99\ 88\ 77. Also in den Rohdaten bereits, was man mit Suchen/Ersetzen machen oder scripten kann, oder im LaTeX-Code, beispielsweise mit dem xstring-Paket und sowas wie
\newcommand{\fix}[1]{\StrSubstitute{#1}{ }{\ }}
und das einbaut beim oder nach dem Einlesen der Daten oder dem Aufrufen von \vcardback.

Stefan

White_Fox

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von White_Fox »

Einfache Leerzeichen im Code zwischen Makros "verschwinden".
Aha...wieder was gelernt, das wußte ich noch nicht. Danke.

Dann sollte die Ersetzung der Leerzeichen ja tatsächlich die Lösung sein, allerdings wirft mir das immer Compilerfehler:
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage[zw32010,boxed]{ticket}
\usepackage{marvosym}
\usepackage{tikz}
\usepackage[lf]{carlito}
\usepackage{microtype}
\usepackage{afterpage}
\usepackage{datatool}
\usepackage{qrcode}
\usepackage{xstring}
\DTLloaddb[
	keys={vorname,nachname,grad,email,telephon,mobil}
]{ma}{ma.csv}

\newcommand{\fix}[1]{\StrSubstitute{#1}{ }{\ }}

\newcommand{\vcardfront}[6]{\ticket{}}
\newcommand{\vcardback}[6]{\ticket{}}
	
\begin{document}
\color{black}
\newcounter{numcards}

\renewcommand{\ticketdefault}{%
	}
	
\DTLforeach{ma}{%
	\vn=vorname, \nn=nachname, \grad=grad, \tele=telephon, \mobil=mobil, \em=email}{%

	\renewcommand{\vcardfront}[6]{\ticket{%
		\pagecolor{white}
		\color{black}
		
		%\put( 53, 27){\includegraphics[width=26mm,origin=bl]{Logo_Grafik.pdf}}
		\put(5, 5){\rotatebox{90}{\LARGE\bfseries #1}}
		\put(12, 5){\rotatebox{90}{\LARGE\bfseries #2}}
		\put(20, 5){\rotatebox{90}{\small #3}}
		
		\put( 30, 5){\rotatebox{90}{\color{red}\line(1,0){30}}}
		
		\DTLifnullorempty{#4}{}{\put(35, 5){\rotatebox{90}{\small \Mobilefone\ #4}}}
		\DTLifnullorempty{#5}{}{\put(40, 5){\rotatebox{90}{\small \Telefon\ #5}}}
		\DTLifnullorempty{#6}{}{\put(45, 5){\rotatebox{90}{\small \Email\ #6}}}
		
		\put( 55, 5){\rotatebox{90}{\color{red}\line(1,0){30}}}
		
		\put( 60, 5){\rotatebox{90}{\small \Letter }}
		\put( 60, 9){\rotatebox{90}{\small DIE FIRMA GmbH}}
		\put( 65,  9){\rotatebox{90}{\small Bahnhofstraße 3}}
		\put( 70,  9){\rotatebox{90}{\small 01360 Großstadt}}
		\put( 75,  5){\rotatebox{90}{\small \Mundus\ www.DIEFIRMA.de}}
	}}
	
	\renewcommand{\vcardback}[6]{\ticket{%
		\pagecolor{white}
		\color{black}
		
		\put(55, 15){\qrcode[height=1in]{
BEGIN:VCARD^^JVERSION:4.0^^J
EMAIL;type=WORK:\DTLifnullorempty{#6}{}{#6}^^J
TEL;type=WORK:\DTLifnullorempty{#5}{}{#5‬}^^J
TEL;type=WORK:\DTLifnullorempty{#4}{}{#4}^^J
ORG:DIE FIRMA GmbH^^J
\StrSubstitute{ADR;type=WORK:;;Bahnhofstraße 3;Großstadt;;01360;Germany^^J}{ }{\ }
URL:https://www.DIEFIRMA.de^^J
FN:#1 #2^^J
N:#2;#1;;;^^J
END:VCARD^^J}}
	}}

	\sffamily
	\setcounter{numcards}{0}
	\whiledo{\value{numcards}<10}{%
		\stepcounter{numcards}%
		\vcardfront{\vn}{\nn}{\grad}{\mobil}{\tele}{\em}}
	\newpage
	
	\setcounter{numcards}{0}
	\whiledo{\value{numcards}<10}{%
		\stepcounter{numcards}%
		\vcardback{\vn}{\nn}{\grad}{\mobil}{\tele}{\em}}
	\newpage
}
\end{document}
Wenn ich die Leerzeichen direkt durch "\ " erzwinge bleiben die im QR-Code erhalten, das ist gut, den Text aber automatisch nach Leerzeichen filtern zu lassen kommt immer mit diesem Fehler zurück. Dabei ist es egal, ob ich das Ersetzenmakro außerhalb (wie im Beispiel) oder mehrmals innerhalb des qrcode-Makros verwende, es ist auch egal ob ich den von dir vorformulierten Befehl oder das \StrSubstitute-Makro direkt verwende.

Hast du noch eine Idee, wie ich das beheben kann?

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2534
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von Stefan Kottwitz »

Es scheint, dass das \qrcode-Makro, was ein spezielles Parsing des Arguments hat, mit Makros darin nicht gut umgehen kann. Du kannst halt "\ " direkt drin schreiben und eingelesene Werte außerhalb \qrcode bearbeiten.

Stefan

White_Fox

Re: QR-Codes – Probleme mit Leerzeichen und Zeilenende

Beitrag von White_Fox »

Danke. Hm...sowas habe ich schon befürchtet.

Weißt du, wie ich Parameter in einem Makro überschreiben kann?

Also sowas wie:
\renewcommand{\anyCommand}[1]{
	#1 = "edited #1"
	\put(5, 5){\rotatebox{90}{\LARGE\bfseries #1}}
}

Antworten