Matriz de nodos: ajustando las líneas

Matriz de nodos: ajustando las líneas

Después de leer algunos ejemplos de matrices de nodos, escribí este MWE:

\documentclass{article}

\usepackage{tikz}\usetikzlibrary{matrix}
\usepackage{booktabs} 

\begin{document}

See the Table \ref{fig:cen2}.

\begin{table}[htb!]
    \caption{My very very very very very long useless caption}
    \label{fig:cen2}
    \begin{tikzpicture}
        \matrix (m) [matrix of nodes,
        nodes in empty cells,
        toprule/.style={%
            execute at end cell={%
                \draw [line cap=rect,#1] (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.north west) -- (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.north east);%
            }
        },
    bottomrule/.style={%
        execute at end cell={%
            \draw [line cap=rect,#1] (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south west) -- (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east);%
            }
        },
    midrule/.style={%
        execute at end cell={%
            \draw  (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east)--(\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east);%
            }

        },
%
        anchor=base,
        row sep    = -\pgflinewidth,
        column sep = -\pgflinewidth,
%
        row 1/.style={nodes={font=\bfseries, align = center}, anchor = south},%toprule = thick
        row 2/.style={anchor = south},
        row 3/.style={anchor = south},
        row 4/.style={anchor = south},
        row 5/.style={anchor = south},
%       
        column 1/.style={nodes={ text width=2.5cm,align=left, font = \small}},
        column 2/.style={nodes={ text width=4.0cm,align=left, font = \small}},
        column 3/.style={nodes={ text width=4.0cm,align=left, font = \small}},
        column 4/.style={nodes={ text width=4.0cm,align=left, font = \small}}%rectangle,draw,
        ] at (0,0)
%
        {%
            Variables & Hypothesis 1 & Hypothesis 2 & Hypothesis 3 \\
            Territorial unit &
            Final destination for receiving waste generated in the municipality &
            Final destination for receiving waste generated in the municipality &
            Final destination to receive the waste generated in the municipality \\
            Index of coverage &
            Maintenance of the urban coverage index, with focus on short term &
            Maintenance of the urban coverage index, focusing on medium term &
            Maintenance of the urban coverage index, with a long-term focus \\
            Garbage Collection with Recovery of Recyclable garbage &
            Increase in the Recovery of Recyclable garbage index in the short term &
            Moderate increase in the recovery of recyclable garbage index with focus on medium term &
            Expectation of implementation of long-term selective collection \\
            Composting of organic waste &
            Adhesion and massive investment in compost disposal final solid organic waste &
            Adhesion and moderate investment in composting final disposal of organic solid waste &
            Investment in composting organic long-term solid waste \\
        };

        \draw [-, very thick] (m-1-1.north west) -- (m-1-4.north east);%linha 1
        \draw [-, thick]      (m-1-4.south east) -- (m-1-1.south west);%linha 2
        \draw [-, thin]       (m-2-1.south west) -- (m-2-4.south east);%linha 3
        \draw [-, thin]       (m-3-1.south west) -- (m-3-4.south east);%linha 4
        \draw [-, thin]       (m-4-1.south west) -- (m-4-4.south east);%linha 5
        \draw [-, thick]      (m-5-1.south west) -- (m-5-4.south east);%linha 6
%       
        \draw[->, color = green,  ultra thick, dashed] (m-2-2.mid) -- ([yshift = -5mm]m-5-2.south);
        \draw[->, color = orange, ultra thick, dashed] (m-2-3.mid) -- ([yshift = -5mm]m-5-3.south);
        \draw[->, color = red,    ultra thick, dashed] (m-2-4.mid) -- ([yshift = -5mm]m-5-4.south);
%       
        \node [below, yshift = -5mm] at (m-5-2.south) {\textcolor{green} {\bfseries Scenario 1}};
        \node [below, yshift = -5mm] at (m-5-3.south) {\textcolor{orange}{\bfseries Scenario 2}};
        \node [below, yshift = -5mm] at (m-5-4.south) {\textcolor{red}   {\bfseries Scenario 3}};
    \end{tikzpicture}
\end{table}

\end{document}

Pero la matriz tiene líneas torcidas. ¿Cómo ajustar las líneas en horizontal?

Matriz con líneas torcidas

Respuesta1

Pondría la mesa de otra manera...

  • tabularxutilizar el entorno de tabla estándar
  • para líneas discontinuas verticales utilice tikzmarkla biblioteca
  • alinear el contenido de las celdas en la parte superior
  • use raged2eel paquete para alinear mejor el texto en las celdas
  • uso booktabspara reglas horizontales, de las cuales usaría solo tres
  • utilizar makecellpara encabezados de columna y "etiquetas" en la parte inferior de la tabla

considerando lo anterior, el código de la tabla se vuelve mucho más corto, simple y claro (en mi opinión). Por supuesto, para obtener la tabla final es necesario compilar el código al menos dos veces.

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{geometry}

\usepackage{tikz}
\usetikzlibrary{arrows.meta, calc, tikzmark}
\usepackage{booktabs, makecell, tabularx}
\renewcommand\theadfont{\normalsize\bfseries}
\renewcommand\theadgape{}
\usepackage{ragged2e}
\usepackage[labelfont=bf,
            skip=1ex]{caption}

\begin{document}

See the Table \ref{fig:cen2}.
    \begin{table}[htb!]
\caption{My very very very very very long useless caption}
    \label{fig:cen2}
\small
\begin{tabularx}{\linewidth}{>{\RaggedRight}p{25mm} *{3}{>{\RaggedRight}X}}
        \toprule
    \thead{Variables}   &
    \tikzmark{As}\thead{Hypothesis 1}\tikzmark{Ae}  &
    \tikzmark{Bs}\thead{Hypothesis 2}\tikzmark{Be}  &
    \tikzmark{Cs}\thead{Hypothesis 3}\tikzmark{Ce}                      \\
        \midrule
    Territorial unit &
    Final destination for receiving waste generated in the municipality &
    Final destination for receiving waste generated in the municipality &
    Final destination to receive the waste generated in the municipality \\
        \addlinespace
    Index of coverage &
    Maintenance of the urban coverage index, with focus on short term &
    Maintenance of the urban coverage index, focusing on medium term &
    Maintenance of the urban coverage index, with a long-term focus \\
        \addlinespace
    Garbage Collection with Recovery of Recyclable garbage &
    Increase in the Recovery of Recyclable garbage index in the short term &
    Moderate increase in the recovery of recyclable garbage index with focus on medium term &
    Expectation of implementation of long-term selective collection \\
        \addlinespace
    Composting of organic waste &
    Adhesion and massive investment in compost disposal final solid organic waste &
    Adhesion and moderate investment in composting final disposal of organic solid waste &
    Investment in composting organic long-term solid waste \\
        \midrule[\heavyrulewidth]
        \addlinespace
        &
    \tikzmark{AAs}\thead{\textcolor{green}{Scenario 1}}\tikzmark{AAe} &
    \tikzmark{BBs}\thead{\textcolor{orange}{Scenario 2}}\tikzmark{BBe}&
    \tikzmark{CCs}\thead{\textcolor{red}{Scenario 3}}\tikzmark{CCe}
    \end{tabularx}
\begin{tikzpicture}[overlay, remember picture,
line/.style = {draw=#1, line width=1mm, densely dashed, -Straight Barb,
               semitransparent, shorten <=5mm, shorten >=3mm}
                    ]
\draw[line=green]   ($(pic cs:As)!0.5!(pic cs:Ae)$) -- ($(pic cs:AAs)!0.5!(pic cs:AAe)$);
\draw[line=orange]  ($(pic cs:Bs)!0.5!(pic cs:Be)$) -- ($(pic cs:BBs)!0.5!(pic cs:BBe)$);
\draw[line=red]     ($(pic cs:Cs)!0.5!(pic cs:Ce)$) -- ($(pic cs:CCs)!0.5!(pic cs:CCe)$);
\end{tikzpicture}
    \end{table}
\end{document}

Respuesta2

Puedes solucionarlo agregando \strut.

\documentclass{article}

\usepackage{tikz}\usetikzlibrary{matrix}
\usepackage{booktabs} 

\begin{document}

See the Table \ref{fig:cen2}.

\begin{table}[htb!]
    \caption{My very very very very very long useless caption}
    \label{fig:cen2}
    \begin{tikzpicture}
        \matrix (m) [matrix of nodes,
        nodes in empty cells,
        toprule/.style={%
            execute at end cell={%
                \draw [line cap=rect,#1] (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.north west) -- (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.north east);%
            }
        },
    bottomrule/.style={%
        execute at end cell={%
            \draw [line cap=rect,#1] (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south west) -- (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east);%
            }
        },
    midrule/.style={%
        execute at end cell={%
            \draw  (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east)--(\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east);%
            }

        },
%
        baseline=base,
        row sep    = -\pgflinewidth,
        column sep = -\pgflinewidth,
%
        row 1/.style={nodes={font=\bfseries\strut, align = center}, anchor = south},%toprule = thick
        row 2/.style={anchor = south},
        row 3/.style={anchor = south},
        row 4/.style={anchor = south},
        row 5/.style={anchor = south},
%       
        column 1/.style={nodes={text width=2.5cm,align=left, font = \small\strut}},
        column 2/.style={nodes={text width=4.0cm,align=left, font = \small\strut}},
        column 3/.style={nodes={text width=4.0cm,align=left, font = \small\strut}},
        column 4/.style={nodes={text width=4.0cm,align=left, font = \small\strut}}%rectangle,draw,
        ] at (0,0)
%
        {%
            Variables & Hypothesis 1 & Hypothesis 2 &
            Hypothesis 3 \\
            Territorial unit &
            Final destination for receiving waste generated in the municipality &
            Final destination for receiving waste generated in the municipality &
            Final destination to receive the waste generated in the municipality \\
            Index of coverage &
            Maintenance of the urban coverage index, with focus on short term &
            Maintenance of the urban coverage index, focusing on medium term &
            Maintenance of the urban coverage index, with a long-term focus \\
            Garbage Collection with Recovery of Recyclable garbage &
            Increase in the Recovery of Recyclable garbage index in the short term &
            Moderate increase in the recovery of recyclable garbage index with focus on medium term &
            Expectation of implementation of long-term selective collection \\
            Composting of organic waste &
            Adhesion and massive investment in compost disposal final solid organic waste &
            Adhesion and moderate investment in composting final disposal of organic solid waste &
            Investment in composting organic long-term solid waste \\
        };

        \draw [-, very thick] (m-1-1.north west) -- (m-1-4.north east);%linha 1
        \draw [-, thick]      (m-1-4.south east) -- (m-1-1.south west);%linha 2
        \draw [-, thin]       (m-2-1.south west) -- (m-2-4.south east);%linha 3
        \draw [-, thin]       (m-3-1.south west) -- (m-3-4.south east);%linha 4
        \draw [-, thin]       (m-4-1.south west) -- (m-4-4.south east);%linha 5
        \draw [-, thick]      (m-5-1.south west) -- (m-5-4.south east);%linha 6
%       
        \draw[->, color = green,  ultra thick, dashed] (m-2-2.mid) -- ([yshift = -5mm]m-5-2.south);
        \draw[->, color = orange, ultra thick, dashed] (m-2-3.mid) -- ([yshift = -5mm]m-5-3.south);
        \draw[->, color = red,    ultra thick, dashed] (m-2-4.mid) -- ([yshift = -5mm]m-5-4.south);
%       
        \node [below, yshift = -5mm] at (m-5-2.south) {\textcolor{green} {\bfseries Scenario 1}};
        \node [below, yshift = -5mm] at (m-5-3.south) {\textcolor{orange}{\bfseries Scenario 2}};
        \node [below, yshift = -5mm] at (m-5-4.south) {\textcolor{red}   {\bfseries Scenario 3}};
    \end{tikzpicture}
\end{table}

\end{document}

\begin{table}[htb!]
    \caption{My very very very very very long useless caption}
    \label{fig:cen2}
    \begin{tikzpicture}
        \matrix (m) [matrix of nodes,
        nodes in empty cells,
        toprule/.style={%
            execute at end cell={%
                \draw [line cap=rect,#1] (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.north west) -- (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.north east);%
            }
        },
    bottomrule/.style={%
        execute at end cell={%
            \draw [line cap=rect,#1] (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south west) -- (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east);%
            }
        },
    midrule/.style={%
        execute at end cell={%
            \draw  (\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east)--(\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn.south east);%
            }

        },
%
        baseline=base,
        row sep    = -\pgflinewidth,
        column sep = -\pgflinewidth,
%
        row 1/.style={nodes={font=\bfseries\strut, align = center}, anchor = south},%toprule = thick
        row 2/.style={anchor = south},
        row 3/.style={anchor = south},
        row 4/.style={anchor = south},
        row 5/.style={anchor = south},
%       
        column 1/.style={nodes={ text width=2.5cm,align=left, font = \small\strut}},
        column 2/.style={nodes={ text width=4.0cm,align=left, font = \small\strut}},
        column 3/.style={nodes={ text width=4.0cm,align=left, font = \small\strut}},
        column 4/.style={nodes={ text width=4.0cm,align=left, font = \small\strut}}%rectangle,draw,
        ] at (0,0)
%
        {%
            Variables & Hypothesis 1 & Hypothesis 2 &
            Hypothesis 3 \\
            Territorial unit &
            Final destination for receiving waste generated in the municipality &
            Final destination for receiving waste generated in the municipality &
            Final destination to receive the waste generated in the municipality \\
            Index of coverage &
            Maintenance of the urban coverage index, with focus on short term &
            Maintenance of the urban coverage index, focusing on medium term &
            Maintenance of the urban coverage index, with a long-term focus \\
            Garbage Collection with Recovery of Recyclable garbage &
            Increase in the Recovery of Recyclable garbage index in the short term &
            Moderate increase in the recovery of recyclable garbage index with focus on medium term &
            Expectation of implementation of long-term selective collection \\
            Composting of organic waste &
            Adhesion and massive investment in compost disposal final solid organic waste &
            Adhesion and moderate investment in composting final disposal of organic solid waste &
            Investment in composting organic long-term solid waste \\
        };

        \draw [-, very thick] (m-1-1.north west) -- (m-1-4.north east);%linha 1
        \draw [-, thick]      (m-1-4.south east) -- (m-1-1.south west);%linha 2
        \draw [-, thin]       (m-2-1.south west) -- (m-2-4.south east);%linha 3
        \draw [-, thin]       (m-3-1.south west) -- (m-3-4.south east);%linha 4
        \draw [-, thin]       (m-4-1.south west) -- (m-4-4.south east);%linha 5
        \draw [-, thick]      (m-5-1.south west) -- (m-5-4.south east);%linha 6
%       
        \draw[->, color = green,  ultra thick, dashed] (m-2-2.mid) -- ([yshift = -5mm]m-5-2.south);
        \draw[->, color = orange, ultra thick, dashed] (m-2-3.mid) -- ([yshift = -5mm]m-5-3.south);
        \draw[->, color = red,    ultra thick, dashed] (m-2-4.mid) -- ([yshift = -5mm]m-5-4.south);
%       
        \node [below, yshift = -5mm] at (m-5-2.south) {\textcolor{green} {\bfseries Scenario 1}};
        \node [below, yshift = -5mm] at (m-5-3.south) {\textcolor{orange}{\bfseries Scenario 2}};
        \node [below, yshift = -5mm] at (m-5-4.south) {\textcolor{red}   {\bfseries Scenario 3}};
    \end{tikzpicture}
\end{table}

\end{document}

ingrese la descripción de la imagen aquí

Pero debo admitir que también estoy perdido (como hibernar a Zarko ;-) porque superpones directivas por columnas y por filas. Antes de arreglar las celdas inferiores, necesitaría saber a qué alineación apuntas hacia arriba.

Respuesta3

Iba a sugerir el matrixcellspaquete, pero luego, al buscar en este sitio la pregunta original que generó ese paquete, descubrí que alguien había solucionado algunos de los problemas con ese paquete, por lo que recomiendo usar el paquete.matrix.skeletonpaquete (deProblema de Matrixcells solo con el eje y) en cambio.

Eliminé un poco de código no utilizado.

\documentclass{article}
%\url{https://tex.stackexchange.com/q/415345/86}

\usepackage{tikz}\usetikzlibrary{matrix}
\usepackage{booktabs}
\usetikzlibrary{matrix.skeleton}

\begin{document}

See the Table \ref{fig:cen2}.

\begin{table}[htb!]
    \caption{My very very very very very long useless caption}
    \label{fig:cen2}
    \begin{tikzpicture}
\matrix (m) [matrix of nodes,
  nodes in empty cells,
  label skeleton,
%
        anchor=base,
        row sep    = -\pgflinewidth,
        column sep = -\pgflinewidth,
%
        row 1/.style={nodes={font=\bfseries, align = center}, anchor = south},%toprule = thick
        row 2/.style={anchor = south},
        row 3/.style={anchor = south},
        row 4/.style={anchor = south},
        row 5/.style={anchor = south},
%       
        column 1/.style={nodes={ text width=2.5cm,align=left, font = \small}},
        column 2/.style={nodes={ text width=4.0cm,align=left, font = \small}},
        column 3/.style={nodes={ text width=4.0cm,align=left, font = \small}},
        column 4/.style={nodes={ text width=4.0cm,align=left, font = \small}}%rectangle,draw,
        ] at (0,0)
%
        {%
            Variables & Hypothesis 1 & Hypothesis 2 & Hypothesis 3 \\
            Territorial unit &
            Final destination for receiving waste generated in the municipality &
            Final destination for receiving waste generated in the municipality &
            Final destination to receive the waste generated in the municipality \\
            Index of coverage &
            Maintenance of the urban coverage index, with focus on short term &
            Maintenance of the urban coverage index, focusing on medium term &
            Maintenance of the urban coverage index, with a long-term focus \\
            Garbage Collection with Recovery of Recyclable garbage &
            Increase in the Recovery of Recyclable garbage index in the short term &
            Moderate increase in the recovery of recyclable garbage index with focus on medium term &
            Expectation of implementation of long-term selective collection \\
            Composting of organic waste &
            Adhesion and massive investment in compost disposal final solid organic waste &
            Adhesion and moderate investment in composting final disposal of organic solid waste &
            Investment in composting organic long-term solid waste \\
        };

        \draw [-, very thick] (m-row-1.north west) -- (m-row-1.north east);%linha 1
        \draw [-, thick]      (m-row-2.north west) -- (m-row-2.north east);%linha 2
        \draw [-, thin]       (m-row-3.north west) -- (m-row-3.north east);%linha 3
        \draw [-, thin]       (m-row-4.north west) -- (m-row-4.north east);%linha 4
        \draw [-, thin]       (m-row-5.north west) -- (m-row-5.north east);%linha 5
        \draw [-, thick]      (m-row-5.south west) -- (m-row-5.south east);%linha 6
%       
        \draw[->, color = green,  ultra thick, dashed] (m-2-2.mid) -- ([yshift = -5mm]m-5-2.south);
        \draw[->, color = orange, ultra thick, dashed] (m-2-3.mid) -- ([yshift = -5mm]m-5-3.south);
        \draw[->, color = red,    ultra thick, dashed] (m-2-4.mid) -- ([yshift = -5mm]m-5-4.south);
%       
        \node [below, yshift = -5mm] at (m-5-2.south) {\textcolor{green} {\bfseries Scenario 1}};
        \node [below, yshift = -5mm] at (m-5-3.south) {\textcolor{orange}{\bfseries Scenario 2}};
        \node [below, yshift = -5mm] at (m-5-4.south) {\textcolor{red}   {\bfseries Scenario 3}};
    \end{tikzpicture}
\end{table}

\end{document}

Líneas rectas en una matriz.

información relacionada