¿Hay alguna manera de crear un código qr en LaTeX con variables koma como entrada?
Estoy usando el paquete qrcode
y todo funciona bien y el paquete es fácil de usar. Sin embargo, cuando intento utilizar una variable koma como entrada para el texto, LaTeX falla.
Esto funciona:
\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}
Pero esto no:
\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}
¿Porqué es eso? Tampoco funciona usar variables koma directamente en qrcode...
Respuesta1
El \usekomavar
comando no es ampliable. Puede definir una versión expandible (que no comprobará si la variable está realmente definida, tenga cuidado).
\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}
Los dos códigos QR son iguales, como lo atestigua el archivo de registro donde encontramos
<Reading QR code for "mailto:[email protected]" at level 2-Q from aux file.>
para la segunda instancia, lo que significa que el paquete reconoce que es el mismo que uno creado anteriormente.
Respuesta2
Lamentablemente, \usekomavar
no es completamente ampliable; consulte su documento en el manual de Koma-Script (2022-10-12), sec.4.5. variables.
Pero \usekomavar
acepta un comando de "estilo" como argumento opcional, que actuará sobre el valor de la variable. Es decir, después \setkomavar{<name>}{<content>}
,
\usekomavar[\mycmd]{<name>}
% is equivalent to
\mycmd{<content>}
Aplique este truco al caso de uso de OP:
\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}
Dado que ahora el texto que se va a codificar en código qr se tokeniza antes de pasarlo a , es posible que sea necesario utilizar \qrcode
caracteres de escape ( ), consulte el documento del paquete (2015/01/08 v1.51), sec. 2.3#$&^_~%␣\{}
\#\$\&\^\_\~\%\␣\\\{\}
qrcode
Caracteres especiales.
\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}
Respuesta3
Hablé con Markus Kohm (autor de koma-script) y me dijo que la solución prevista con koma-script es usar la capacidad de \usekomavar
expandir la variable koma al primer parámetro de la variable opcional \usekomavar[<command>]{<komavariable>}
.
Como esto:
\newcommand*{\qrcodewithprefix}[2][mailto:]{\qrcode{#1#2}}
\usekomavar[\qrcodewithprefix]{fromemail}
o incluso más corto:
\usekomavar[\def\fromemail]{fromemail}
\qrcode{mailto:\fromemail}
La razón principal para esto es que esta solución (en comparación con las soluciones de nivel más bajo) permite mensajes de error útiles.
Si intenta cometer un error tipográfico en la variable koma y escribe \usekomavar[\def\fromemail]{frommail}
en su lugar, recibirá el siguiente mensaje de error:
Class scrlttr2 Error: KOMA-Script variable not defined. \usekomavar[\def\fromemail]{frommail}
Esto no sucede si en su lugar usas:
\def\fromemail{example-\csname scr@fromemail@var\endcsname}
Cuando introduces un error tipográfico, solo obtienes algo muy confuso:
Undefined control sequence. \qrcode{mailto:\fromemail}
Para resumir, la solución fácil y limpia es definir \fromemail
y \usekomavar
expandir el contenido de la variable koma fromemail
y de ahí en adelante usarla \fromemail
en lugar de la variable koma cuando se necesite la variante expandida:
\documentclass{scrlttr2}
\setkomavar{fromemail}{[email protected]}
\usepackage[final]{qrcode}
\usekomavar[\def\fromemail]{fromemail}
\begin{document}
\qrcode{mailto:\fromemail}
\end{document}