有沒有辦法在 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 變數:\usekomavar
fromemail
\fromemail
\documentclass{scrlttr2}
\setkomavar{fromemail}{[email protected]}
\usepackage[final]{qrcode}
\usekomavar[\def\fromemail]{fromemail}
\begin{document}
\qrcode{mailto:\fromemail}
\end{document}