2015年12月10日木曜日

tikzを使って行列の外に書き込みをする。

次のようなtweetを見つけました。



以前にmultirow.styとbigdelim.styを使って行列の外に書き込みをした次のような図を作ったことがあります。

しかし、最近覚えたtikzのmatrixライブラリを使えば上記のtweetの画像により近いものを再現できそうなので試してみました。tikzの使用は上のtweetの趣旨から外れていると思いますが、結果は次のようになりました。

以下にソースを貼り付けておきます。
\documentclass[a4paper,10pt,dvipdfmx]{jsarticle}

\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{math,matrix,backgrounds}

\begin{document}
 \begin{equation}
  P_n(i, j)
 =
\hspace{-8ex}
 \begin{tikzpicture}[%
  baseline=(m.west),
  every left delimiter/.style={xshift=1ex},
  every right delimiter/.style={xshift=-1ex}]
  \matrix(m)[matrix of math nodes,nodes in empty cells,
  ampersand replacement=\&,
  left delimiter={(},right delimiter={)},%
  inner sep=0.8ex]
  {
  1\&\&\&\phantom{1}\&\&\&\&\phantom{1}\&\&\&\\
  \&\&\&\&\&\&\&\&\&\&\\
  \&\& 1\&\&\&\&\&\&\&\&\\
\phantom{1}\&\&\phantom{1}\& 0\&\phantom{1}\&\&\phantom{1}\& 1\&\phantom{1}\&\&\phantom{1}\\
  \&\&\&\phantom{1}\& 1\&\&\&\phantom{1}\&\&\&\\
  \&\&\&\&\&\&\&\&\&\&\\
  \&\&\&\phantom{1}\&\&\& 1\&\phantom{1}\&\&\&\\
\phantom{1}\&\&\phantom{1}\&1 \&\phantom{1}\&\&\phantom{1}\& 0\&\phantom{1}\&\&\phantom{1}\\
  \&\&\&\phantom{1}\&\&\&\&\phantom{1}\& 1\&\&\\
  \&\&\&\&\&\&\&\&\&\&\\
  \&\&\&\phantom{1}\&\&\&\&\phantom{1}\&\&\& 1\\
  };
 \node[above=4.5ex] at(m-1-4){第$i$列};
 \node[above=2ex] at(m-1-4){$\downarrow$};
  \node[above=4.5ex] at(m-1-8){第$j$列};
  \node[above=2ex] at(m-1-8){$\downarrow$};
  \node[left=2.5ex]at(m-4-1){第$i$行$\to$};
  \node[left=2.5ex]at(m-8-1){第$j$行$\to$};
 \begin{scope}[on background layer,x=1ex,y=1ex]
\tikzmath{
int \k,\n,\m;
coordinate \A,\B,\C,\D,\E,\F;
  for \n in {1, 5, 9}{%
  \m=\n +2;
  for \k in {4,8}{
  \A=(m-\k-\n.west);
  \B=(m-\k-\m.east);
  \C=(m-\n-\k.north);
  \D=(m-\m-\k.south);
  {\draw[line width=1pt,line cap=round,dash pattern=on 0pt off 4\pgflinewidth]
  (\A)--(\B) (\C)--(\D);};
  };
  \E=(m-\n-\n.south east);
  \F=(m-\m-\m.north west);
  {\draw[line width=1pt,line cap=round,dash pattern=on 0pt off 4\pgflinewidth]
  (\E)--(\F);};
  };
  }
 \end{scope} 
 \end{tikzpicture}
 \end{equation}
\end{document}

行列の外部に文字を書くことよりも、行列内の複数列、複数行にわたるドットを比較的簡単に記述できるのもtikzを使う利点かもしれません。

追記2015/12/11:少し変更を行いました。ドットの始点や終点になっている行列のセルにphantomで空白を入れ、ドットの長さを調整しました。