Соединение частей уравнений линиями или стрелками

Соединение частей уравнений линиями или стрелками

Мне нужно добавить линии или стрелки, чтобы показать расширение возможностей по мере расширения проблемного пространства. Например, я пытаюсь создать что-то вроде этого (с линиями, добавленными вручную):

пример линий уравнения

Я могу найти примеры добавления стрелок поверх уравнения.Как нарисовать стрелки между частями уравнения, чтобы продемонстрировать математическое распределительное свойство (умножение)?и я начал с создания нужного мне макета с помощью блока выравнивания (показано ниже) и пытаюсь соединить разделы стрелками, как показано в связанном вопросе, но пока ничего полезного не получилось.

\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. определение макроса:
    % см. в качестве ссылки:
    %использование матрицы tikzpicture в среде выравнивания или сбора
    \def\vertalignmath{\the\dimexpr\fontdimen22\textfont2\relax}
    \newcommand{\tikzmark}1{%
    \tikz[запомнить картинку,наложение,базовая линия=-\vertalignmath] \node [координата] (#1){};
    }
    
    использование \vertalignmathимеет правильную вертикальную настройку;
  2. использование макроса внутри alignблока:
    \begin{выравнивание*}
    &&&&\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{выравнивание*}
    
    маркеры размещаются перед и после элементов: важно давать уникальные названия;
  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,
    с/д1,с/д2,с/д3}
    
    правильно соединить маркеры.

Полный код:

\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}

Результат, полученный после как минимум двух запусков компиляции, следующий:

введите описание изображения здесь

Чтобы появились стрелки, \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} 

будет генерировать:

введите описание изображения здесь

Связанный контент