Есть ли способ создать 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}