使用 qrcode 和 koma 變數?

使用 qrcode 和 koma 變數?

有沒有辦法在 LaTeX 中以 koma 變數作為輸入建立二維碼?

我正在使用該軟體包qrcode,一切正常,並且該軟體包易於使用。然而,當我嘗試使用 koma 變數作為文字 LaTeX 的輸入時,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) 中的文檔,秒。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

\usekomavar我已經與 Markus Kohm(koma-script 的作者)交談過,他告訴我 koma-script 的預期解決方案是使用將 koma-variable 擴展為可選變數的第一個參數的功能\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}

總而言之,簡單而乾淨的解決方案是定義koma 變數的內容\fromemail並將其擴展為其中的內容,然後在需要擴展變數時使用而不是 koma 變數:\usekomavarfromemail\fromemail

\documentclass{scrlttr2}

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

相關內容