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