TeX Alchemist Online

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

「サイゼリヤで1000円あれば最大何kcal摂れるのか」をTeX言語で計算する ~TeX言語で動的計画法(DP)~

最近,巷では「サイゼリヤで1000円あれば最大何kcal摂れるのか」を計算するのが流行っているようです。

しかし,「サイゼリヤで1000円あれば最大何kcal摂れるのか」をLaTeX文書化して組版することを考えたとき,

  1. 何らかのプログラミング言語を用いて「サイゼリヤで1000円あれば最大何kcal摂れるのか」を計算する。
  2. その結果をLaTeXソースとして打ち込んで文書化・組版してPDFを得る。

というのではいかにも二度手間です。TeX言語はプログラミング言語でもあるのだから,計算と組版を一気にやってしまいましょう!😏

解法

上記の記事では,量子アニーリング計算やSMTソルバーなどを使って解かれていますが,この問題は典型的な0-1ナップサック問題の構造をしているので,動的計画法(DP)で解くのが標準的です。

ja.wikipedia.org

TeX言語で解いた結果

f:id:doraTeX:20190520123906p:plain

(中略)

f:id:doraTeX:20190520124004p:plain

というわけで,先人たちの試みと同じ結果が得られました!

f:id:doraTeX:20190520124220p:plain

(イメージ図:tanakh さんの記事より)

https://cdn-ak.f.st-hatena.com/images/fotolife/w/waenavi/20190519/20190519203006.jpg

LaTeX文書ソース

サイゼリヤのメニュー一覧は saizeriya.db (SQLite DB形式)から取得しました。また,計算量削減のため,ゼロカロリーのメニュー項目(ドリンク類)は除去してあります。

続きを読む

MacTeX 2019 のインストール&日本語環境構築法

f:id:doraTeX:20030806235338j:plain

(MacTeX 付属の mactex.jpg より)

一昨日,とうとう TeX Live 2019 がリリースされました。TeX Live 2019 の新機能・仕様変更の詳細は,次の2つの記事に網羅的にまとまっていますので,そちらをご参照ください。

acetaminophen.hatenablog.com

acetaminophen.hatenablog.com

また,新元号「令和」にきちんと対応したのも TeX Live 2019 の特徴です。これについては昨日の記事をご参照ください。

doratex.hatenablog.jp

TeX Live 2019 と同時に,macOS 用ディストリビューションである MacTeX 2019 もリリースされました。個人的には MacTeX は使っていないのですが,日本にも MacTeX のユーザは多いようですので,MacTeX のインストール&ヒラギノ埋め込み設定手順を解説しておきます。最新の Mojave を含む各OSに対応しています。初心者でも分かるよう,丁寧に手順を解説しておきます。

1. MacTeX 2019 をダウンロード&インストール

※MacTeX 2019 をインストールするには,macOS 10.12 Sierra 以上のOSが必要です。

※ 旧バージョンの MacTeX 2018 以前がインストールされている場合であっても,(ディスク容量の無駄を気にしなければ)旧バージョンを事前に削除しておく必要はありません。

MacTeX 2019 はファイルサイズが大きい(3.5GB)ため,ダウンロードする際は,公式サイトよりも,近くのミラーサイトからダウンロードした方がよいでしょう。

お近くのミラーサイトから,最新の MacTeX の pkg ファイルをダウンロードします。

f:id:doraTeX:20190513012218p:plain

↑ミラーサイトからダウンロード

f:id:doraTeX:20190513083755p:plain

↑ダウンロードされるこのファイルをダブルクリック

f:id:doraTeX:20190502122103p:plain

↑「続ける」を押してインストールを実行


このように,MacTeX のインストール自体は簡単ですが,デフォルトではヒラギノフォント埋め込み設定,TeXShopの和文文書編集用設定がなされていません。 そこで,以下では,(u)pLaTeX + dvipdfmx + TeXShop でヒラギノ埋め込み和文文書作成をするための設定手順を解説します。

一部の設定には,ターミナルでコマンドを打ち込む必要があります。ターミナルは

/Applications/Utilities/Terminal.app

にあります。Finderで Command + Shift + U を押して「ユーティリティ」フォルダを開き,「ターミナル」アプリをダブルクリックするのが簡単でしょう。

f:id:doraTeX:20160607234014p:plain

2. Xcode Command Line Tools のインストール

Xcode Command Line Tools がインストールされていない環境では,tlmgr を実行すると,Xcode Command Line Tools のインストールを求めるダイアログが表示されます。

f:id:doraTeX:20180501121518p:plain

実は,このダイアログは「今はしない」を押して無視しても問題ありません。ですが,TeX Live を使っていると tlmgr コマンドを実行する機会が多く,そのたびにこのダイアログが表示されると面倒です。Xcode Command Line Tools はあって困るものではありませんので,ついでにインストールしておきましょう。Xcode Command Line Tools を明示的にインストールするには,

xcode-select --install

とすれば上記のダイアログを表示できます。既にインストール済みの場合はその旨表示されます。

【別解】

bash の場合,

CC=: tlmgr ...

のように tlmgr を起動すれば,このダイアログが表示されるのを抑止できます。sudo で tlmgr を起動する際には,

sudo bash -c "export CC=:; tlmgr ..."

のようにすれば抑止できます。が,毎回このように tlmgr を起動するのも面倒なので,さっさと Xcode Command Line Tools をインストールしてしまいましょう。

3. tlmgr で最新版にアップデート

まずは,TeX Live レポジトリの内容を最新版に更新するため,次のコマンドを打ち込んで実行してください(管理者ユーザで実行していることを前提としています)。

sudo tlmgr update --self --all

このとき,パスワードが問われます。このとき,セキュリティ上の理由により,打ち込んだパスワードは画面に一切表示されません。 パスワード文字数が見えてしまうのを防ぐため, * * * * のようなマスク文字も表示されません。 そのため,まるでキーボードが効いていないかのように見えますが,入力はされていますので,気にせずにパスワードを最後まで打ち込んで,return キーを押してください。

なお,sudo は管理者権限を用いて実行するためのコマンドです。一度実行すると,それからしばらくの間はパスワードなしで sudo を連続実行できます。

4. ヒラギノフォントの埋め込み設定

TeX Live のデフォルトでは,和文フォントとして IPAex フォントが埋め込まれる設定になっています。macOS に標準で用意されている美しい多書体のヒラギノフォントを TeX で使用するためには,munepi さんによる次のパッチを適用します。 (名前は bibunsho7-patch となっており,『[改訂第7版]LaTeX2e 美文書作成入門』の付属DVD用のパッチという位置づけなのですが,実は MacTeX にも対応していますので,『美文書作成入門』の有無とは無関係に使えます。)

github.com

上記リンクで,最新のパッチの dmg ファイルをダウンロードします。

f:id:doraTeX:20190327011139p:plain

ダウンロードされた dmg ファイルをダブルクリックします。

f:id:doraTeX:20190327011325p:plain:w150

マウントされて出てくる☃︎︎風のアイコンの Patch.app をダブルクリックします。

f:id:doraTeX:20190327011406p:plain:w150

警告ダイアログが表示されたら「開く」をクリックします。

f:id:doraTeX:20190327011431p:plain:w300

権限昇格ダイアログが表示されたら管理者ユーザのパスワードを入力します。

f:id:doraTeX:20190327015138p:plain:w300

「完了」というダイアログが表示されたら完了です。

以上で,(u)pLaTeX + dvipdfmx によって,美しいヒラギノフォントを埋め込んだ和文PDFを作成できるようになりました。

5. TeXShop の日本語設定

MacTeX をインストールすると,Mac 定番の TeX 統合環境である TeXShop が標準で付属してきます。日本語環境で TeXShop を使用するための設定手順を示します。 TeXShopは

/Applications/TeX/TeXShop.app

にインストールされています。

5.1 TeXShop の更新

MacTeX 2019 には,リリース時点での最新版 TeXShop が収録されています。TeXShop は更新頻度が激しいので,入手時点ではより新しい TeXShop がリリースされている可能性が高いです。最新版にアップデートしておくのがよいでしょう。 TeXShop を起動して,メニューから

TeXShop → アップデートを確認...

を選び,最新版へ更新しておいてください。

もしも自動アップデートに失敗する場合は,TeXShopの公式サイト から最新版のTeXShopをダウンロードして,/Applications/TeX/TeXShop.app を手動で置き換えてください。

5.2 TeXShop の日本語設定

TeXShop を起動して,メニューから

TeXShop → 環境設定...

を開いてください。設定画面が現れますので左下の 設定プロファイル ボタンをクリックします。 Unicodeを活用できる upLaTeX を使用する場合は upTeX (ptex2pdf) を,従来の pLaTeX を使用する場合は pTeX (ptex2pdf) というプロファイルを選択してください。(個人的には,これから LaTeX を始める人には,「この漢字はJIS第何水準漢字」とかを気にしなくていい upLaTeX の方がお勧めです。)

また,フォントは初期状態では Helvetica - 12 になっていますが,和文等幅フォントを使用したい場合は Osaka - 等幅 に変更しておくと見やすいでしょう。

f:id:doraTeX:20180501120607p:plain

今時だと,Adobe製のプログラミング用等幅フォント Source Han Code JP がいいかもしれませんね。

ics.media

設定変更を終えたら,OKボタンを押して環境設定を確定させ,一度 Command + Q で TeXShop を終了させましょう。*1

5.3 その他の推奨設定

TeXShop を終了させた後,ターミナルで次のコマンドを実行しておきましょう。

defaults write TeXShop FixLineNumberScroll NO
defaults write TeXShop SourceScrollElasticity NO
defaults write TeXShop FixPreviewBlur YES

そして,改めて TeXShop を起動します。

補足:これらの設定の意味

1行目の FixLineNumberScroll NO は,(10.7 Lionなど)古いOSにおいて存在した,行番号がスクロールしないOS側のバグに対処するための対症療法を停止させる措置です。最近の macOS ではこのバグが修正されていますので,この対症療法は不要となりました。対症療法が残っていると,スクロール速度が遅くなる原因となります。

2行目の SourceScrollElasticity NO は,スクロール時に上下端で大きく跳ね返るバウンスエフェクトを停止させる措置です。OS X 10.10 Yosemite 以降では,このバウンスがかなり大げさになり,以前のOSと比べてうっとうしさが目立つようになりました。ですからこのエフェクトは停止させておくのがよいでしょう。

3行目の FixPreviewBlur YES は,OS X 10.10 Yosemite 以降において,プレビューウィンドウのPDFが(一部の環境で)ぼやけて見えてしまうのを防止する措置です。

5.4 バックスラッシュ \ と円マーク ¥ をめぐる問題

環境によっては,TeXShop のウィンドウ上でJISキーボードの円マーク ¥ キーを押すと,TeXShop のウィンドウ上に円マーク ¥ あるいは \yen という命令が入力されてしまうケースがあります。これについては,日本語入力の設定,またはOSの入力設定をカスタマイズすることで,¥ キーをバックスラッシュ \ として入力するように設定しましょう。

また,TeXShop側の設定で,円マーク ¥ が入力されたら自動的にバックスラッシュ \ と入力されるように設定しておくと便利でしょう。


これで準備は完了しました。Happy TeXing!

6. 実験

和文 LaTeX 文書を作成してみましょう。TeXShop で次の文書を作成してください。

\documentclass[dvipdfmx,autodetect-engine]{jsarticle}% autodetect-engine で pLaTeX / upLaTeX を自動判定

\begin{document}

吾輩は猫である。名前はまだ無い。

どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所で
ニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。

\end{document}

なお,ソースウィンドウ上のスペルチェックが鬱陶しいという場合は,

環境設定... → 書類 → エディタ → スペルチェック

および

編集 → 入力中にスペルチェック

のチェックを外してください。

この文書に適当なファイル名を付けて保存し,Command + T を押してコンパイル(タイプセット)します。生成されたPDFが表示されれば成功です!

7. さらに使いこなすために

LaTeX のより進んだ使い方は,TeX Wiki や奥村晴彦・黒木裕介著『LaTeX2e 美文書作成入門』などを参照してください。

また,TeXShop には,コマンド補完機能をはじめ,TeX 文書作成を補助する多彩な機能が用意されています。メニューや環境設定を探ってみると,便利な機能の数々が見つかることでしょう。トラブルシューティングや Tips は,TeX WikiTeXShop FAQ に多数集められていますので,疑問が生じた場合はまずはこちらを参照してみてください。

*1:TeXShop の設定の一部には,「次回起動時から反映」という性質ものもがあります。ですから,環境設定パネルで何かの設定を変更した場合は,一度 TeXShop を終了させるようにしておくのが確実です。

令和時代の TeX Live

令和元年あけましておめでとうございます。新元号「令和」を迎えるにあたり,文字コード界やTeX界でも昨今動きが慌ただしいです。

  • 「㍾」「㍽」「㍼」「㍻」のような組文字の「令和」を U+32FF に追加した Unicode 12.1.0 のリリース

  • 文字集合規格 Adobe-Japan1-6 に「令和」組文字グリフ(横組用 CID+23058・縦組用 CID+23059)の2文字を追加した新規格 Adobe-Japan1-7 の発表
  • UniJIS-UTF16-H などの CMap ファイルの Adobe-Japn1-7 仕様への更新
  • 日本語TeX開発コミュニティによる改良版 CMap ファイル(UnjiJISup-UTF16-H など)の Adobe-Japan1-7 への追従
  • otfパッケージが新元号に対応,\ajLig{令和} の増設。
  • 新元号発表当日に和田研フォントがいち早く「令和」組文字グリフを収録。
  • Adobe による「源ノ角ゴシック」フォントも「令和」の組文字グリフを収録
  • Adobe-Identity-0 なフォントである「源ノ角ゴシック」を,TeXから使いやすい Adobe-Japan1 準拠に組み直したフォントである,TrueRoadさんによる原ノ味ゴシックフォントも,本家源ノ角ゴシックの更新に追従して「令和」の組文字グリフを収録。
  • IPAex フォントも「令和」の組文字グリフを収録
  • jclasses / ujclasses の新元号対応
  • jsclasses の新元号対応
  • babel-japanese の新元号対応
  • BXwareki パッケージの新元号対応

(他にも挙げ忘れているものがあるかも。)

そして,時を同じくして,昨日 TeX Live 2019 のリリースを迎えました。各方面の開発コミュニティの皆様のご尽力のおかげで,令和時代も初日から大変スムーズに TeX Live を満喫できるようになっています。関係者の皆様に感謝申し上げます m(__)m

【目次】

  • TeX で令和
    • upLaTeX で令和
    • pLaTeX + otf パッケージ + 原ノ味フォントで令和
      • 1. 原ノ味フォントのダウンロード
      • 2. otf パッケージのロード
      • 3. フォントの“スロット”としての otf パッケージ
      • 4. 使用フォントの選定
        • 従属欧文文字の使用
      • 5. pLaTeX でテスト
  • 追記:令和時代の dvipdfmx + AJ1フォント

TeX で令和

このように,TeX Live 2019 であれば,令和時代を迎えるための準備が整っていますので,令和時代も新元号を扱う上で特に障害は生じないでしょう。LuaTeX-ja や upTeX であれば,令和組文字グリフ「㋿」(U+32FF,ご覧のOSのフォントに収録され次第表示されるようになるはずです)を直接入力すれば,出力フォントがそのグリフを収録していればそのまま令和組文字グリフが出力されます。

続きを読む

TeX 文書中で日本語を含むQRコードを動的生成する(macOS環境下,shell-escapeあり)

昨日,Python ワンライナーを用いて macOS のデフォルト状態でコマンドラインからQRコード画像を生成する方法を紹介しました。

doratex.hatenablog.jp

この記事について,TeX界の大御所の目には,隠れた意図を軽々と見抜かれてしまいました😅

そこで,「真の目的」であった「TeX文書からのQRコードの動的生成」の話も述べておきましょう。

qrcode パッケージの利点と欠点

TeX文書内でQRコードを動的生成する方法としては,以前の記事で qrcode パッケージを紹介しました。

doratex.hatenablog.jp

qrcode パッケージは,TeX言語だけで実装されたQRコード生成パッケージです。TeX言語だけで実装されているため,shll-escape に頼ることなくTeXエンジン内で完結してQRコードを動的生成できるという強みがある一方,

  • エンコードできる文字列はASCII文字限定(したがって和文文字などはエンコードできない)
  • TeX言語の演算機能で実装されているため動作が遅い

という弱みがあります。動作速度に関しては,オーバーヘッドが多いはずの「shell-escape でシェルから他のQRコード生成プログラムを起動 → 画像ファイルを生成 → それをTeX文書へ読み込み」というワークフローと比べても遅く感じます。一文書に数百個のQRコードを埋め込むような文書を作ると,その遅さに悩まされることになります。

そこで,shell-escape を解禁するという条件で,QRコード動的生成の別の方法を探ってみましょう。

続きを読む

TeX で UUID を生成する

本日リリースされた TeX Live 2019 において,XeTeX に擬似乱数生成関連のプリミティブ \uniformdeviate‌ / \normaldeviate‌ / \randomseed / \setrandomseed が追加され,主要 TeX エンジンに乱数生成プリミティブが出揃うこととなりました。乱数生成プリミティブについての詳細は TeX & LaTeX Advent Calendar 201819日目の記事で述べたとおりです。

doratex.hatenablog.jp

UUID Version 4

そこで本日は TeX Live 2019 リリースを祝し,乱数の応用として UUID を TeX で生成してみましょう。UUID とは,衝突の可能性がほとんどなく一意な識別子として利用される 128bit の値です。通常,FCBD2ECC-039C-414B-8868-1594ADA2F8A8 のような16進表示で使われます。Windows では,Microsoft による UUID 実装である GUID をレジストリのエントリなどでよく見ることでしょう。

UUID にはいくつかのバージョンがありますが,UUID Version 4 ならば,乱数のみを用いて生成することができます。

TeX で UUID を生成するサンプルとしては,たとえば Stack Exchange に Generating random uuid in xelatex という項目がありました。ですがこれは単に乱数を32個並べているだけで,UUID Version 4 の仕様 (RFC 4122) を満たしません。UUID Version 4 の仕様に従う場合,xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxxM の桁はバージョンを表す 4 でなくてはならず,N の桁は(上位 2bit が RFC 4122 バリアントを表す 10 でなくてはならないため)8, 9, A, B のいずれかでなければなりません。

UUID Version 4 の仕様を満たす UUID 生成のコードは,世間にたくさんサンプルが見つかります。たとえば,Javascript による簡単なジェネレータ実装が Gist に見つかりました。

gist.github.com

このコード中の random & 3 | 8 という部分は,0~15の乱数 random を用いて,バリアントを表す N の桁(8, 9, A, B)をランダムに得ることを意図しています。ですがTeX言語への移植を考えるとき,ビット演算は(Oberdiek氏による bitset パッケージ を使えば可能ですが)やりにくいので,もっと直接的に,8, 9, A, B の中からランダムに1つチョイスするようにすればよいでしょう。

UUID 生成用 LaTeX パッケージ

以上に基づき,TeX言語による UUID 生成を LaTeX パッケージの形にまとめておきました(Stack Exchange の回答とほぼ同じ実装になってしまいましたが)

TeXエンジンにビルトインされた乱数生成プリミティブを用いるので,サポートエンジンは以下の通りとなります。

  • pdfTeX
  • LuaTeX
  • (u)pTeX (TeX Live 2017 以降)
  • XeTeX (TeX Live 2019 以降)
\usepakge{uuid}

として

\UUID

とすれば,FCBD2ECC-039C-414B-8868-1594ADA2F8A8 のような文字列が得られます(完全展開可能)。

\usepakge[lowercase]{uuid}

と,lowercase オプションを付けておけば,出力が fcbd2ecc-039c-414b-8868-1594ada2f8a8 のように英小文字で得られます。