koma 変数で QR コードを使用しますか?

koma 変数で QR コードを使用しますか?

LaTeX で koma 変数を入力として QR コードを作成する方法はありますか?

パッケージを使用しています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}

それはなぜでしょうか? また、QR コードで直接 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}

ここに画像の説明を入力してください

2つのQRコードはログファイルで確認できるように同じものです。

<Reading QR code for "mailto:[email protected]" at level 2-Q from aux file.>

2 番目のインスタンスの場合、パッケージはそれが以前にビルドされたものと同じであると認識することを意味します。

答え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}

ここに画像の説明を入力してください

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

私は Markus Kohm (koma-script の作者) と話をしましたが、koma-script で意図されている解決策は、 の機能を使用して、\usekomavarkoma-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}

関連情報