頂点に数字をつけた格子を作る

頂点に数字をつけた格子を作る

左下隅から右上隅までの長方形内の上/右方向のパスを数える問題に詳しい人なら、これを行う方法の 1 つが再帰によるものであることをご存じでしょう。私はこれを視覚化したいので、頂点に数字がある格子を作成する必要があります。次の行列では、数字は四角形の中にありますが、頂点に置きたいのですが、4 本の線の交差部分に隙間があるとさらに良いでしょう。その隙間に数字を置くこともできます。

$\begin{array}{*{20}{c}}
\hline
  | & 1&| & 1&| & 1&| & 1&| & 1&| & 1&| & 1| &  \\ 
\hline
  | & 7&| & 6&| & 5&| & 4&| & 3&| & 2&| & 1| &  \\ 
\hline
  | & {28}&| & {21}&| & {15}&| & {10}&| & 6&| & 3&| & 1| &  \\ 
\hline
  | & {84}&| & {56}&| & {35}&| & {20}&| & {10}&| & 4&| & 1| & \\ 
\hline
\end{array}$

このようなもの: ここに画像の説明を入力してください

重要な注意: 質問に正解の画像で回答した後、画像は編集されています。

答え1

これを行う方法は次のとおりです。

ここに画像の説明を入力してください

コード:

\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\usepackage{collcell}

\newcommand{\MakeBox}[1]{\makebox[2.0em][c]{#1}}%
\newcommand*{\MyBox}[1]{%
    \phantom{\MakeBox{#1}}%
    \IfStrEq{#1}{}{}{%
        \begin{tikzpicture}[overlay, draw=red, line width=1.0pt, text=blue]
            \node [draw=none, inner sep=2pt] (Node) {\MakeBox{#1}};
            \draw (Node.north) -- ([yshift=2.0ex]Node.north);
            \draw (Node.south) -- ([yshift=-2.0ex]Node.south);
            \draw (Node.west) -- ([xshift=-1.0em]Node.west);
            \draw (Node.east) -- ([xshift=1.0em]Node.east);
        \end{tikzpicture}%
    }%
}

\newcolumntype{C}{>{\collectcell\MyBox}c<{\endcollectcell}}

\begin{document}
$\begin{array}{*{20}{C}}
   & 1 &  1 &  1 &  1 &  1 &  1 &  1 &  \\[2.0ex]
   & 7 &  6 &  5 &  4 &  3 &  2 &  1 &  \\[2.0ex] 
   & 28 &  21 &  15 &  10 &  6 &  3 &  1 &  \\[2.0ex] 
   & 84 &  56 &  35 &  20 &  10 &  4 &  1 & \\ [2.0ex]
\end{array}$
\end{document}

外側の線を非表示にしたい場合は、 を呼び出して最後の行を指定する必要があります\ThisIsLastRow。最初の列の検出は、F列タイプを使用して処理されます。

ここに画像の説明を入力してください

さらなる機能強化

  • テキストを中央に配置するためにを使用しているため\makebox[2.0em][c]{#1}、1 幅の文字のみを含む最後の列は見栄えが悪くなります。これを修正する方法の 1 つは、2 つの列タイプを定義することです。1 つは 2 桁用、もう 1 つは 1 桁用です。または、テキストに線を引いてから、その上にノード テキストを重ねると、数字の周りの線が削除されます。

コード:

\documentclass{article}
\usepackage{xstring}
\usepackage{etoolbox}
\usepackage{tikz}
\usepackage{collcell}

\newtoggle{IsFirstColumn}\togglefalse{IsFirstColumn}%%
\newtoggle{IsLastRow}\togglefalse{IsLastRow}%
\newcommand{\ThisIsLastRow}{\global\toggletrue{IsLastRow}}%

\newcommand{\MakeBox}[1]{\makebox[2.0em][c]{#1}}%
\newcommand*{\MyBox}[1]{%
    \phantom{\MakeBox{#1}}%
    \IfStrEq{#1}{}{}{%
        \begin{tikzpicture}[overlay, draw=red, line width=1.0pt, text=blue]
            \node [draw=none, inner sep=2pt] (Node) {\MakeBox{#1}};
            \iftoggle{IsLastRow}{}{%
                \draw (Node.south) -- ([yshift=-2.0ex]Node.south);
            }%
            \iftoggle{IsFirstColumn}{}{%
                \draw (Node.west) -- ([xshift=-1.0em]Node.west);
            }%
        \end{tikzpicture}%
    }%
}

\newcommand*{\MyBoxFirstColumn}[1]{%
    \global\toggletrue{IsFirstColumn}%
    \MyBox{#1}%
    \global\togglefalse{IsFirstColumn}%
}%

\newcolumntype{C}{>{\collectcell\MyBox}c<{\endcollectcell}}
\newcolumntype{F}{>{\collectcell\MyBoxFirstColumn}c<{\endcollectcell}}

\begin{document}
$\begin{array}{F*{20}{C}}
    1 &   1 &   1 &   1 &   1 &  1 &  1 \\[2.0ex]
    7 &   6 &   5 &   4 &   3 &  2 &  1 \\[2.0ex] 
   28 &  21 &  15 &  10 &   6 &  3 &  1 \\[2.0ex] \ThisIsLastRow
   84 &  56 &  35 &  20 &  10 &  4 &  1 \\
\end{array}$
\end{document}

答え2

あなたが望む出力を考えると、私はmatrix of nodes

スクリーンショット

完全なコード

% arara: pdflatex
% !arara: indent: {overwrite: true}
\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
\begin{tikzpicture}[thick]
    \matrix (mylattice)[
        matrix of nodes,
        row sep=.5cm,
        column sep=.5cm,  
        nodes in empty cells,
        execute at empty cell={\node[draw=none]{\phantom{X}};},
    ]{
        &    &  &  &  &  &  &  &\\ 
        & 1 &  1 &  1 &  1 &  1 &  1 &  1  & \\
        & 7 &  6 &  5 &  4 &  3 &  2 &  1  & \\
        & 28 &  21 &  15 &  10 &  6 &  3 &  1 &  \\
        & 84 &  56 &  35 &  20 &  10 &  4 &  1 & \\ 
        &    &      &    &      &   &     &  & \\ 
    };
    \foreach \i [evaluate=\i as \y using int(\i+1)] in {1,...,5}
    {
        \foreach \j [evaluate=\j as \x using int(\j+1)]in {1,...,8}
        {
            \ifnum\j>1
            \draw[red] (mylattice-\i-\j)--(mylattice-\y-\j);
            \fi
            \ifnum\i>1
            \draw[blue] (mylattice-\i-\j)--(mylattice-\i-\x);
            \fi
        }
    }
\end{tikzpicture}
\end{document}

コメントに従って、外側の部分が不要な場合は、次のわずかに変更されたコードを使用できます。

スクリーンショット

% arara: pdflatex
% !arara: indent: {overwrite: true}
\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
\begin{tikzpicture}[thick]
    \matrix (mylattice)[
        matrix of nodes,
        row sep=.5cm,
        column sep=.5cm,  
        nodes in empty cells,
        execute at empty cell={\node[draw=none]{\phantom{X}};},
    ]{
         1 &  1 &  1 &  1 &  1 &  1 &  1   \\
         7 &  6 &  5 &  4 &  3 &  2 &  1   \\
         28 &  21 &  15 &  10 &  6 &  3 &  1   \\
         84 &  56 &  35 &  20 &  10 &  4 &  1  \\ 
    };
    \foreach \i [evaluate=\i as \y using int(\i+1)] in {1,...,4}
    {
        \foreach \j [evaluate=\j as \x using int(\j+1)]in {1,...,7}
        {
            \ifnum\i<4
            \draw[red] (mylattice-\i-\j)--(mylattice-\y-\j);
            \fi
            \ifnum\j<7
            \draw[blue] (mylattice-\i-\j)--(mylattice-\i-\x);
            \fi
        }
    }
\end{tikzpicture}
\end{document}

関連情報