Ersetzen von Tree-DVIPS, Verbinden von Knoten in einer tabellarischen Umgebung

Ersetzen von Tree-DVIPS, Verbinden von Knoten in einer tabellarischen Umgebung

Ich möchte tree-dvips loswerden, da es nicht mit xelatex kompatibel ist, und ps-tricks, da es nicht effizient mit xelatex kompiliert. Ich habe die folgenden Zahlen:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Sie wurden gesetzt, indem ich tabularfür die Anordnung der Knoten verwendete. Dann verwendete ich tree-dvips(und später ps-tricks), um die Griffe (h0, h7, ...) mit dem Begriff zu verbinden, dass die Griffe dominieren. Die Linien beginnen unterhalb des Griffs und enden nördlich des dominierten Knotens, in der Mitte des dominierten Knotens.

Nun habe ich eine Lösung mit tikzmark, deren Nachteil aber darin zu liegen scheint, dass man die Positionen der markierten Elemente immer von Hand verschieben muss, d.h. die Linien enden nicht Nord/Mitte und beginnen nicht Süd/Mitte.

\documentclass{article}


\usepackage{tikz}

\usetikzlibrary{tikzmark} % saves positions in tikz pictures, allows to connect arbitrary text
\usetikzlibrary{calc}

\begin{document}

  \begin{figure}
  \centering

  \begin{tabular}{@{}ccc@{}}
                           & \tikzmark{h0}{h0}                & \\[4ex]
  \tikzmark{h8}{h8:wieder(\tikzmark{h8h9}{h9})}\\[4ex]
  \tikzmark{h1}{h1:every(x, \tikzmark{h1h2}{h2}, \tikzmark{h1h3}{h3})}      &                              & \tikzmark{h6}{h6:CAUSE(max, \tikzmark{h6h7}{h7})}\\[8ex]
  \tikzmark{h4}{h4:window(x)}           &          & \\[6ex]
                           & \tikzmark{h5}{h5:open(x)}\\
  \end{tabular}
\begin{tikzpicture}[overlay,remember picture]
\draw[dashed] ($(pic cs:h0)+(3ex,2.5ex)$) to($(pic cs:h8)+(1ex,2ex)$);
\draw[dashed] ($(pic cs:h0)+(3ex,2.5ex)$) to($(pic cs:h6)+(1ex,2ex)$);
\draw[dashed] ($(pic cs:h8h9)+(3ex,2.5ex)$) to($(pic cs:h1)+(1ex,2ex)$);
\draw[dashed] ($(pic cs:h6h7)+(3ex,2.5ex)$) to($(pic cs:h5)+(1ex,2ex)$);
\draw[dashed] ($(pic cs:h1h2)+(3ex,2.5ex)$) to($(pic cs:h4)+(1ex,2ex)$);
\draw[dashed] ($(pic cs:h1h3)+(3ex,2.5ex)$) to($(pic cs:h5)+(1ex,2ex)$);
\end{tikzpicture}

\end{figure}

\end{document}

(Die Verschiebung wird in meinem MWE nicht richtig durchgeführt, da ich glaube, dass dies in der tatsächlichen Lösung nicht erforderlich ist.) Ich habe versucht, eine tabellarische Umgebung in TikzPicture einzufügen oder es \subnodein einer tabellarischen Umgebung zu verwenden, aber keiner dieser Versuche hat funktioniert.

Bearbeiten:Ich habe die folgende Lösung ausprobiert, aber das Ergebnis lautete:

! Package pgfkeys Error: I do not know the key '/tcb/empty' and I am going to i
gnore it. Perhaps you misspelled it.

See the pgfkeys package documentation for explanation.
Type  H <return>  for immediate help.
...                                              

 l.15   & \mybox[h0]{h0}
                                          & \\[4ex]
 ? 

Gibt es in TCB etwas, das Texlive 2014 statt 2013 erfordert?

Antwort1

Sie können verwenden, tcolorboxum unsichtbare Kästen um die Teile zu erstellen, die Sie verbinden möchten, die als Anker dienen (wie south, north, usw.), um manuelle Berechnungen zu vermeiden.

\documentclass{article}


\usepackage{tcolorbox}
\tcbuselibrary{skins}
\newtcbox{\mybox}[1][]{empty,shrink tight,nobeforeafter,on line,before upper=\vphantom{gM},remember as=#1}

\begin{document}

  \begin{figure}
  \centering

  \begin{tabular}{@{}ccc@{}}
  & \mybox[h0]{h0}                       & \\[4ex]
    \mybox[h8]{h8:wieder}\mybox[h9]{(h9)}  \\[4ex]
    \mybox[h1]{h1:every(x, \mybox[h2]{h2}, \mybox[h3]{h3})}      &                              & \mybox[h6]{h6:CAUSE(max, \mybox[h7]{h7})}\\[8ex]
  \mybox[h4]{h4:window(x)}           &          & \\[6ex]
                           & \mybox[h5]{h5:open(x)}\\
  \end{tabular}


\begin{tikzpicture}[overlay,remember picture,draw=gray,dashed,shorten <=2pt,shorten >=2pt] 
\draw(h0.south)--(h8.north); 
\draw(h0.south)--(h6.north);
\draw(h9.south)--(h1.north);
\draw(h2.south)--(h4.north);
\draw(h3.south)--(h5.north);
\draw(h7.south)--(h5.north);
\end{tikzpicture}

\end{figure} 

\end{document}

Bildbeschreibung hier eingeben

Nur der Vollständigkeit halber noch eins ähnlich dem zweiten Bild mit:

\draw(h3.south) .. controls +(0,-1) and +(-1,1)..  (h6.north);

Bildbeschreibung hier eingeben

Bearbeiten:Um die Diskussion in den Kommentaren zusammenzufassen: Der folgende Code verwendet den emptySchlüssel nicht (in TeX Live 2013 nicht verfügbar) und verwendet bottomund , topum über und unter den Boxen mehr Platz hinzuzufügen.

\documentclass{article}


\usepackage{tcolorbox} 
\tcbuselibrary{skins} 
\newtcbox{\mybox}[1][]{enhanced,boxrule=0pt,colframe=white,colback=white,shrink tight,nobeforeafter,on line,before upper=\vphantom{gM},remember as=#1,top=3pt,bottom=3pt}     

\begin{document}

  \begin{figure}
  \centering

  \begin{tabular}{@{}ccc@{}}
  & \mybox[h0]{h0}                       & \\[4ex]
    \mybox[h8]{h8:wieder}\mybox[h9]{(h9)}  \\[4ex]
    \mybox[h1]{h1:every(x, \mybox[h2]{h2}, \mybox[h3]{h3})}      &                              & \mybox[h6]{h6:CAUSE(max, \mybox[h7]{h7})}\\[8ex]
  \mybox[h4]{h4:window(x)}           &          & \\[6ex]
                           & \mybox[h5]{h5:open(x)}\\
  \end{tabular}


\begin{tikzpicture}[overlay,remember picture,draw=gray,dashed,shorten <=2pt,shorten >=2pt] 
\draw(h0.south)--(h8.north); 
\draw(h0.south)--(h6.north);
\draw(h9.south)--(h1.north);   
\draw(h2.south)--(h4.north);
\draw(h3.south)--(h5.north);
\draw(h7.south)--(h5.north);
\end{tikzpicture}

\end{figure} 

\end{document}

Antwort2

Anstatt das Paket zu verwenden tikzmark, können Sie Ihr eigenes \tikzmarkreguläres definieren node. Es besteht keine Notwendigkeit, tcolorboxein Paket zu verwenden.

\documentclass{article}
\usepackage{tikz}

\newcommand{\tikzmark}[2]%
    {\tikz[baseline=(#1.base), remember picture]\node[outer sep=0pt, inner sep=0pt] (#1) {#2};}

\begin{document}

  \begin{figure}
  \centering

  \begin{tabular}{@{}ccc@{}}
                           & \tikzmark{h0}{h0}                & \\[4ex]
  \tikzmark{h8}{h8:wieder}\tikzmark{h8h9}{(h9)}\\[4ex]
  \tikzmark{h1}{h1:every}(x, \tikzmark{h1h2}{h2}, \tikzmark{h1h3}{h3})      &                              & \tikzmark{h6}{h6:CAUSE}(max, \tikzmark{h6h7}{h7})\\[8ex]
  \tikzmark{h4}{h4:window(x)}           &          & \\[6ex]
                           & \tikzmark{h5}{h5:open(x)}\\
  \end{tabular}
\begin{tikzpicture}[overlay,remember picture,draw=gray,dashed,shorten <=2pt,shorten >=2pt] 
\draw(h0.south)--(h8.north); 
\draw(h0.south)--(h6.north);
\draw(h8h9.south)--(h1.north);
\draw(h1h2.south)--(h4.north);
\draw(h1h3.south)--(h5.north);
\draw(h6h7.south)--(h5.north);
\end{tikzpicture}
\end{figure}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen