【限りなく宣伝】
2012/12/01 〜 2012/12/25TeX & LaTeX Advent Calendar
→6 日目は peccu さん「= Excelに嫌気がさしてLaTeXで書き直した話」です。
こち(ry
* * *
「変換して TeX プログラミング」の例シリーズ。
Lua で「パスカルの三角形」してみた
[pascaltrig0.lua]
-- 整数型: n, m -- 配列型: v v = {} -- 固定 --(公開) pascal_trig(整数n) -- 第n行までのパスカルの三角形を出力する. function pascal_trig(_1) for n = 0, _1 do v[n] = 1 for m = n - 1, 1, -1 do v[m] = v[m] + v[m - 1] end for m = 0, n do io.write(("%4d"):format(v[m])) end io.write("\n") end end -- メイン pascal_trig(10)
実行結果。
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 1 10 45 120 210 252 210 120 45 10 1
配列を名前参照に書き換えた後のプログラム。
[pascaltrig1.lua]
-- 整数型: n, m, j, k -- 配列型: v --(公開) pascal_trig(整数n) function pascal_trig(_1) n = -1 while n < _1 do n = n + 1 _G["v/"..n] = 1 m = n; m = m - 1 while m > 0 do j = m; j = j - 1; k = _G["v/"..j]; k = k + _G["v/"..m] _G["v/"..m] = k; m = j end m = -1 while m < n do m = m + 1 io.write(("%4d"):format(_G["v/"..m])) end io.write("\n") end end -- メイン pascal_trig(10)
TeX で「パスカルの三角形」してみた
出力は次のような感じで行う。
\begin{center}\small \makebox{2.5em}{1}\par \makebox{2.5em}{1}\makebox{2.5em}{1}\par \makebox{2.5em}{1}\makebox{2.5em}{2}\makebox{2.5em}{1}\par \end{center}
つまり 1 つの数を一定の幅(中央寄せ)で出力し、全体も中央揃えとする。これで左右対称の綺麗な三角形の形に全体が出力される。ここで、\small
や 2.5em
は出力する環境(フォントの種類)や pascal_trig
の引数(何段まで出力するか)により最適な値が依存する。なので、ここはマクロ \pascaltrigfont
と \pascaltrigcellwidth
として可変にしておく(\renewcommand
で設定を変えられる)。
完成したパッケージのコードは以下の通り。パッケージ名は tcpascaltrig、名前空間は tcpc。公開命令は \pascaltrig
である。
[tcpascaltrig.sty]
\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tcpascaltrig} %% 変数定義 %(整数値) \newcount\tcpc@n \newcount\tcpc@m \newcount\tcpc@j \newcount\tcpc@k %(配列型) %\tcpc@v/* \def\tcpc@nameedef#1{% \expandafter\edef\csname#1\endcsname } %%(公開:マクロ) \pascaltrigfont - 出力に用いるフォント指定 \newcommand*{\pascaltrigfont}{\small} %%(公開:マクロ) \pascaltrigcellwidth - 1つの数の出力の幅 \newcommand*{\pascaltrigcellwidth}{2.5em} %%(公開) \pascaltrig{整数n} % 第n行(0から)までのパスカルの三角形を出力する. \newcommand*{\pascaltrig}[1]{% \begin{center}\pascaltrigfont \tcpc@n=-1 \@whilenum \tcpc@n<#1\relax \do{% \advance\tcpc@n 1 \tcpc@nameedef{tcpc@v/\the\tcpc@n}{1}% \tcpc@m=\tcpc@n \advance\tcpc@m -1 \@whilenum \tcpc@m>0 \do{% \tcpc@j=\tcpc@m \advance\tcpc@j -1 \tcpc@k=\@nameuse{tcpc@v/\the\tcpc@j}% \advance\tcpc@k\@nameuse{tcpc@v/\the\tcpc@m}% \tcpc@nameedef{tcpc@v/\the\tcpc@m}{\the\tcpc@k}% \tcpc@m=\tcpc@j }% \tcpc@m=-1 \@whilenum \tcpc@m<\tcpc@n \do{% \advance\tcpc@m 1 \makebox[\pascaltrigcellwidth]{\@nameuse{tcpc@v/\the\tcpc@m}} }% \par }% \end{center}% } \endinput
テスト用文書は以下の通り。
[test-tcpascaltrig.tex]
\documentclass[a4paper]{article} \usepackage[scale=.8]{geometry} \usepackage{tcpascaltrig} \begin{document} \pascaltrig{15} \end{document}