« It's so hard to find good help... | Home

qrcodeのパッケージもスゴイ

Mon 21 Dec 2020 by mskala Tags used: , , ,

毎年日本語の練習のためにTeX & LaTeXのブログを書きます。 今年に#texadvent2020のテーマは「このパッケージもスゴイ!」とです。 さて、僕はqrcodeのパッケージがそれものです。 なぜと思いましょう。

これは「TeX & LaTeX Advent Calendar 2020」の21日目の記事です。 昨日(20日目)はwtsnjpさんでした。 明日(22日目)はMusicDumpさんです。

どこでもQRコードあります。 出荷のラベルと日本国のビサとポスターで、QRコードあります。

日本国のビサ

動物園で、スマホのカメラで写真を撮って情報のページを読みできます。

ワオキツネザル

qrcodeのパッケージとTeXで、QRコードの書きことが出来ます。 使いことがやすい。 パッケージのロード後、\qrcodeのマクロあります。

\documentclass{article}
\usepackage{qrcode}
\begin{document}
\qrcode{https://www.japari.pk/}
\end{document}

www.japari.pkのQRコード

デフォルトで、QRコードがリンクと思い込みます。 hyperrefのパケージでPDFのリンクを作ります。 リンクが欲しくなければ、パッケージオプションや\qrsetマクロや\qrcodeオプションや\qrcode*マクロあります。 パッケージオプションは「nolinks」でも、他のオプションが「nolink」です。

\usepackage[nolinks]{qrcode}
 
..
 
\qrset{nolink}
\qrcode{https://www.japari.pk/}
 
..
 
\qrcode[nolink]{https://www.japari.pk/}
 
..
 
\qrcode*{https://www.japari.pk/}

QRコードの大小が重点です。 いつも正方形だから、「height」のオプションが高さと横幅です。

\qrcode[height=1cm]{https://www.japari.pk/}
\quad
\qrcode{https://www.japari.pk/}   % 2cm ga default
\quad
\qrcode[height=3cm]{https://www.japari.pk/}

QRコードの大小

マニュアルで色々なオプションがあります。 使いことがやすいです。

そういえば、なぜ「スゴイ」と言いますか?

QRコードの定義は難しいです。 コードの中でたくさんな奇偶検査ビットとエラー補正ビットあります。 煩雑な階層プロトコルです。

QRコードのフォーマット

もしかしたらLuaTeXを使えば、Lua言語でその算出ができます。 一方では、pstricksのでPostscriptのプログラムを使うことができます。 でもqrcodeのパケージがLuaTeXやpstricksを使えないです。 TeXマクロは全部の算出をしていますよ。

TeXマクロの中では、リード・ソロモン符号の実現です。 2進行列とGF(256)の算数もしています。 \advanceとか\expandafterとか\relaxです。 ぜったいにAnders Hendrickson先生はTeXマクロを書きました。

\def\FX@polynomialdivide@recursive#1#2{%
  % #1 = f(x), of degree n
  % #2 = g(x), of degree m
  % Obtains a new polynomial h(x), congruent to f(x) modulo g(x),
  % but of degree at most n-1.
  %
  % If leading coefficient of f(x) is 0, strips off that leading zero.
  % If leading coefficient of f(x) is a, subtracts off a * g(x) * x^(n-m).
  % N.B. we assume g is monic.
  %
  \FX@testleadingcoeff(#1)%
  \ifFX@leadingcoeff@zero%
    %Leading coefficient is zero, so remove it.
    \xa\def\xa\FX@numerator\xa{\FX@stripleadingzero(#1)}%
  \else%
    %Leading coefficient is nonzero, and contained in \FX@leadingcoefficient
    \FX@subtractphase{#1}{#2}{\FX@leadingcoefficient}%
    \ifFX@subtract@failed%
      %If subtraction failed, that means our #1 was already the remainder!
      \FX@divisiondonetrue%
      \edef\qr@theremainder{#1}%
    \else%
      %xor succeeded. We need to recurse.
      \xa\xa\xa\edef\xa\xa\xa\FX@numerator\xa\xa\xa{\xa\FX@stripleadingzero\xa(\FX@subtraction@result)}%
    \fi%
  \fi%
  \addtocounter{qr@divisionsremaining}{-1}%
  \ifnum\c@qr@divisionsremaining=0\relax
    %Division is done!
    \FX@divisiondonetrue%
    \edef\qr@theremainder{\FX@numerator}%
    \relax%
  \else%
    \xa\FX@polynomialdivide@recursive\xa{\FX@numerator}{#2}%
  \fi%
}%

スゴイ!

0 comments



(optional field)
(optional field)
Answer "bonobo" here to fight spam. ここに「bonobo」を答えてください。SPAMを退治しましょう!
I reserve the right to delete or edit comments in any way and for any reason. New comments are held for a period of time before being shown to other users.