我有两个宏。第一个宏\qrwifidata
,从两个参数和一些可选的键值生成一个字符串。第二个宏\qrwifi
,采用相同的参数并生成带有文本覆盖的二维码。
\newcommand{\qrwifidata}[3][]{\begingroup\setkeys{qrwifi}{#1}%
WIFI:S:#2;T:\qw@enc;P:#3;;%
\endgroup}
\newcommand{\qrwifi}[3][]{\begingroup\setkeys{qrwifi}{#1}%
\begin{tikzpicture}%
\node at (0, 0) {\qrcode{WIFI:S:#2;P:#3;T:\qw@enc;;}};%
\node[fill=white,align=center] at (0, 0) {#2\\#3};%
\end{tikzpicture}%
\endgroup}
两个宏单独运行都很好。但现在,我想在第二个宏中重用第一个宏,因为
\newcommand{\qrwifi}[3][]{\begingroup\setkeys{qrwifi}{#1}%
\begin{tikzpicture}%
\node at (0, 0) {\qrcode{\qrwifidata[encryption=\qw@enc]{#2}{#3}}};%
\node[fill=white,align=center] at (0, 0) {#2\\#3};%
\end{tikzpicture}%
\endgroup}
但是使用后一个版本会产生很多错误,例如“未定义的控制序列”和“非法参数编号”。我猜,这与宏扩展顺序有关,所以我尝试插入一些\expandafter
s,但无济于事。
我怎样才能\qrwifidata
先进行扩展并将其结果传递给\qrcode
?
为了完整性,这里有一个最小(非)工作示例:
\documentclass{article}
\usepackage{keyval}
\usepackage{qrcode}
\usepackage{tikz}
\makeatletter
\newlength{\qw@size}
\define@key{qrwifi}{size}{\setlength\qw@size{#1}}
\define@key{qrwifi}{encryption}{\def\qw@enc{#1}}
\setkeys{qrwifi}{
encryption=WPA,
size=5cm,
}
\newcommand{\qrwifidata}[3][]{\begingroup\setkeys{qrwifi}{#1}%
WIFI:S:#2;T:\qw@enc;P:#3;;%
\endgroup}
\newcommand{\qrwifi}[3][]{\begingroup\setkeys{qrwifi}{#1}%
\begin{tikzpicture}%
\node at (0, 0) {\qrcode[level=H,height=\qw@size,padding]{WIFI:S:#2;P:#3;T:\qw@enc;;}};%
% \node at (0, 0) {\qrcode[level=H,height=\qw@size,padding]{\qrwifidata[encryption=\qw@enc]{#2}{#3}}};%
\node[fill=white,align=center] at (0, 0) {#2\\#3};%
\end{tikzpicture}%
\endgroup}
\makeatother
\begin{document}
\qrwifidata[encryption=WEP]{SSID}{Key}
\qrwifi[encryption=WEP]{SSID}{Key}
\end{document}
答案1
我不确定为什么要再次评估已设置为所需值的键。
无论如何,\qrcode
扩展它的第二个参数,但键设置不能出现在那里。
\documentclass{article}
\usepackage{keyval}
\usepackage{qrcode}
\usepackage{tikz}
\makeatletter
\newlength{\qw@size}
\define@key{qrwifi}{size}{\setlength\qw@size{#1}}
\define@key{qrwifi}{encryption}{\def\qw@enc{#1}}
\setkeys{qrwifi}{
encryption=WPA,
size=5cm,
}
\newcommand{\qrwifidata}[2]{%
WIFI:S:#1;T:\qw@enc;P:#2;;%
}
\newcommand{\qrwifi}[3][]{%
\begin{tikzpicture}%
\setkeys{qrwifi}{#1}%
\node at (0, 0) {%
\qrcode[level=H,height=\qw@size,padding]{\qrwifidata{#2}{#3}}%
};
\node[fill=white,align=center] at (0, 0) {#2\\#3};%
\end{tikzpicture}%
}
\makeatother
\begin{document}
\qrwifi[encryption=WEP]{SSID}{Key}
\end{document}