QR-Code mit Koma-Variablen verwenden?

QR-Code mit Koma-Variablen verwenden?

Gibt es eine Möglichkeit, einen QR-Code in LaTeX mit Koma-Variablen als Eingabe zu erstellen?

Ich verwende das Paket qrcodeund 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 \usekomavarBefehl 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}

Bildbeschreibung hier eingeben

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 \usekomavarnicht vollständig erweiterbar, siehe die entsprechende Dokumentation im Koma-Script-Handbuch (12.10.2022), Abschnitt.4.5. Variablen.

Akzeptiert aber \usekomavareinen "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}

Bildbeschreibung hier eingeben

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 qrcodePaketdokumentation (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, \usekomavardie 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:\usekomavarfromemail\fromemail

\documentclass{scrlttr2}

\setkomavar{fromemail}{[email protected]}
\usepackage[final]{qrcode}
\usekomavar[\def\fromemail]{fromemail}
\begin{document}
    \qrcode{mailto:\fromemail}
\end{document}

verwandte Informationen