¿Usando qrcode con variables koma?

¿Usando qrcode con variables koma?

¿Hay alguna manera de crear un código qr en LaTeX con variables koma como entrada?

Estoy usando el paquete qrcodey 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 \usekomavarcomando 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}

ingrese la descripción de la imagen aquí

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, \usekomavarno es completamente ampliable; consulte su documento en el manual de Koma-Script (2022-10-12), sec.4.5. variables.

Pero \usekomavaracepta 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}

ingrese la descripción de la imagen aquí

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 \qrcodecaracteres de escape ( ), consulte el documento del paquete (2015/01/08 v1.51), sec. 2.3#$&^_~%␣\{}\#\$\&\^\_\~\%\␣\\\{\}qrcodeCaracteres 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 \usekomavarexpandir 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 \fromemaily \usekomavarexpandir el contenido de la variable koma fromemaily de ahí en adelante usarla \fromemailen 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}

información relacionada