2018年12月14日

Ackermann関数を計算過程を込めて出力するやつのTeX版を展開できるようにしたやつ.$\mathrm{Ack}$をAckermann関数とする.

  • \Ack{n}{m}を展開すると$\mathrm{Ack}(n,m)$の計算過程が出てくる.各々の段階は\AckOutputでくるまれる.例えば$\mathrm{Ack}(1,0) = \mathrm{Ack}(0,1) = 2$に対応して,\Ack{1}{0}を展開すると\AckOutput{A(1,0)}\AckOutput{A(0,1)}\AckOutput{2}となる.
  • e-TeX拡張は使う.といっても使うのは\numexprのみである.+1と-1はこれを使わないと面倒…….
\documentclass[a4paper]{article}
\makeatletter
\def\Ack#1#2{\ac@next{\ac@func{\ac@num{#1}}{\ac@num{#2}}}}
\def\ac@func{\ac@func}
\def\ac@num{\ac@num}
\def\ac@endmark{\ac@endmark}
\def\ac@eattoendmark#1\ac@endmark{}
% #1=\ac@num{n}ならばTRUE
\def\ac@ifnum#1{%
  \expandafter\ac@eattoendmark\ifx\ac@num#1\ac@endmark\expandafter\@firstoftwo\else\ac@endmark\expandafter\@secondoftwo\fi
}
% ループを進める.\ac@outputで出力した後,#1が整数ならば終わり.そうでなければ\ac@eval@onceで計算を一段階進める.
\def\ac@next#1{%
  \ac@output{#1}%
  \ac@ifnum{#1}{}{\ac@eval@once#1\ac@endmark}
}
% \ac@num{n} -> n
\def\ac@numtorealnum#1{\the\numexpr\expandafter\@firstofone\@gobble#1\relax}
% #1 = \ac@num{n}, #2 = mの時n = mか
\def\ac@ifnumeq#1#2{%
  \ifnum\ac@numtorealnum{#1}=#2 \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
% 関数の計算を一段進める.#1=\ac@func, #2, #3は引数
% A(X,A(Y,A(....A(Z,A(V,W))..)を\ac@evel@end{の値}{Z}...{Y}{X}に置き換える
\def\ac@eval@once#1#2#3{%
  \ac@ifnum{#3}{%
    \ac@ifnumeq{#2}{0}{% A(0,#3) = #3 + 1
      \expandafter\ac@eval@end\expandafter{\expandafter\ac@num\expandafter{\the\numexpr\ac@numtorealnum{#3} + 1\relax}}%
    }{%
      \ac@ifnumeq{#3}{0}{% A(#2,0) = A(#2 - 1,1)
        \expandafter\ac@eval@end\expandafter{\expandafter\ac@func\expandafter{\expandafter\ac@num\expandafter{\the\numexpr\ac@numtorealnum{#2} - 1\relax}}{\ac@num{1}}}%
      }{%
        \ac@eval@othercase{#2}{#3}% その他
      }%
    }%
  }{%
    \ac@eval@once#3{#2}%
  }%
}
% {\ac@num{m}}{\ac@num{n}} -> @i{m - 1}{\ac@num{m}}{\ac@num{n}}
\def\ac@eval@othercase#1#2{%
  \expandafter\ac@eval@othercase@i\expandafter{\the\numexpr\ac@numtorealnum{#1} - 1\relax}{#1}{#2}%
}
% {m - 1}{\ac@num{m}}{\ac@num{n}} -> @ii{n - 1}}{m - 1}{\ac@num{m}}
\def\ac@eval@othercase@i#1#2#3{%
  \expandafter\ac@eval@othercase@ii\expandafter{\the\numexpr\ac@numtorealnum{#3} - 1\relax}{#1}{#2}%
}
% {n - 1}}{m - 1}{\ac@num{m}} -> @iii{m}{n - 1}}{m - 1}
\def\ac@eval@othercase@ii#1#2#3{%
  \expandafter\ac@eval@othercase@iii\expandafter{\the\numexpr\ac@numtorealnum{#3}}{#1}{#2}%
}
\def\ac@eval@othercase@iii#1#2#3{%
  \ac@eval@end{\ac@func{\ac@num{#3}}{\ac@func{\ac@num{#1}}{\ac@num{#2}}}}%
}
% {の値}{Z}...{Y}{X}\ac@endmarkをA(X,A(Y,A(....A(Z,A(V,W))..)に戻し,\ac@nextに回す
\def\ac@eval@end#1#2{%
  \ifx#2\ac@endmark\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi{%
    \ac@next{#1}%
  }{%
    \ac@eval@end@i{#1}{#2}%
  }%
}
\def\ac@eval@end@i#1#2{%
  \ac@eval@end{\ac@func{#2}{#1}}%
}
% 出力ルーチン.\ac@func{#1}{#2}をA(#1,#2)に,\ac@num{#1}を#1にして,最後に\AckOutputでくるむ
\def\ac@output#1{%
  \expandafter\AckOutput\expandafter{\romannumeral-`0\ac@output@i{#1}}%
}
\def\ac@output@i#1{%
  \ac@ifnum{#1}{\the\numexpr\ac@numtorealnum{#1}\relax}{\ac@output@ii#1}%
}
\def\ac@output@ii#1#2#3{%
  \expandafter\ac@output@iii\expandafter{\romannumeral-`0\ac@output@i{#3}}{#2}%
}
\def\ac@output@iii#1#2{%
  \expandafter\ac@output@iv\expandafter{\romannumeral-`0\ac@output@i{#2}}{#1}%
}
\def\ac@output@iv#1#2{A(#1,#2)}
\makeatother

\begin{document}
\def\AckOutput{\noexpand\AckOutput}
% \AckOutput{A(1,1)}\AckOutput{A(0,A(1,0))}\AckOutput{A(0,A(0,1))}\AckOutput{A(0,2)}\AckOutput{3}
\message{^^J\Ack{1}{1}^^J}
% 出力のための\AckOutputの定義
\newbox\AckBox
\newif\ifAckFirst
\AckFirsttrue
\def\AckOutput#1{%
  \ifvoid\AckBox
    \setbox\AckBox=\hbox{$#1$}%
    \copy\AckBox
  \else
    \ifAckFirst
      \AckFirstfalse
      ${}=#1$%
    \else
      \par\noindent
      \hskip\wd\AckBox
      ${}=#1$%
    \fi
  \fi
}
\noindent
\Ack{3}{1}
\end{document}

2018年12月13日

ゼルダクリアした.というかしてしまった.ラストダンジョンの探索でもしようと思ってうろちょろしていたらボスにたどり着いた…….リセットする理由もないのでそのまま戦闘に.神獣は解放していたので戦闘が始まるとともにHPが半分に減る.もう一発撃ってくれ.防具をぼちぼち鍛えていたおかげかあまりダメージを受けず,受けても大量にもっていた焼きリンゴで回復.ラスボスの目の前で焼きリンゴむさぼり食っているというのもなんか変だが…….ボス戦はどうすればよいのかよくわからかかったので前半は適当に突っ込んで殴る,後半は全くダメージが通らないしジャストガードはもちろんできないし(というか四回ミスって盾が消えた)で困ったけど雷落とすとダウンすることに気がついて倒せた.とにかくダメージが少ないし持ち物も気にせず使いまくれるので,適当なカースガノンの方が手強かった感じ.そもそも一回も負けてないしな.その後は実質イベント戦ですかね.ウツシエの記憶を全部とってないので,とってからまた突っ込む.

2018年12月12日

おー冷え込む.しかし寒さが中途半端である.もっと中途半端なのは家の暖房だが.

(よくある話だが)学生の頃は1Kのアパートに住んでいた.暖房はエアコンとこたつがあったがもっぱらこたつのみを利用.潜り込んでいると十分暖かいのだが,潜り込んでしまって動けなくなるという欠点はよく知られているとおりである.ただ,かえってこたつに潜り込んでしばらくすると,部屋全体が暖かくなってくる.自分やこたつの熱で部屋が暖められたのだろう.一つの狭い部屋にとどまり続けているからこそなのだが.しかし結局こたつの熱で部屋全体が暖まっているわけで,それならば結局エアコンつけても電気代的にあまり変わらなかったりしたのだろうか?

こたつを使う上で一つだけ困ったのがパソコンである.パソコンは別の机の上においていたので,使うにはこたつから出なければならない.最初はキーボードとマウスだけこたつにもってきてみたりしたが,やはり画面が遠くて見えなかったので,ディスプレイも込めておいてみたのだが,やはりなんか使いにくくてやめた記憶がある.結局どうしたんだろうなぁ.こたつにもなる机があることを知ったのはもっと後である.

ふと自分が学生の時に住んでいたアパートを検索してみた.まだ存在しているようだ.家賃は僕が借りていた時よりも一万円ほど下がっているが.

2018年12月11日

ある量$A_i$と$B_i$($i$はある集合を走る)を計算しようと試みていた.とにかくどちらか計算したい.$\sum_i A_i$が割と簡単に計算できるので,最初は$A_i$を下から評価してやろうと思ったのだが,いまいちできない.単体としては$B_i$の方が扱いやすく,こちらは下からの評価は得られるのだが$\sum_i B_i$はよくわからない,という状況.

別の理論を使っても$B_i$の評価が得られるのだが,その証明をきちんと見ると$B_i$は計算できていることに気がついた.これで$B_i$は片付いたので,$A_i$も計算してみようと.$B_i$の計算とそれに使った理論から$A_i$の下からの評価は可能.さて,後はこれが一致することを示せば良いのだが.とまで思ったのが一昨日.

……いやいや$\sum_i A_i$は計算できているのだから,下からの評価が得られれば終わりだよねって最初に思ったじゃん,というのに今朝気がついた.昨日僕は何をしていたんだ……?細かいところはチェックしていないので,今から正しいことをしているかチェックする.

2018年12月9日

九月頃に東京ラブストーリーが再放送をしていて,録画しておいたのを見た.いろいろなものが1991年である.特に携帯がないのは,話全体に影響を与えている気がする.今の人たちが見たらどうなるんだろうと思ったら,今の女子高生に東京ラブストーリー見せてみたとか言う動画が.苦行になっている…….

とにかく小田和正の破壊力が強すぎる…….

2018年12月6日

ソフトバンクの携帯電話が一時半頃から六時頃までろくにつながらなかったようで.携帯がつながらなくても,殆ど使わない自分にはあまり関係ないですが…….テレビを見ていると,時間も場所も決めずに会おうとしていたら詰んだとか.何も決めずにとりあえず会うことだけ決めておくとか,現代ですねー.初めて公衆電話使ったとかいう人もいたけど,そりゃそうなるよなぁ.とおじさん感想.

おじさん感想ついで.ポケベルがもうすぐサービス終了らしい.子供の頃,女子高生が公衆電話のボタンをすごい勢いで押していたなぁ.最初ポケベルというものを知らなくて,何をしているんだろうと思った記憶が.

2018年12月5日

jlreq.clsの(x)kanjiskipの話.こんなんが流れてきたので.(反射的にkanjiskipなんだろうと思ったけど,それを0pt plus 0pt minus 0ptにしても字間にはあまり影響がないということなので,結局関係ない話である.)xkanjiskipもkanjiskipも同じなので,以下はkanjiskipのみ.42462c1以降に基づく.

kanjiskipを変更することは仕様としては認めていないのだが,想定はしている.具体的には,

\newcommand{\jlreqkanjiskip}{0pt plus 0.4pt minus 0.5pt}
\documentclass{jlreq}
とすれば,文書内でのkanjiskipが0pt plus 0.4pt minus 0.5ptとなる.なお,pLaTeX / upLaTeX / LuaLaTeXすべてで有効.

文章中で変更したい場合はもう少し注意が必要である.jlreqのkanjiskipの扱いは次の通り.

  • 組む際に参照されるのはレジスタ\kanjiskip(pLaTeX / upLaTeX)/ \ltjsetparameterで設定できるLuaTeX-jaのkanjiskipパラメータ(LuaLaTeXの時)
  • 文字サイズの変更の際に,\kanjiskipまたはkanjiskipパラメータを更新する.その際にはマクロ\jlreqkanjiskipの中身を参照する.

従って,\jlreqkanjiskipを更新しても即時では変更が反映されず,\kanjiskipまたはkanjiskipパラメータの更新が必要である.逆に,文字サイズの変更命令が現れないような短い間だけ変更したいならば,\kanjiskipまたはkanjiskipパラメータの変更のみでよい.

このように,変更できる手段を用意したのは次の理由による.

  • 「均等割り」のような,kanjiskipを使った手法が存在するので,それへが使えるようにするため.
  • jlreqのkanjiskipは0pt plus 0.25zw minus 0ptとかなり広がりやすく,適切ではないと考える人がいるかもしれない.

JFMとkanjiskipとxkanjiskipと

kanjiskipの値(0pt plus 0.25zw minus 0pt)は次で決めている.

  • 文字間グルーは「日本語組版処理の要件」における表1,表3,表6により定める.
  • 原則として,文字間グルーはJFMで指定する.ただし,漢字類(cl-19)と漢字類との間はkanjiskip,漢字類と欧文用文字(cl-27)との間はxkanjiskipで設定することとし,JFM内でのグルーは設定しない.
  • kanjiskipには漢字類同士の間のグルー(0pt plus 0.25zw minus 0pt)を,xkanjiskipには漢字類と欧文用文字との間のグルー(0.25zw plus 0.25zw minus 0.125zw)を設定する.
  • 表によれば,平仮名(cl-15)と漢字類との間のグルーは,漢字類同士の間のグルーと優先順位まで含めて全く同じである.このように優先順位を込めて漢字類同士の間のグルーと全く同じサイズのグルーが設定されている場所のグルーは,JFM内では設定しない.従ってこの間のグルーはkanjiskipにより支配される.xkanjiskipに対応する部分も同じである.
  • LuaTeX-jaでは,優先順位を表の通りに設定する.