Existe uma maneira de criar um código QR em LaTeX com variáveis koma como entrada?
estou usando o pacote qrcode
e 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 \usekomavar
comando 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}
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 \usekomavar
não é totalmente expansível, consulte seu documento no manual Koma-Script (2022-10-12), seg.4.5. Variáveis.
Mas \usekomavar
aceita 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}
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 qrcode
o 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 \usekomavar
expandir 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 \fromemail
e \usekomavar
expandir o conteúdo da variável koma fromemail
para dentro dela e a partir de então usar \fromemail
em 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}