【限りなく宣伝】
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}
