Hacer un enrejado con números en los vértices.

Hacer un enrejado con números en los vértices.

Cualquiera que esté familiarizado con el problema de contar caminos hacia arriba o hacia la derecha en un rectángulo desde la esquina inferior izquierda hasta la esquina superior derecha sabe que una forma de hacerlo es hacerlo mediante recursividad. Quiero visualizar esto y por lo tanto necesito hacer una red que tenga números en los vértices. En la siguiente matriz, los números están dentro de los cuadrados, pero los quiero en los vértices o, mejor aún, que tengan un espacio en la intersección de cuatro líneas y el número podría estar en ese espacio.

$\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}$

Algo como esto: ingrese la descripción de la imagen aquí

Nota importante: la imagen se editó después de que la imagen haya respondido la pregunta con la respuesta correcta.

Respuesta1

Aquí hay una manera de hacer esto:

ingrese la descripción de la imagen aquí

Código:

\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}

Si desea suprimir las líneas exteriores, debe indicar la última fila con una llamada a \ThisIsLastRow. La detección de la primera columna se maneja utilizando el Ftipo de columna.

ingrese la descripción de la imagen aquí

Otras mejoras

  • Como estoy usando a \makebox[2.0em][c]{#1}para colocar el texto y mantenerlo centrado, la última columna que solo tiene caracteres de un solo ancho se ve incorrecta. Una forma de solucionarlo sería definir dos tipos de columnas: una para dos dígitos y otra para un solo dígito. Alternativamente, se podrían dibujar líneas a través del texto y luego superponer el texto del nodo sobre él, lo que luego eliminará las líneas alrededor de los números.

Código:

\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}

Respuesta2

Dado el resultado que deseas, creo que usaríamatrix of nodes

captura de pantalla

código completo

% 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}

Siguiendo los comentarios, si no desea las piezas exteriores, puede utilizar el siguiente código ligeramente modificado.

captura de pantalla

% 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}

información relacionada