\qrcode{...} 内的宏评估

\qrcode{...} 内的宏评估

我有两个宏。第一个宏\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}

但是使用后一个版本会产生很多错误,例如“未定义的控制序列”和“非法参数编号”。我猜,这与宏扩展顺序有关,所以我尝试插入一些\expandafters,但无济于事。

我怎样才能\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}

在此处输入图片描述

相关内容