マクロツイーター

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

それでも TeX でパスカルの三角形したい人のための何か

【限りなく宣伝】
2012/12/01 〜 2012/12/25

TeX & LaTeX Advent Calendar

こち(ry

*  *  *

「変換して TeX プログラミング」の例シリーズ。

Lua で「パスカルの三角形」してみた

いつも通り、グローバル変数のみの 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 つの数を一定の幅(中央寄せ)で出力し、全体も中央揃えとする。これで左右対称の綺麗な三角形の形に全体が出力される。ここで、\small2.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}