マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

“TeX”でナベアツする件とか、暮れのごあいさつとか

年末なので、ぼんやりと某キ~タを眺めていたら、こんな記事を見つけた。

qiita.com

懐かしい🙂……おや?

ある日インターネットを徘徊してると「ナベアツのコードを自力で書けない人は,そのプログラミング言語を使える人たちの集合には属さない」という言説?を目にしました.

チョット調べたところ、確かにそういう言説を口にしているアレな人🙃が存在するようである。

TeX”でナベアツをしたい話

さらにその記事を読んでいくと「LaTeXをどこまで許容するのか」について議論されていた。

はじめは生の TeX 言語のみで(つまり plain TeX で使えるコードのみで)ナベアツを実装しようとしていたのですが,

これを読んで、昨年(2024年)の春にあった​「“TeX”とは何を指すのか」​の議論を思い出した。

zrbabbler.hatenablog.com

このときの議論に従うと、「LaTeXTeXではない」という見解の下では、“TeX”といえそうなものはiniTeXしかない。となると今までの議論の当然の帰結として、iniTeXで動くナベアツのコードが書けないと「自分がTeX言語を使える人である」と主張できなくなってしまう。

TeXができない人になるのはアレなので、iniTeXでナベアツをやってみることにした。

ただし、「2次方程式の解の公式」が固定された単発の文書として成立するのに対して、ナベアツは入力(上限の整数値)をもつ“機能”である。慣習が何も定まっていないiniTeXに対してライブラリのインタフェースを設計するのは困難である。そこで、ナベアツ専用のTeXのマクロパッケージ、名付けてNabeAzzTeXをつくることにする。もちろんplainなどの既存の実装は一切使わず、また拡張プリミティブをもたない元祖TeX上で動作させるという条件を課す。

TeX”でナベアツをしてみた話

構想が決まったので、早速NabeAzzTeXをつくってみた😃

[nabeazztex.tex]
% レイアウト設定
\hsize=97mm \vsize=159mm
\hbadness=1000 \vbadness=1000
\baselineskip=15pt
\parfillskip=0pt plus 1fil

\begingroup
  % コード設定
  \catcode`\{=1 \catcode`\}=2
  \catcode`\#=6 \catcode`\@=11

  % フォント設定
  \global\font\NA@normal=cmr10
  \global\font\NA@aho=cmfi10 at 12pt

  % 変数定義
  \global\countdef\NA@limit=100
  \global\countdef\NA@cnta =101
  \global\countdef\NA@cntb =102

  %% \NA@main
  % 1から \NA@limit までナベアツを出力した後ジョブを終了する.
  \gdef\NA@main{%
    \NA@normal % フォント設定
    % ナベアツする
    \par % 改段落
    \NA@cnta=1
    \NA@loop
    % ジョブを終了する
    \par \end
  }

  %% \NA@loop
  % ナベアツのループ処理.
  \gdef\NA@loop{%
    % 整数がアホかを判定する
    \chardef\NA@isaho=0
    \NA@cntb=\NA@cnta
    \divide\NA@cntb 3 \multiply\NA@cntb 3
    \ifnum\NA@cnta=\NA@cntb
      \chardef\NA@isaho=1
    \fi
    \expandafter\NA@has@three\the\NA@cnta3\relax
    % 整数を出力する
    \ifnum\NA@isaho=1
      {\NA@aho \the\NA@cnta}%
    \else
      \the\NA@cnta
    \fi
    \ % 区切りの空白
    % 末尾再帰
    \ifnum\NA@cnta<\NA@limit
      \advance\NA@cnta1
      \expandafter\NA@loop
    \fi
  }

  %% \NA@has@three
  % 文字列が3を含むかの判定の補助マクロ.
  \gdef\NA@has@three#13#2\relax{%
    \ifx!#2!\else
      \chardef\NA@isaho=1
    \fi
  }

  %% '\\'が無視されるようにする
  \gdef\\{}
  % ジョブ開始時に自動実行される処理
  \global\everyjob{%
    % 数字を読み取って \NA@main を呼ぶ
    \afterassignment \NA@main
    \NA@limit=%
  }
\endgroup

% おしまい
\dump

以下で使用法を説明する1。独自マクロパッケージなのでまずフォーマットを作成する必要があるが、これは以下のコマンドで行える。

tex -ini nabeazztex.tex

これでフォーマットファイルnabeazztex.fmtが生成されるが、以下ではこのファイルをカレントに置く2ことを前提とする。

NabeAzzTeXの入力ファイルは以下のように「ナベアツの入力となる整数値」だけが書かれたテキストファイルである。

[input.tex]
40

この場合、以下のコマンドで入力ファイルをタイプセットできる。

tex -fmt=nabeazztex input.tex

入力の整数値は(一般のTeXの仕様として)コマンド行(または対話モード)でも与えることができるが、この場合は「\から始まらない入力文字列はファイル名とみなされる」という問題がある。このため、NabeAzzTeXでは\\が無視される(空に展開される)ようになっている。

(コマンドプロンプトの場合)
tex -fmt=nabeazztex \\40
(bashの場合)
tex -fmt=nabeazztex '\\40'

何れの場合もナベアツの結果が書かれたDVIファイル3が出力される。

出力結果

というわけで、無事に「TeXが使える人」になることに成功した(あんしん🤯)

まとめ

今年も一年、ありがとうございました!

いつものやつ🙃

ZR「というわけで、来年も当(くだらない)ブログをよろしくお願いします!」
*「アレレ、いつの間にか『除夜のカントカ』が定番ネタ扱いになってる😲」


  1. TeX Live等の現代的なTeXシステムを前提とする。
  2. まあ多分、ちゃんと“インストール”して使いたい人はいないでしょう🙃
  3. 出力DVIファイルはA5判縦の用紙を前提としたレイアウトになっている。用紙サイズ設定の情報は含まれないので、例えばdvipdfmxでPDFに変換する場合には-p a5のオプションを指定する必要がある。