Аннотирование таблиц с помощью Tikz; Добавление стрелок

Аннотирование таблиц с помощью Tikz; Добавление стрелок

Я хотел бы иметь возможность нарисовать стрелку с текстом сверху, соединяющую две произвольные (т.е. возможно не правые/крайние левые, возможно несмежные) ячейки таблицы с помощью стрелки, направленной влево. В частности, я пытаюсь получить стрелку сверху таблицы, похожую на ту, что вы получаетездесь, хотя мои таблицы не содержат чисел в своих ячейках, и я ищу решение, которое не соединяет все, а только попарно смежные ячейки. Я не уверен, как правильно это изменить.

Я работаю с beamerи использую tikz(хотя я совсем новичок в этом) и tabularx.

Есть ли способ сделать это?

Редактировать: Вот код, похожий на тот, с которым я сейчас возюсь. Я не уверен, как исправить.

    \documentclass[pdf]{beamer}
    \mode<presentation>{}
    \usepackage[english]{babel}
    \usepackage{natbib}
    \usepackage{color, colortbl}
    \renewcommand{\bibnumfmt}[1]{#1.}
    \usepackage{ marvosym }
    \usepackage{ tikzsymbols }
    \usepackage{ wasysym }
    \usepackage{tikz}
    \usetikzlibrary{tikzmark, positioning, fit,shapes.misc}

    \usetikzlibrary{decorations.pathreplacing, calc}


         \newcommand{\tikzmark}[2][-3pt]{\tikz[remember picture, overlay, baseline=-0.5ex]\node[#1](#2){};}

         \tikzset{brace/.style={decorate, decoration={brace}},
         brace mirrored/.style={decorate, decoration={brace,mirror}},
        }

          \newcounter{brace}
          \setcounter{brace}{0}
          \newcommand{\drawbrace}[3][brace]{%
          \refstepcounter{brace}
         \tikz[remember picture, overlay]\draw[#1] (#2.center)--(#3.center)node[pos=0.5, name=brace-\thebrace]{};
       }

      \newcounter{arrow}
      \setcounter{arrow}{0}
      \newcommand{\drawcurvedarrow}[3][]{%
      \refstepcounter{arrow}
      \tikz[remember picture, overlay]\draw (#2.center)edge[#1]node[coordinate,pos=0.5, name=arrow-\thearrow]{}(#3.center);
       }

       \newcommand{\annote}[3][]{%
       \tikz[remember picture, overlay]\node[#1] at (#2) {#3};
       }



       \newcommand\marktopleft[1]{
        \tikz[overlay,remember picture] 
        \node (marker-#1-a) at (0,1.5ex) {};
      }
       \newcommand\markbottomright[1]{
       \tikz[overlay,remember picture] 
      \node (marker-#1-b) at (0,0) {};
      \tikz[overlay,remember picture,thick,dashed,inner sep=3pt]
      \node[draw,rounded rectangle,fit=(marker-#1-a.center) (marker-#1-b.center)] {};
      }

     \usepackage{tabularx}
     \usepackage{stmaryrd}
     \usepackage{amsmath}
    \usepackage{mathtools}
    \usepackage{xcolor}

   \makeatletter
   \newcommand{\redub}{}
    \def\redub#1{%
    \@ifnextchar_%
      {\@redub{#1}}
      {\@latex@warning{Missing argument for \string\redub}\@redub{#1}_{}}%
     }
      \def\@redub#1_#2{%
      \colorlet{currentcolor}{.}%
      \color{red}%
      \underbrace{\color{currentcolor}#1}_{\color{red}#2}%
      \color{currentcolor}%
     }

      \newcounter{savedenumi}
      \newenvironment{moreenum}{%
       \setcounter{savedenumi}{\value{enumi}}%
       \begin{enumerate}\setcounter{enumi}{\value{savedenumi}}%
    }{%
      \end{enumerate}%
     }
      \AtBeginSection[]
   {
    \begin{frame}<beamer>
        \frametitle{}
        \tableofcontents[currentsection]
     \end{frame}
    }



    \newcolumntype{g}{>{\columncolor{red}}c}


     \begin{document}
     \begin{frame}
     \begin{tabular}{ | l | l |}
        \hline
        letter & number \\ \hline
        \tikzmark[xshift=-8pt,yshift=1ex]{x}A &  1\tikzmark[xshift=3.5em]{a} \\ \hline
         A &  2 \\ \hline
        \tikzmark[xshift=-8pt,yshift=-1ex]{y}A &  1\tikzmark[xshift=3.5em]{b} \\ \hline
        \tikzmark[xshift=-8pt,yshift=1ex]{w}B &  1 \\ \hline
        \tikzmark[xshift=-8pt,yshift=-1ex]{z}B &  2 \\ \hline
    \end{tabular}
   \drawcurvedarrow[bend left=60,-stealth]{a}{b}
   \drawbrace[brace mirrored, thick]{x}{y}
   \drawbrace[brace mirrored, thick]{w}{z}
   \annote[right]{arrow-1}{Duplicate}
   \annote[left]{brace-1}{A}
   \annote[left]{brace-2}{B}


  \tikzset{
  every picture/.style={remember picture,baseline},
  every node/.style={
    inner sep=0pt,
    anchor=base,
    minimum width=1.8cm,
    align=center,
    text depth=.25ex,
    outer sep=1.5pt},
  every path/.style={
  thick, 
  rounded corners
  }
 }  

 \begin{table}
   \centering
    \begin{tabular}{|c|c|c|g|c|}
     \hline
    bla   &  bla  & bla   & $b_1$\tikzmark{a} \\ \hline
    bla   &  bla  & bla   & bla \\\hline   
    bla   &  bla  & bla   & bla \\\hline   
    bla   &  bla  & bla   & bla \\\hline
    bla   &  bla  & bla   & bla \\\hline   
   \end{tabular}
  \end{table}
\begin{tikzpicture}[remember picture,overlay]
\node [right=2cm,above=2cm,minimum width=0pt] at (pic cs:a) (A) {A};
\draw [<-,out=5,in=180] ([xshift=15pt]{pic cs:a}) to (A);
\end{tikzpicture}
\end{frame}

\end{document}

решение1

Например, вы могли бы сделать следующее, если бы вы переписали свой исходный код для использования tikzmark. Обратите внимание, что я исключил лишнее из вашего MWE.

\documentclass[pdf]{beamer}
\mode<presentation>{}
\usepackage[english]{babel}
\usepackage{color, colortbl}
\usepackage{tikz}
\usetikzlibrary{tikzmark, positioning, fit, shapes.misc}

\usetikzlibrary{decorations.pathreplacing, calc}

\tikzset{brace/.style={decorate, decoration={brace}},
  brace mirrored/.style={decorate, decoration={brace,mirror}},
}

\newcolumntype{g}{>{\columncolor{red}}c}

\begin{document}
  \begin{frame}
    \begin{tabular}{ | l | l |}
      \hline
      letter & number \\ \hline
      \tikzmark{x}A &  1\tikzmark{a} \\ \hline
      A &  2 \\ \hline
      \tikzmark{y}A &  1\tikzmark{b} \\ \hline
      \tikzmark{w}B &  1 \\ \hline
      \tikzmark{z}B &  2 \\ \hline
    \end{tabular}
    \begin{tikzpicture}[remember picture, overlay]
      \draw ($(pic cs:a) + (3.5em,0)$) edge[bend left=60,-stealth] ($(pic cs:b) + (3.5em,0)$) node [midway, right, xshift=5pt, yshift=5pt] {Duplicate};
      \draw[brace mirrored, thick] ($(pic cs:x) + (-8pt,1ex)$)--($(pic cs:y) + (-8pt,-1ex)$) node [midway, left] {A};
      \draw[brace mirrored, thick] ($(pic cs:w) + (-8pt,1ex)$)--($(pic cs:z) + (-8pt,-1ex)$) node [midway, left] {B};
    \end{tikzpicture}

    \tikzset{
      every picture/.style={remember picture,baseline},
      every node/.style={
        inner sep=0pt,
        anchor=base,
        minimum width=1.8cm,
        align=center,
        text depth=.25ex,
        outer sep=1.5pt},
      every path/.style={
        thick,
        rounded corners
      }
    }

    \begin{table}
      \centering
      \begin{tabular}{|c|c|c|g|c|}
        \hline
        bla   &  bla  & bla   & $b_1$\tikzmark{c} \\ \hline
        bla   &  bla  & bla   & bla \\\hline
        bla   &  bla  & bla   & bla \\\hline
        bla   &  bla  & bla   & bla \\\hline
        bla   &  bla  & bla   & bla \\\hline
      \end{tabular}
    \end{table}
    \begin{tikzpicture}[remember picture,overlay]
      \node [right=2cm,above=2cm,minimum width=0pt] at ({pic cs:c}) (A) {A};
      \draw [<-,out=5,in=180] ([xshift=15pt]{pic cs:c}) to (A);
    \end{tikzpicture}
  \end{frame}

\end{document}

Это объединяет команды аннотации с командами рисования, что избавляет от необходимости определять точки для аннотации позже. Он используется calcдля корректировки позиционирования, а не для изменения положения исходных отметок. Это экономит некоторые счетчики. Я обнаружил, что размещение всего в одном наложенном изображении работает лучше, чем беспокойство о том, чтобы заставить кучу команд работать вместе, но ваши километры, очевидно, могут отличаться.

стрелки и скобки

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