Usando qrcode com variáveis ​​​​koma?

Usando qrcode com variáveis ​​​​koma?

Existe uma maneira de criar um código QR em LaTeX com variáveis ​​​​koma como entrada?

estou usando o pacote qrcodee tudo funciona bem e o pacote é fácil de usar. No entanto, quando tento usar uma variável koma como entrada para o texto, o LaTeX trava.

Isso 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}

Mas isso não acontece:

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

Por que é que? Também não funciona usar variáveis ​​koma diretamente no qrcode...

Responder1

O \usekomavarcomando não é expansível. Você pode definir uma versão expansível (que não verificará se a variável está realmente definida, 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}

insira a descrição da imagem aqui

Os dois códigos QR são iguais, como testemunha o arquivo de log onde encontramos

<Reading QR code for "mailto:[email protected]" at level 2-Q from aux file.>

para a segunda instância, o que significa que o pacote reconhece que é igual a um pacote criado anteriormente.

Responder2

Infelizmente \usekomavarnão é totalmente expansível, consulte seu documento no manual Koma-Script (2022-10-12), seg.4.5. Variáveis.

Mas \usekomavaraceita um comando "styling" como argumento opcional, que atuará sobre o valor da variável. Ou seja, depois \setkomavar{<name>}{<content>},

\usekomavar[\mycmd]{<name>}
% is equivalent to
\mycmd{<content>}

Aplique este truque ao caso de uso do 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}

insira a descrição da imagem aqui

Como agora o texto a ser codificado no código QR é tokenizado antes de ser passado para \qrcode, caracteres especiais ( #$&^_~%␣\{}) podem precisar ser escapados ( \#\$\&\^\_\~\%\␣\\\{\}), consulte qrcodeo documento do pacote (2015/01/08 v1.51), sec. 2.3Caracteres especiais.

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

Responder3

Conversei com Markus Kohm (autor do koma-script) e ele me disse que a solução pretendida com o koma-script é usar a capacidade de \usekomavarexpandir a variável koma no primeiro parâmetro da variável opcional \usekomavar[<command>]{<komavariable>}.

Assim:

\newcommand*{\qrcodewithprefix}[2][mailto:]{\qrcode{#1#2}}
\usekomavar[\qrcodewithprefix]{fromemail}

ou ainda mais curto:

\usekomavar[\def\fromemail]{fromemail}
\qrcode{mailto:\fromemail}

A principal razão para isso é que esta solução (em comparação com as soluções de nível mais baixo) permite mensagens de erro úteis.

Se você tentar um erro de digitação na variável koma e escrever, \usekomavar[\def\fromemail]{frommail}receberá a seguinte mensagem de erro:

Class scrlttr2 Error: KOMA-Script variable not defined. \usekomavar[\def\fromemail]{frommail}

Isso não acontece se você usar:

\def\fromemail{example-\csname scr@fromemail@var\endcsname}

Quando você introduz um erro de digitação, você fica muito confuso:

Undefined control sequence. \qrcode{mailto:\fromemail}

Resumindo, a solução fácil e limpa é definir \fromemaile \usekomavarexpandir o conteúdo da variável koma fromemailpara dentro dela e a partir de então usar \fromemailem vez da variável koma quando precisar da variante expandida:

\documentclass{scrlttr2}

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

informação relacionada