행렬에 주석을 달고 음영 처리하는 방법

행렬에 주석을 달고 음영 처리하는 방법

동적 프로그래밍 행렬을 그리려고 합니다. 지금까지 내 시도는 다음과 같습니다

\documentclass[]{article}
\begin{document}
\begin{tabular}{c||c|ccccc|cccccccccc}
    &&1&1&1&1&1&0&0&0&0&0&0&0&0&0&0\\\hline\hline
    &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15\\\hline
    0&1&1&2&3&4&5&5&6&7&8&9&10&11&12&13&14\\
    0&2&2&2&3&4&5&5&5&6&7&8&9&10&11&12&13\\
    0&3&3&3&3&4&5&5&5&5&6&7&8&9&10&11&12\\\hline
    1&4&3&3&3&3&4&5&6&6&6&7&8&9&10&11&12\\
    1&5&4&3&3&3&3&4&5&6&7&7&8&9&10&11&12\\
    1&6&5&4&3&3&3&4&5&6&7&8&8&9&10&11&12\\
    1&7&6&5&4&3&3&4&5&6&7&8&9&9&10&11&12\\
    1&8&7&6&5&4&3&4&5&6&7&8&9&10&10&11&12\\\hline
    0&9&8&7&6&5&4&3&4&5&6&7&8&9&10&10&11\\
    0&10&9&8&7&6&5&4&3&4&5&6&7&8&9&10&10\\
    0&11&10&9&8&7&6&5&4&3&4&5&6&7&8&9&10\\
    0&12&11&10&9&8&7&6&5&4&3&4&5&6&7&8&9\\
\end{tabular}
\end{document}

이제 두 가지를 추가하고 싶습니다.

  • 숫자 사이의 화살표는 왼쪽 상단에서 오른쪽 하단까지 최단 경로를 표시합니다.
  • 일부 블록을 빨간색으로 음영 처리하고 싶습니다(기호가 다른 블록).

나는 tikz(다른 테이블을 사용하여)에서 이 작업을 시도했지만 잘 진행되지 않았습니다.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{pdflscape}
\begin{document}
    \tikzset{ 
        table/.style={
            matrix of nodes,
            row sep=-\pgflinewidth,
            column sep=-\pgflinewidth,
            nodes={rectangle,text width=1.5em,align=center},
            text depth=0.3125ex,
            text height=0.625ex,
            nodes in empty cells
        },
        row 1/.style={nodes={fill=green!10,text depth=0.4ex,text height=2ex}},
        row 6/.style={nodes={text depth=0.4ex,text height=2ex}},
        column 1/.style={nodes={fill=green!10}},
    }
    \begin{landscape}
        \begin{tikzpicture}
        %\begin{tabular}{c||c|cccccccccc|cccccc|ccccccccc}
        \matrix (mat) [table]{
            &&0&0&0&0&0&0&0&0&0&0&1&1&1&1&1&1&0&0&0&0&0&0&0&0&0\\
            &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25\\
            1&1&|[fill=red!20]|1&|[fill=red!20]|2&|[fill=red!20]|3&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&11&12&13&14&15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21&|[fill=red!20]|22&|[fill=red!20]|23&|[fill=red!20]|24\\
            1&2&|[fill=red!20]|2&|[fill=red!20]|2&|[fill=red!20]|3&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&10&11&12&13&14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21&|[fill=red!20]|22&|[fill=red!20]|23\\
            1&3&|[fill=red!20]|3&|[fill=red!20]|3&|[fill=red!20]|3&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&10&10&11&12&13&|[fill=red!20]|14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21&|[fill=red!20]|22\\
            1&4&|[fill=red!20]|4&|[fill=red!20]|4&|[fill=red!20]|4&|[fill=red!20]|4&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&10&10&10&10&11&12&|[fill=red!20]|13&|[fill=red!20]|14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18&|[fill=red!20]|19&|[fill=red!20]|20&|[fill=red!20]|21\\
            0&5&4&4&4&4&4&5&6&7&8&9&|[fill=red!20]|10&|[fill=red!20]|11&|[fill=red!20]|11&|[fill=red!20]|11&|[fill=red!20]|11&|[fill=red!20]|12&12&13&14&15&16&17&18&19&20\\
            0&6&5&4&4&4&4&4&5&6&7&8&|[fill=red!20]|9&|[fill=red!20]|10&|[fill=red!20]|11&|[fill=red!20]|12&|[fill=red!20]|12&|[fill=red!20]|12&12&12&13&14&15&16&17&18&19\\
            0&7&6&5&4&4&4&4&4&5&6&7&|[fill=red!20]|8&|[fill=red!20]|9&|[fill=red!20]|10&|[fill=red!20]|11&|[fill=red!20]|12&|[fill=red!20]|13&12&12&12&13&14&15&16&17&18\\
            1&8&|[fill=red!20]|7&|[fill=red!20]|6&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|5&|[fill=red!20]|6&|[fill=red!20]|7&7&8&9&10&11&12&|[fill=red!20]|13&|[fill=red!20]|13&|[fill=red!20]|13&|[fill=red!20]|13&|[fill=red!20]|14&|[fill=red!20]|15&|[fill=red!20]|16&|[fill=red!20]|17&|[fill=red!20]|18\\
            %\end{tabular}
        };
        \foreach \x in {2,6,9}
        {
            \draw 
            ([xshift=-.125\pgflinewidth,yshift=3]mat-\x-1.south west) --   
            ([xshift=-.125\pgflinewidth,yshift=3]mat-\x-27.south east);
        }
    \begin{scope}[shorten >=7pt,shorten <= 7pt]
    \draw[->]  (mat-2-2.center) -- (mat-2-3.center);
    \draw[->]  (mat-2-3.center) -- (mat-2-4.center);
    \draw[->]  (mat-2-4.center) -- (mat-3-5.center);
    \draw[->]  (mat-3-5.center) -- (mat-4-6.center);
    \draw[->]  (mat-4-6.center) -- (mat-5-7.center);
    \draw[->]  (mat-5-7.center) -- (mat-6-8.center);
    \draw[->]  (mat-6-8.center) -- (mat-7-9.center);
    \draw[->]  (mat-7-9.center) -- (mat-8-10.center);
    \draw[->]  (mat-8-10.center) -- (mat-9-11.center);
    \draw[->]  (mat-9-11.center) -- (mat-10-12.center);

    \end{scope}

        \end{tikzpicture}
    \end{landscape}
\end{document}

여기에는 몇 가지 문제가 있습니다.

  • 행렬의 두 선 사이에 이상한 공간이 있습니다.
  • 음영이 이동되어 블록을 제대로 채우지 못합니다.
  • 화살표가 모두 제대로 정렬되지 않은 것 같습니다.
  • LaTeX 소스는 매우 장황합니다.

도움을 주시면 감사하겠습니다.

답변1

수정 사항은 다음과 같습니다.

  • 풀이row 6스타일
  • 채우기와 셀 내용 사이의 이동을 피하기 위해 제거 text depth하고 text height설정1.1ex
  • 각 셀을 채우는 대신 매트릭스 위에 20% 불투명도 직사각형으로 영역을 음영 처리합니다.

    \documentclass{standalone}
    \usepackage{tikz}
    \usetikzlibrary{matrix}
    \begin{document}
    \tikzset{ 
        table/.style={
            matrix of nodes,
            row sep=-\pgflinewidth,
            column sep=-\pgflinewidth,
            nodes={rectangle,text width=1.5em,align=center},
            text height=1.1ex,
            nodes in empty cells,
        },
        row 1/.style={nodes={fill=green!10}},
        column 1/.style={nodes={fill=green!10}}
    }
    
    \begin{tikzpicture}
            \matrix (mat) [table]{
            &&0&0&0&0&0&0&0&0&0&0&1&1&1&1&1&1&0&0&0&0&0&0&0&0&0\\
            &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25\\
            1&1&1&2&3&4&5&6&7&8&9&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24\\
            1&2&2&2&3&4&5&6&7&8&9&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23\\
            1&3&3&3&3&4&5&6&7&8&9&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22\\
            1&4&4&4&4&4&5&6&7&8&9&10&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21\\
            0&5&4&4&4&4&4&5&6&7&8&9&10&11&11&11&11&12&12&13&14&15&16&17&18&19&20\\
            0&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&12&12&12&12&13&14&15&16&17&18&19\\
            0&7&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&13&12&12&12&13&14&15&16&17&18\\
            1&8&7&6&5&5&5&5&5&5&6&7&7&8&9&10&11&12&13&13&13&13&14&15&16&17&18\\
        };
        \fill[red,opacity=0.2] (mat-3-3.north west) rectangle (mat-6-12.south east);
        \fill[red,opacity=0.2] (mat-7-13.north west) rectangle (mat-9-18.south east);
        \fill[red,opacity=0.2] (mat-3-19.north west) rectangle (mat-6-27.south east);
        \fill[red,opacity=0.2] (mat-10-3.north west) rectangle (mat-10-12.south east);
        \fill[red,opacity=0.2] (mat-10-19.north west) rectangle (mat-10-27.south east);
        \foreach \x in {2,6,9}
        {
            \draw 
            ([xshift=-.125\pgflinewidth]mat-\x-1.south west) --   
            ([xshift=-.125\pgflinewidth]mat-\x-27.south east);
        }
    \begin{scope}[shorten >=7pt,shorten <= 7pt]
    \draw[->]  (mat-2-2.center) -- (mat-2-3.center);
    \draw[->]  (mat-2-3.center) -- (mat-2-4.center);
    \draw[->]  (mat-2-4.center) -- (mat-3-5.center);
    \draw[->]  (mat-3-5.center) -- (mat-4-6.center);
    \draw[->]  (mat-4-6.center) -- (mat-5-7.center);
    \draw[->]  (mat-5-7.center) -- (mat-6-8.center);
    \draw[->]  (mat-6-8.center) -- (mat-7-9.center);
    \draw[->]  (mat-7-9.center) -- (mat-8-10.center);
    \draw[->]  (mat-8-10.center) -- (mat-9-11.center);
    \draw[->]  (mat-9-11.center) -- (mat-10-12.center);
    
    \end{scope}
    
        \end{tikzpicture}
    \end{document}
    

여기에 이미지 설명을 입력하세요

편집하다

위의 20% 불투명 직사각형을 채워 행렬의 블록을 색칠하는 것은 나를 만족시키지 못한 솔루션이었습니다. 셀에 스타일을 블록 할당하고 싶었지만 tikz에는 이에 대한 옵션이 없습니다. 답변을 바탕으로 작업한 후이 질문, 나는 그것을 수행했습니다. filinred옵션은 2개의 루프( 로 정의됨)를 통해 셀 블록의 스타일을 정의한 /.list다음 블록 목록은 형식(위, 왼쪽에서 아래, 오른쪽)으로 행렬의 시작 부분에 정의됩니다.

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
    \tikzset{ 
        table/.style={
            matrix of nodes,
            row sep=-\pgflinewidth,
            column sep=-\pgflinewidth,
            nodes={rectangle,text width=1.5em,align=center},
            text height=1.1ex,
            nodes in empty cells,
        },
        row 1/.style={nodes={fill=green!10}},
        column 1/.style={nodes={fill=green!10}},
        fillinred/.style args = {(#1,#2 to #3,#4)}{
            blockrows/.style={
                block/.style={
                    row ##1 column ####1/.style={nodes={fill=red!20}}
                },
                block/.list={#2,...,#4}
            },
            blockrows/.list={#1,...,#3}
        } 
    }

        \begin{tikzpicture}
            \matrix (mat) [table,fillinred/.list={(3,3 to 6,12),(10,3 to 10,12),(7,13 to 9,18),(3,19 to 6,27),(10,19 to 10,27)}]{
            &&0&0&0&0&0&0&0&0&0&0&1&1&1&1&1&1&0&0&0&0&0&0&0&0&0\\
            &0&1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25\\
            1&1&1&2&3&4&5&6&7&8&9&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24\\
            1&2&2&2&3&4&5&6&7&8&9&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22&23\\
            1&3&3&3&3&4&5&6&7&8&9&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21&22\\
            1&4&4&4&4&4&5&6&7&8&9&10&10&10&10&10&11&12&13&14&15&16&17&18&19&20&21\\
            0&5&4&4&4&4&4&5&6&7&8&9&10&11&11&11&11&12&12&13&14&15&16&17&18&19&20\\
            0&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&12&12&12&12&13&14&15&16&17&18&19\\
            0&7&6&5&4&4&4&4&4&5&6&7&8&9&10&11&12&13&12&12&12&13&14&15&16&17&18\\
            1&8&7&6&5&5&5&5&5&5&6&7&7&8&9&10&11&12&13&13&13&13&14&15&16&17&18\\
        };
        \foreach \x in {2,6,9}
        {
            \draw 
            ([xshift=-.125\pgflinewidth]mat-\x-1.south west) --   
            ([xshift=-.125\pgflinewidth]mat-\x-27.south east);
        }
        \begin{scope}[shorten >=7pt,shorten <= 7pt]
            \draw[->]  (mat-2-2.center) -- (mat-2-3.center);
            \draw[->]  (mat-2-3.center) -- (mat-2-4.center);
            \draw[->]  (mat-2-4.center) -- (mat-3-5.center);
            \draw[->]  (mat-3-5.center) -- (mat-4-6.center);
            \draw[->]  (mat-4-6.center) -- (mat-5-7.center);
            \draw[->]  (mat-5-7.center) -- (mat-6-8.center);
            \draw[->]  (mat-6-8.center) -- (mat-7-9.center);
            \draw[->]  (mat-7-9.center) -- (mat-8-10.center);
            \draw[->]  (mat-8-10.center) -- (mat-9-11.center);
            \draw[->]  (mat-9-11.center) -- (mat-10-12.center);
        \end{scope}

    \end{tikzpicture}
\end{document}

관련 정보