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