方程式の一部を線や矢印で結ぶ

方程式の一部を線や矢印で結ぶ

問題領域が拡大するにつれて可能性が拡大することを示すために、線や矢印を追加する必要があります。たとえば、次のようなものを作成しようとしています (線は手動で追加します)。

方程式の線のサンプル

方程式の上に矢印を追加する例を見つけることができます数学の分配法則(乗算)を示すために方程式の各部分の間に矢印を描くにはどうすればよいでしょうか?まず、整列ブロック (下記参照) を使用して必要なレイアウトを作成し、リンクされた質問に示されているように矢印でセクションを結合しようとしていますが、まだ役に立つものを作成できていません。

\begin{align*}
&&&&(1, 1, 0, 0)&\\
&&(1, 0, 0, 0)&&(1,0,1,0)&\\
0&&(0, 1, 0, 0)&&(1,0,0,1)&\\
&&(0, 0, 1, 0)&&&\\
&&(0, 0, 0, 1)&&&
\end{align*}   

これは少し粗雑な感じがします。私が始めたことを完成させるのを手伝ってくれる人、またはもっとエレガントな方法(おそらくテーブルを使用してオプションを保存し、セルをリンクするなど)を提案してくれる人はいませんか?

答え1

結果を達成する簡単な方法は、TikZ ツリー構築を使用することです。

\documentclass{article}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[grow=right, sibling distance=20pt,level distance=2.65cm,
edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}]
\node {0}
child {node {(0, 0, 0, 1)}}
child {node {(0, 0, 1, 0)}}
child {node {(0, 1, 0, 0)}}
child {node {(1, 0, 0, 0)}
child {node {(1, 0, 0, 1)}}
child {node {(1, 0, 1, 0)}}
child {node {(1, 1, 0, 0)}}
};
\end{tikzpicture}
\end{document}

与える:

ここに画像の説明を入力してください

どこ:

  • grow=right木が正しい方向に成長することを意味します。
  • sibling distance=20pt子の間の距離は20pt(この距離を増やすか減らすにはこれを変更します)であることを意味します。
  • level distance=2.65cm異なるレベルの距離を表します。
  • edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}親ノードから子ノードへのパスを再定義します (直線になります)。この構造を使用しない場合、接続の一部がノードの左側ではなく中心を指すため、パスは完全ではありません。

最終矢印との接続を確立するには、以下を変更するだけです:

edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}

と:

edge from parent path={[-stealth](\tikzparentnode.east) -- (\tikzchildnode.west)}

\tikzmarkリンクした回答としてマクロを使用すると、次のように進めることができます。

  1. マクロ定義:
    % 参照:
    %align または gather 環境での tikzpicture マトリックスの使用
    \def\vertalignmath{\the\dimexpr\fontdimen22\textfont2\relax}
    \newcommand{\tikzmark}1{%
    \tikz[画像、オーバーレイ、ベースライン=-\vertalignmath を記憶] \node [座標] (#1){};
    }
    
    を使用する目的\vertalignmathは、正しい垂直設定を行うことです。
  2. ブロック内のマクロの使用法align:
    \begin{align*}
    &&&&\tikzmark{d1}(1, 1, 0, 0)&\&&\tikzmark{b1}(1, 0, 0, 0)\tikzmark{c}&&\tikzmark{d2}(1,0,1,0)&\0\tikzmark{a}&&\tikzmark{b2}(0, 1, 0, 0)&&\tikzmark{d3}(1,0,0,1)&\&&\tikzmark{b3}(0, 0, 1, 0)&&&\&&\tikzmark{b4}(0, 0, 0, 1)&&&
    \end{align*}
    
    マーカーは要素の前後に配置されます。一意の名前を付けることが重要です。
  3. 接続を作成します。別のマクロ\connectが定義されています。
    \newcommand{\connect}1{%
    \tikz[画像、オーバーレイ、ベースライン=-\vertalignmath]{
    \foreach \start/\end を {#1}{ で実行
      \drawshorten <=2pt、shorten >=2pt--(\end);
    }
    }
    }
    
    そして次のように使用します:
    \connect{a/b1,a/b2,a/b3,a/b4,
    c/d1、c/d2、c/d3}
    
    マーカーを正しく接続します。

完全なコード:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}

% see as reference:
% https://tex.stackexchange.com/questions/59658/use-of-tikzpicture-matrix-in-align-or-gather-environment#comment126261_59660
\def\vertalignmath{\the\dimexpr\fontdimen22\textfont2\relax}
\newcommand{\tikzmark}[1]{%
  \tikz[remember picture,overlay,baseline=-\vertalignmath]\node[coordinate](#1){};
}

\newcommand{\connect}[1]{%
  \tikz[remember picture,overlay,baseline=-\vertalignmath]{
    \foreach \start/\end in {#1}{
      \draw[shorten <=2pt,shorten >=2pt](\start)--(\end);
    }
  }
}

\begin{document}
\begin{align*}
&&&&\tikzmark{d1}(1, 1, 0, 0)&\\
&&\tikzmark{b1}(1, 0, 0, 0)\tikzmark{c}&&\tikzmark{d2}(1,0,1,0)&\\
0\tikzmark{a}&&\tikzmark{b2}(0, 1, 0, 0)&&\tikzmark{d3}(1,0,0,1)&\\
&&\tikzmark{b3}(0, 0, 1, 0)&&&\\
&&\tikzmark{b4}(0, 0, 0, 1)&&&
\end{align*}
\connect{a/b1,a/b2,a/b3,a/b4,
c/d1,c/d2,c/d3} 
\end{document}

少なくとも 2 回のコンパイル実行後の結果は次のようになります。

ここに画像の説明を入力してください

矢印を表示するには、\connectマクロを次のように変更します。

\newcommand{\connect}[2][-]{%
  \tikz[remember picture,overlay,baseline=-\vertalignmath]{
    \foreach \start/\end in {#2}{
      \draw[#1,shorten <=2pt,shorten >=2pt](\start)--(\end);
    }
  }
}

次に以下を使用します:

\connect[-stealth]{a/b1,a/b2,a/b3,a/b4,
c/d1,c/d2,c/d3} 

生成されます:

ここに画像の説明を入力してください

関連情報