Gibt es eine Möglichkeit, einen QR-Code in LaTeX mit Koma-Variablen als Eingabe zu erstellen?
Ich verwende das Paket qrcode
und alles funktioniert gut und das Paket ist einfach zu verwenden. Wenn ich jedoch versuche, eine Koma-Variable als Eingabe für den Text zu verwenden, stürzt LaTeX ab.
Das funktioniert:
\documentclass{scrlttr2}
\usepackage[final]{qrcode}
\setkomavar{fromemail}{[email protected]}
\newcommand{\texttoconvert}{mailto:[email protected]}
\begin{document}
\begin{letter}{}
\qrcode[height=1.5cm]{\texttoconvert}
\end{letter}
\end{document}
Dies ist jedoch nicht der Fall:
\documentclass{scrlttr2}
\usepackage[final]{qrcode}
\setkomavar{fromemail}{[email protected]}
\newcommand{\texttoconvert}{mailto:\usekomavar{fromemail}}
\begin{document}
\begin{letter}{}
\qrcode[height=1.5cm]{\texttoconvert}
\end{letter}
\end{document}
Warum ist das so? Es funktioniert auch nicht, Koma-Variablen direkt im QR-Code zu verwenden ...
Antwort1
Der \usekomavar
Befehl ist nicht erweiterbar. Sie können eine erweiterbare Version definieren (diese prüft jedoch nicht, ob die Variable tatsächlich definiert ist, Vorsicht).
\documentclass{scrlttr2}
\usepackage[final]{qrcode}
\setkomavar{fromemail}{[email protected]}
\newcommand{\texttoconvert}{mailto:\expkomavar{fromemail}}
\makeatletter
\NewExpandableDocumentCommand{\expkomavar}{sO{\@firstofone}m}{%
\IfBooleanTF{#1}{% \expkomavar*
\expkomavar@name{#2}{#3}%
}{% \expkomavar
\expkomavar@var{#2}{#3}%
}%
}
\newcommand{\expkomavar@name}[2]{#1{\@nameuse{scr@#2@name}}}
\newcommand{\expkomavar@var}[2]{#1{\@nameuse{scr@#2@var}}}
\makeatother
\begin{document}
\begin{letter}{}
\qrcode[height=1.5cm]{\texttoconvert}
\bigskip
\qrcode[height=1.5cm]{mailto:[email protected]}
\end{letter}
\end{document}
Die beiden QR-Codes sind identisch, wie aus der Protokolldatei hervorgeht. Dort finden wir
<Reading QR code for "mailto:[email protected]" at level 2-Q from aux file.>
für die zweite Instanz, was bedeutet, dass das Paket erkennt, dass es dasselbe ist wie ein zuvor erstelltes.
Antwort2
Ist leider \usekomavar
nicht vollständig erweiterbar, siehe die entsprechende Dokumentation im Koma-Script-Handbuch (12.10.2022), Abschnitt.4.5. Variablen.
Akzeptiert aber \usekomavar
einen "Styling"-Befehl als optionales Argument, der auf den Wert der Variablen einwirkt. Das heißt, nach \setkomavar{<name>}{<content>}
,
\usekomavar[\mycmd]{<name>}
% is equivalent to
\mycmd{<content>}
Wenden Sie diesen Trick auf den Anwendungsfall des OP an:
\documentclass{scrlttr2}
\usepackage[final]{qrcode}
\setkomavar{fromemail}{[email protected]}
\newcommand{\QRmailto}[2][]{\qrcode[#1]{mailto:#2}}
\begin{document}
\begin{letter}{}
\usekomavar[{\QRmailto[height=1.5cm]}]{fromemail}
\end{letter}
\end{document}
Da der im QR-Code zu kodierende Text nun tokenisiert wird, bevor er an übergeben wird \qrcode
, müssen Sonderzeichen ( #$&^_~%␣\{}
) möglicherweise maskiert werden ( \#\$\&\^\_\~\%\␣\\\{\}
), siehe qrcode
Paketdokumentation (08.01.2015 v1.51), Abschnitt 2.3Spezielle Charaktere.
\documentclass{scrlttr2}
\usepackage[final]{qrcode}
\setkomavar{fromemail}{[email protected]}
% \myQrcode[<opts>]{<pre>}{<post>}{<text>}
% => \qrcode [<opts>]{<pre><text><post>}
\newcommand{\myQrcode}[4][]{\qrcode[#1]{#2#4#3}}
\begin{document}
\begin{letter}{}
\usekomavar
[{\myQrcode[height=1.5cm]
{mailto:}
{?subject=ABC/123&body=Hello\ and\ welcome}}]
{fromemail}
% <QR code requested for "mailto:[email protected]?subject=ABC/123&body=Hello and welcome" in version 0-M.>
\end{letter}
\end{document}
Antwort3
Ich habe mit Markus Kohm (Autor von Koma-Script) gesprochen und er hat mir gesagt, dass die beabsichtigte Lösung mit Koma-Script darin besteht, die Möglichkeit zu nutzen, \usekomavar
die Koma-Variable in den ersten Parameter der optionalen Variable zu erweitern \usekomavar[<command>]{<komavariable>}
.
So was:
\newcommand*{\qrcodewithprefix}[2][mailto:]{\qrcode{#1#2}}
\usekomavar[\qrcodewithprefix]{fromemail}
oder noch kürzer:
\usekomavar[\def\fromemail]{fromemail}
\qrcode{mailto:\fromemail}
Sein Hauptgrund dafür ist, dass diese Lösung (im Vergleich zu den Low-Level-Lösungen) hilfreiche Fehlermeldungen ermöglicht.
Versucht man nun einen Tippfehler in der Koma-Variable und schreibt \usekomavar[\def\fromemail]{frommail}
stattdessen erhält man folgende Fehlermeldung:
Class scrlttr2 Error: KOMA-Script variable not defined. \usekomavar[\def\fromemail]{frommail}
Dies passiert nicht, wenn Sie stattdessen Folgendes verwendet haben:
\def\fromemail{example-\csname scr@fromemail@var\endcsname}
Wenn Sie einen Tippfehler einbauen, erhalten Sie nur ein sehr verwirrendes:
Undefined control sequence. \qrcode{mailto:\fromemail}
Zusammenfassend lässt sich sagen, dass die einfache und saubere Lösung darin besteht, den Inhalt der Koma-Variable zu definieren \fromemail
, in diese zu erweitern und von da an anstelle der Koma-Variable zu verwenden, wenn die erweiterte Variante benötigt wird:\usekomavar
fromemail
\fromemail
\documentclass{scrlttr2}
\setkomavar{fromemail}{[email protected]}
\usepackage[final]{qrcode}
\usekomavar[\def\fromemail]{fromemail}
\begin{document}
\qrcode{mailto:\fromemail}
\end{document}