スキップしてメイン コンテンツに移動

Tikzを使って行列を装飾する。

Tikzを使って行列の装飾をしてみました。特定行の背景を色付けすることと、矢印を引っ張ってコメントを付ける試みをしています。

矢印を描く部分は、図画間結合(inter-picture connections)を使っています。これはremember pictureオプションを使って、自分以外のtikzpicture環境にあるノードを参照する機能だそうです。通常のplatex+dvipmdfx環境では使うことができないため、zrbabblerさんのblog「マクロツイーター」の記事「Tikzはdvipdfmxをどこまでサポートするか?(2)」に紹介されているpxpgfmarkパッケージを使いました。図画間結合については同記事に詳しい説明がなされています。

追記:2019/04/05:図画間結合がplatex/uplatexについてもサポートされたようで、pxpgfmarkパッケージは必要なくなりました。

上の式を出力するためのソースは次の通りです。
\documentclass[dvipdfmx]{jsarticle}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{matrix,fit,backgrounds,calc}

\usepackage{pxpgfmark}%e-ptexでremember pictureを可能にする.

\begin{document}
 \begin{align*}
&  b_{11}^{k-1}
 \begin{vmatrix}
  b_{11}& \dotsb & b_{1k}\\
  b_{21}&\dotsb & b_{2k}\\
  \multicolumn{3}{c}{\dotsb\dotsb}\\
  b_{k1}&\dotsb & b_{kk}
 \end{vmatrix}
  =
 \begin{tikzpicture}[remember picture,baseline=(T1.west),
  every left delimiter/.style={xshift=1ex},
  every right delimiter/.style={xshift=-1.5ex}] %,
  %matrixライブラリで行列の各セルにノードを配置する
  \matrix(T1)[
  matrix of math nodes,nodes in empty cells,
  ampersand replacement=\&,
  left delimiter={|},right delimiter={|},
  inner sep=0.45ex]
 {
 b_{11}\& b_{12} \&\dotsb \& b_{1k}\\
  b_{11}b_{21}\& b_{11}b_{22}\& \dotsb  \& b_{11}b_{2k}\\
 \vphantom{b_{11}}\&\&\& \\%tikzのmatrixではmulticolumnが使えないので複数列に渡るドットを後で描画する.
  b_{11}b_{k1} \&b_{11}b_{k2} \&\dotsb \& b_{11}b_{kk}\\
 };
 \node[fit=(T1-3-2)(T1-3-4)]{$\dots\dots$};%複数列に渡るドット
 \end{tikzpicture} 
 \\[5pt]
&\qquad
 \begin{aligned}[t]
 & =
 \begin{tikzpicture}[remember picture,
 baseline=(T2.west),
 every left delimiter/.style={xshift=1ex},
 every right delimiter/.style={xshift=-1ex}] %,
 \matrix(T2)[matrix of math nodes,nodes in empty cells,
 ampersand replacement=\&,
 left delimiter={|},right delimiter={|},
 inner sep=0.45ex]
 {
 b_{11} \& b_{12} \& \dotsb \& b_{1k}\\
 0 \& b_{11}b_{22}-b_{12}b_{12} \&\dotsb  \& b_{11}b_{2k}-b_{12}b_{1k}\\
 \vphantom{b_{11}}\& \& \&\\
  b_{11}b_{k1} \& b_{11}b_{k2} \&\dotsb \& b_{11}b_{kk}\\
 };
 \node[fit=(T2-3-2)(T2-3-4)]{$\dots\dots$};
%backgroudsライブラリで行の背景を塗る
 \begin{scope}[on background layer]
  \fill[gray!40,rounded corners]($(T2-2-1.north west)+(-10pt,0)$)rectangle(T2-2-4.south east);
 \end{scope}
 \end{tikzpicture}\hspace{80pt}
 \\[5pt]
 &=
%横幅の広いドット
 \tikz[remember picture,baseline=-0.5ex]{
 \draw[line width=1.5pt,line cap=round,dash pattern=on 0pt off 4\pgflinewidth](0,0)--(160pt,0);
 }
 \\[5pt]
 &=
 \begin{tikzpicture}[remember picture,baseline=(T3.west),
 every left delimiter/.style={xshift=1ex},
 every right delimiter/.style={xshift=-1ex}]
 \matrix(T3)[matrix of math nodes,nodes in empty cells,
 ampersand replacement=\&,
 left delimiter={|},right delimiter={|},
 inner sep=0.45ex]
 {
  b_{11} \& b_{12} \& \dotsb \& b_{1k}\\
 0 \& b_{11}b_{22}-b_{12}b_{12} \& \dotsb  \& b_{11}b_{2k}-b_{12}b_{1k}\\
 \vphantom{b_{11}}\&\&\&\\
  0 \& b_{11}b_{k2}-b_{12}b_{1k} \&\dotsb \& b_{11}b_{kk}-b_{1k}b_{1k}\\
 };
 \node[fit=(T3-3-2)(T3-3-4)]{$\dotsb\dotsb$};
 \begin{scope}[on background layer]
 \fill[gray!40,rounded corners]($(T3-4-1.south west)+(-3pt,0)$)rectangle (T3-4-4.north east);
 \end{scope} 
 \end{tikzpicture} 
%
 \begin{tikzpicture}[remember picture,overlay]
  \draw[->]($(T1-2-4.east)+(3pt,0)$)
  -|  ($(T2-2-4.east)+(15pt,0)$) --($(T2-2-4.east)+(2pt,0)$);
  \node[right=15pt,text width=95] at ($(T2-2-4.east)+(0,30pt)$){\small 1行目の$b_{12}$倍を2行目から引く};
  \draw[->]($(T1-4-4.east)+(2pt,0)$)-|($(T3-4-4.east)+(20pt,0)$)--($(T3-4-4.east)+(2pt,0)$);
  \node[right=20pt,text width=100] at (T3.east){\small 1行目の$b_{1k}$倍を$k$行目から引く};
 \end{tikzpicture}
  \\[5pt]
  &=
 \begin{vmatrix}
  b_{11} & b_{12}&\dotsb &b_{1k}\\
  0& a_{22} &\dotsb & a_{2k}\\
  \vdots& \multicolumn{3}{c}{\dotsb\dotsb}\\
  0& a_{k2} & \dotsb & a_{kk}
 \end{vmatrix}
  =b_{11}
 \begin{vmatrix}
  a_{22} &\dotsb &a_{2k}\\
  \multicolumn{3}{c}{\dotsb\dotsb}\\
  a_{k2}&\dotsb & a_{kk}
 \end{vmatrix}
 \end{aligned}
 \end{align*}
\end{document}
かなり微調整をしているのでソースは汚いです。行の背景に色付けするために、matrixライブラリを使って各セルにノードを配置し、そのノードを元に色付けを行っています。またtikzのmatrix命令の中ではmulticolumn環境が使えないので、複数列に渡るドットも行列のセルのノードの情報を元に後で描画しています。

このブログの人気の投稿

OpenCv-PythonとpdfLaTeXで自炊pdfファイルの位置調整

この記事は TeX & LaTeX Advent Calendar 2021 の11日目の記事です. 10日目は t_kemmochi さん,12日目は yukishita さんです.   動機  書籍の自炊にブックエッジスキャナーの AvisionのFB2280E を利用しています。書籍を裁断せずに1ページずつスキャンを行うため、本の開き具合などの要因で本の序盤、中盤、終盤で得られるスキャン画像の位置ずれが大きくなります。以前からpdfLaTeXを利用して位置調整をしていたのですが、OpenCvを利用して自動化できそうだったので試してみました。 やること 本記事では、pdf化した文書画像の版面(文字の印刷された部分の意味で使います)を半自動的に計算してpdfの画像の位置調整をするために、OpenCvとpdfLaTeXを利用する方法を解説します。手順としては Pythonの画像認識用ライブラリであるOpenCvを利用して版面を計算する。 テンプレートエンジンライブラリのJinja2を使って画像のバウンディングボックスなどを記述したLaTeXファイルを作成する。 pdfLaTeXでpdfを読み込み、位置の調整されたpdfを作成する。 という流れになっています。作業環境としては、 Visual Studio CodeをRemove - WSL拡張機能と併用 しています。PythonやそのライブラリはWSL上のUbuntuにインストールし、他にもpdfファイルを他のファイル形式にするためにpoppler-utilsなんかもインストールしました。 参考記事 OpenCvを利用した文書画像のレイアウト解析については ブログSomething Like Programming内の記事 Document Layout Analysis githubリポジトリ rbaguila/document-layout-analysis OpenCv-Pythonチュートリアル を参考にしました。 pdfLaTeXがpdf加工に使えるという話と、pdfpagesパッケージの存在は doraTeXさんのブログTeX Alchemist Onlineの記事 pdfTeX による見開きPDFの結合・分割 で知ったように思います。 画像pdfをpdfpagesで取り込む ま...

定理環境をmdframedからtcolorboxへ乗り換え

追記:2016/05/02 以前に掲載していた定理環境のマクロでは、カウンターが変化しないような記述をしてしまっていたので、全面的に書き換えました。 追記:2016/06/06 tcolorboxのオプションを追加できるように書き直しをしました( tcolorboxを使った定理環境 )。 LaTeXの話です。 これまで定理環境の修飾にmdframed.styを利用してきました。 mdframedを用いた定理環境の修飾(platex+dvipdfmx, tikz) しかし上の投稿で用いた記述をしていると、定理環境がページの下部にきたとき、まれに以下のように環境が新しいページに送られてしまい変なところで改ページが起こります。 TeX-LaTeX Stack Exchangeでも同様の不具合が報告されていて、mdframed.styの作者が回答して解決しているようなのですが、私の場合は上手く行きませんでした。タイトル部分の位置の計算に問題があるようです。 そういう訳で、mdframed.styよりも高い表現力を持つtcolorbox.styには興味を持っていました。今回は、mdframed.styで記述していた部分を、ソースの変更無しにtcolorboxで置き換えてみたので、その紹介をします。 tcolorbox.styで置き換えた結果は次のようになりました。 見た目はほとんど変わっていません。中のboxは別のtcolorbox環境です。 この定理環境のソースコードは次のようになります。 \usepackage{tcolorbox} \usepackage{varwidth} \tcbuselibrary{breakable} \tcbuselibrary{skins} \definecolor{frameinnercolor}{RGB}{49,44,44} \newcounter{theorem} \numberwithin{theorem}{section}% numberwithinはamsmath.styで定義されている \newenvironment{theorem}[2][]{% %#1 = タイトル, #2 = 定理環境名 \refstepcounter{theorem}% \newtcolorbox{...

定理を再掲したときに定理番号も揃える(amsmathのtagと似た挙動の定理環境を作る).

LaTeXの話題です.amsmath.styで定義されているtagコマンドは,数式環境の式番号部分を自由な文字列で置き換えることができるようになっています.下に例を挙げます. この画像を生成するLaTeXのコードは次のようになります. \documentclass[a4paper,dvipdfmx,uplatex]{jsarticle} \usepackage[dvipdfmx,bookmarks=true,bookmarksnumbered=true,% ,colorlinks=true,linkcolor=blue]{hyperref}% \usepackage{showkeys} \usepackage{amsmath} \numberwithin{equation}{section} Unknown environment 'document' 最初のequation環境にeq:eulerというlabelをつけ,第2のequation環境ではtagコマンドを使って数式番号部分に¥ref{eq:euler}と書くことで,実際に表示される式番号が第1のequation環境のものと同じになっています.この第2のequation環境にはeq:euler2というlabelを付けており,これを¥eqref{eq:euler2}と参照すると表示される番号は第1のequation環境のものであるにも関わらず,リンクをクリックすると第2のequation環境にジャンプします. このような現象が起こるのは,上記のファイルをタイプセット...