Unindo partes de equações com linhas ou setas

Unindo partes de equações com linhas ou setas

Preciso adicionar linhas ou setas para mostrar a expansão das possibilidades à medida que o espaço do problema se expande. Por exemplo, estou tentando produzir algo assim (com as linhas adicionadas manualmente):

amostra de linhas de equação

Posso encontrar exemplos para adicionar setas no topo de uma equaçãoComo desenhar setas entre partes de uma equação para mostrar a propriedade distributiva matemática (multiplicação)?e comecei criando o layout que desejo usando um bloco de alinhamento (mostrado abaixo) e estou tentando unir as seções com setas, conforme mostrado na pergunta vinculada, mas ainda não produzi nada útil.

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

Isso parece um tanto grosseiro, alguém pode me ajudar a completar o que comecei ou sugerir uma maneira mais elegante (talvez usando uma tabela para armazenar as opções e depois vincular as células)?

Responder1

Uma maneira simples de alcançar o resultado é usar a construção da árvore 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}

dá:

insira a descrição da imagem aqui

Onde:

  • grow=rightsignifica que a árvore cresce na direção certa;
  • sibling distance=20ptsignifica que a distância entre as crianças é 20pt(altere para aumentar ou diminuir esta distância);
  • level distance=2.65cmrepresenta a distância dos diferentes níveis;
  • edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}redefine o caminho dos nós pais aos nós filhos (para ser uma linha reta); se você não usar esta construção, o caminho não será perfeito porque algumas conexões não apontam para a esquerda dos nós, mas para o centro deles.

Para ter uma conexão com as setas finais, basta alterar:

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

com:

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

Ao usar a \tikzmarkmacro como resposta vinculada, pode-se proceder da seguinte forma:

  1. definição macro:
    % ver como referência:
    %uso da matriz tikzpicture no ambiente de alinhamento ou coleta
    \def\vertalignmath{\o\dimexpr\fontdimen22\textfont2\relax}
    \newcommand{\tikzmark}1{%
    \tikz[lembrar imagem,sobreposição,linha de base=-\vertalignmath] \node [coordenada] (#1){};
    }
    
    o uso \vertalignmathé ter uma configuração vertical correta;
  2. uso de macro dentro do alignbloco:
    \begin{alinhar*}
    &&&&\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{alinhar*}
    
    os marcadores são colocados antes e depois dos elementos: é importante dar nomes únicos;
  3. crie as conexões; outra macro \connecté definida:
    \newcommand{\conectar}1{%
    \tikz[lembrar imagem,sobreposição,linha de base=-\vertalignmath]{
    \foreach \start/\end in {#1}{
      \drawshorten <=2pt,encurtar >=2pt--(\end);
    }
    }
    }
    
    e então usado:
    \conectar{a/b1,a/b2,a/b3,a/b4,
    c/d1,c/d2,c/d3}
    
    para conectar da maneira certa os marcadores.

O código completo:

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

O resultado, após pelo menos duas execuções de compilação, é:

insira a descrição da imagem aqui

Para ter setas, a \connectmacro pode ser transformada em:

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

Então o uso de:

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

gerará:

insira a descrição da imagem aqui

informação relacionada