Используете ли вы QR-код с переменными Koma?

Используете ли вы QR-код с переменными Koma?

Есть ли способ создать QR-код в LaTeX с переменными koma в качестве входных данных?

Я использую пакет qrcode, и все работает отлично, и пакет прост в использовании. Однако, когда я пытаюсь использовать переменную koma в качестве входных данных для текста, LaTeX вылетает.

Это работает:

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

Но это не так:

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

Почему так? Также не работает использование переменных koma напрямую в qrcode...

решение1

Команда \usekomavarне является расширяемой. Вы можете определить расширяемую версию (которая не будет проверять, определена ли переменная на самом деле, будьте осторожны).

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

введите описание изображения здесь

Оба QR-кода одинаковы, о чем свидетельствует файл журнала, в котором мы находим

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

для второго экземпляра это означает, что пакет распознает его как тот же, что был создан ранее.

решение2

К сожалению, \usekomavarне полностью расширяем, см. документацию в руководстве Koma-Script (12.10.2022), раздел.4.5 Переменные.

Но \usekomavarпринимает команду "стилизации" в качестве необязательного аргумента, который будет действовать на значение переменной. То есть, после \setkomavar{<name>}{<content>},

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

Применим этот трюк к варианту использования 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}

введите описание изображения здесь

Поскольку теперь текст, который должен быть закодирован в QR-коде, токенизируется перед передачей в \qrcode, специальные символы ( #$&^_~%␣\{}) может потребоваться экранировать ( \#\$\&\^\_\~\%\␣\\\{\}), см. qrcodeдокументацию по пакету (2015/01/08 v1.51), раздел 2.3Специальные символы.

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

решение3

Я поговорил с Маркусом Комом (автором koma-script), и он сказал мне, что предполагаемое решение с помощью koma-script — использовать возможность \usekomavarрасширения переменной koma в первый параметр необязательной переменной \usekomavar[<command>]{<komavariable>}.

Так:

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

или еще короче:

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

Основная причина этого в том, что это решение (по сравнению с решениями более низкого уровня) позволяет выводить полезные сообщения об ошибках.

Если вы попробуете сделать опечатку в переменной koma и написать \usekomavar[\def\fromemail]{frommail}вместо нее, вы получите следующее сообщение об ошибке:

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

Этого не произойдет, если вместо этого вы использовали:

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

Если вы допустите опечатку, то получите только очень запутанное:

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

Подводя итог, простое и понятное решение — определить \fromemailи \usekomavarрасширить содержимое переменной koma fromemail, а затем использовать ее \fromemailвместо переменной koma, когда потребуется расширенный вариант:

\documentclass{scrlttr2}

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

Связанный контент