TeX Alchemist Online

TeX を使って化学のお仕事をしています。

TeX で乱数を使う (3) ~ 逆置換の活用

前回の記事で作成した randomshuffle パッケージには,n次対称群 $\mathfrak{S}_n$ の元 $\sigma$ をランダムに生成したとき,同時にその逆置換 $\sigma^{-1}$ も生成する仕様になっていました。逆置換はどういう場面で役立つのでしょうか。

例えば次のような,英語の試験でよくある語順整序問題とその解答を見てみます(問題ネタは2016年センター試験「英語」より)。

f:id:doraTeX:20190117014913p:plain

このような語順整序問題の生成と解答表示では,次のように,置換とその逆置換が両方作用しています。

f:id:doraTeX:20190117022232p:plain

まず,解答選択肢記号 ㋐~㋕ に応じて単語を順に割り当て,それをシャッフルすることで問題の語群を生成します。次に,解答においては,空欄番号 1~6 に当てはまる正解の単語記号 ㋐~㋕ を表示します。このとき,前半の「シャッフルされた語群の生成」と後半の「それを正しい順に並べた単語記号列の生成」では,ちょうど置換と逆置換の関係になっています。

これを利用して,ランダムにシャッフルされた語群を毎回自動生成し,その正解も自動出力するという文書を作ってみましょう。

続きを読む

TeX で乱数を使う (2) ~ ランダムなシャッフル

前回の記事では,TeX で乱数を生成するいろいろな方法を調べ,その使用例としてモンテカルロ・シミュレーションを見ました。本記事では,実際の組版の場面においてより実用的と思われる乱数の活用例を見てみましょう。

教材作成の仕事をしていると,周囲でしばしば「TeX で乱数って作れないんですか?」という質問を耳にします。前回の記事で見たように,TeX で乱数を生成する方法は多々あります。しかし,そのような質問をする教材作成関係者が思い描いている「乱数」というのは,乱数そのものではなく,「ランダムなシャッフル」である場面が多く見られます。要するに,「問題がランダムな順序で出題される試験問題を作りたい」という要望であるわけです。乱数の場合,1, 3, 3, 1, 3, 2,... のように,同じ値が何度も登場しますが,それをそのまま試験の問題番号としてしまうと,同じ問題が何度も出てきてしまって,試験としてふさわしくありません。あくまで,n個の問題を並べ替えた n! 通りの順列の中からランダムに1つの順列を選び出して試験として出題したい,というわけですね。

シャッフリングアルゴリズム

さて,n個のものをランダムな順序にシャッフルするには,どうすればよいでしょうか。これもまた Knuth 先生の The Art of Computer Programming を見てみましょう。The Art of Computer Programming, Vol.2, 3rd ed., §3.4 に,Algorithm P として,次のようなシャッフリングアルゴリズムが掲載されています。

f:id:doraTeX:20190116000732p:plain
出典:Donald E. Kunth, The Art of Computer Programming, Vol.2, 3rd ed., §3.4

このアルゴリズムを TeX 言語で実装してパッケージ化してみました。

続きを読む

TeX で乱数を使う

この記事は TeX & LaTeX Advent Calendar 2018 の19日目の記事です。18日目は keisuke495500 さんでした。 20日目は isaribi_saitoh さんです。

本記事では,TeX で乱数を取り扱う方法,および乱数の活用法を解説します。

  • 線形合同法による擬似乱数生成
  • seed の与え方
    • TeX による時刻取得
  • TeX で擬似乱数を生成する種々の方法
    • lcg パッケージ
      • 毎秒異なる seed を指定したい場合
    • fp パッケージの \FPrandom
    • pgf パッケージの rnd / rand / random
    • 専用プリミティブ
      • 実装
      • 既知の不具合
    • expl3 の \fp_eval:n
    • LuaTeX の math.random
    • LuaTeX でメルセンヌ・ツイスターの Lua 実装ライブラリを呼び出す
  • 乱数を使う:モンテカルロ・シミュレーション

線形合同法による擬似乱数生成

決定的な動きをする計算機で真の乱数を作り出すことは原理的に不可能なので,(熱雑音を利用するハードウェア乱数生成器など外部からの不規則な入力を用いてランダムネスを実現する方法はありますが)通常は見た目上ランダムに見える数列を計算式に従って規則的に作り出した擬似乱数を用います。擬似乱数を作り出す計算式としては,素朴な方法である線形合同法 (Linear Congruential Generator, LCG) が,実装の単純さおよび動作の高速さゆえに,昔から広く用いられています。

続きを読む

連番のQRコードを大量生成する

f:id:doraTeX:20180727224927p:plain

顧客ID・請求コード・受験番号といった番号や記号をQRコードにエンコードして用紙に印刷しておき,相手ごとに個別化された用紙を配りたい」という状況はよく生じると思います。 それをLaTeXで実現する場合の一例を示します。

また,LaTeX初心者の人にとっては,QRコードは無関係であったとしても「Wordでいう差し込み印刷のようなことをLaTeXでどうやって実現するか」のサンプルにもなるでしょう。

なお,このサンプルに掲載の個人情報は,ダミー個人情報生成サイト なんちゃって個人情報 を活用してランダム生成しました。サンプルデータ作成にとても便利なサイトです。

方法1:qrcodeパッケージでその場で生成する

TeX Live には,qrcodeパッケージ が収録されています。これは,(ASCII文字限定ではありますが)引数に与えられた文字列を

\qrcode{https://ctan.org}

のようにしてQRコードに変換できる便利なパッケージです。これで生成されるQRコードは画像ではなく,なんと TeX の \rule によって描かれた黒正方形の集合体となっています。 (qrcode.sty のソースを見ると,これをよくTeXで実装したなぁと感心させられます……!)

続きを読む

Overleaf v2 で日本語を使用する方法

この記事は,過去の記事「Overleaf で日本語を使用する方法」を,新サービス Overleaf v2 仕様にアップデートしたものです。

Overleaf(旧writeLaTeX) は,オンラインで使える LaTeX 原稿執筆環境として非常に便利です。自分のマシン内に TeX 環境を構築するのは一手間二手間かかりますし,インストールする権限がない場合や,出先の端末を使う場合などにも,環境整備の必要なくブラウザのみですぐに LaTeX 原稿を執筆できるのは好都合でしょう。

また,Google Document のような複数人による共同編集機能もあります。複数人で環境を揃えて同時共同執筆を行うことができるのは,クラウドならではのメリットでしょう。

2017年,Overleaf と同様のオンラインLaTeXエディタである ShareLaTeX というサービスが,Overleaf に買収されることが発表されました。そして,それを受けて,昨日,両者の長所を“いいとこ取り”した新サービス Overleaf v2 が公開されました。現時点ではベータ版サービスとなっていますが,旧バージョンと比べて動作も快適,見た目も綺麗になっており,SyncTeX にも対応しているなど,とてもいい感じになっていますので,早速 v2 に移行してしまってもよさそうです。

Overleaf の用途

Overleaf は,

  1. 自分の LaTeX 原稿を,自分で環境を構築することなくオンラインで作成する。
  2. 複数の著者で原稿を共同編集する。
  3. ソースとコンパイル結果のセットを閲覧専用で展示する。

といった使い方ができます。自分が愛用しているのは3番の機能(link sharing と呼ばれています)です。「このソースをコンパイルするとこんな結果になりますよ」というのを見やすく示すことができます。

Overleaf v2 による TikZ 図版の展示例

自分はこの機能を,TikZ 図版のソース例を示すのによく用いています。

Overleaf v2 で日本語を使用する

Overleaf v2 は,現時点ではバックグラウンドで TeX Live 2017 が動いています*1。ということは,(u)pLaTeX や dvipdfmx も入っているわけで,日本語を用いた和文文書も作れるはずです。 ただし,Overleaf は,v2 になっても依然としてデフォルトでは (u)pLaTeX エンジンを使う設定が用意されておりませんので,和文文書を作成するには多少設定が必要です。

公式のヘルプに Overleaf で pTeX を使う方法 の解説があるのですが,この方法では pLaTeX + dvipdf (≒ dvips + gs)という変換経路になります。日本で現在主流であろう,(u)pLaTeX + dvipdfmx の経路で作成するには,次のように設定する必要があります。

*1:旧Overleafから移行したプロジェクトは TeX Live 2016 でコンパイルされ,新規作成したプロジェクトは TeX Live 2017 でコンパイルされるようです。

続きを読む