将二维码与 koma 变量一起使用?

将二维码与 koma 变量一起使用?

有没有办法在 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}

这是为什么呢?在 qrcode 中直接使用 koma 变量也是不行的...

答案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}

在此处输入图片描述

这两个二维码是相同的,日志文件可以证明这一点

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

对于第二个实例,这意味着包识别出它与以前构建的包相同。

答案2

不幸的是,\usekomavar它不能完全扩展,请参阅 Koma-Script 手册 (2022-10-12) 中的文档,sec。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}

在此处输入图片描述

由于现在要编码到二维码中的文本在传递给之前已被标记\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

\usekomavar我曾与 Markus Kohm(koma-script 的作者)进行过交谈,他告诉我,koma-script 的预期解决方案是利用将 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并将\usekomavarkoma 变量的内容扩展fromemail到其中,然后\fromemail在需要扩展变量时使用它而不是 koma 变量:

\documentclass{scrlttr2}

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

相关内容