
Ich muss in meinem Dokument einige semantische Tableaus setzen, die dem folgenden Beispiel ähneln.
Meine erste Idee war, tikz
dies zu verwenden, also habe ich das folgende Monster erstellt:
\documentclass[convert]{standalone}
\usepackage{tikz,amssymb}
\usetikzlibrary{positioning}
\newcommand{\lnec}{\Box}
\begin{document}
\begin{tikzpicture}[scale=2]
\node[label=right:$(\lnec p\to\lnec q)\to\lnec(p\to q)$] (n1) {$\circ_1$};
\node[label=left:$\lnec p\to\lnec q$, label=right:$\lnec(p\to q)$, below=of n1] (n2) {$\circ_1$};
\node[label=left:$\lnec q$, label=right:$\lnec(p\to q)$, below left=of n2] (n3) {$\circ_1$};
\node[label=right:{$\lnec p, \lnec(p\to q)$}, below right=of n2] (n4) {$\circ_1$};
\node[label=left:$q$, label=right:$\lnec(p\to q)$, below=of n3] (n5) {$\circ_2$};
\node[label=right:$p$, below left=of n4] (n6) {$\circ_3$};
\node[label=right:$p\to q$, below right=of n4] (n7) {$\circ_4$};
\node[label=left:$p$, label=right:$q$, below=of n7] (n8) {$\circ_4$};
\draw[-] (n1) to (n2);
\draw[-] (n2) to (n3);
\draw[-] (n2) to (n4);
\draw[-, dotted] (n3) to (n5);
\draw[-, dotted] (n4) to (n6);
\draw[-, dotted] (n4) to (n7);
\draw[-] (n7) to (n8);
\end{tikzpicture}
\end{document}
Es ist klar, dass dies nicht das gewünschte Ergebnis ist. Die Kanten sollten unterhalb beginnen und oberhalb der\circ
s enden und sie sollten rechte Winkel haben, sodass das Diagramm etwas komprimiert werden kann.
Das Zeichnen dieser Art von Diagrammen ist für mich völliges Neuland. Können Sie mir also einige nützliche Richtlinien geben? Haben Sie Tipps oder Tricks zum Erstellen dieser semantischen Tableaus im Allgemeinen? Sind Pakete wie forest
oder qtree
„produce“ für diese Art von Bäumen einfacher zu verwenden?
Bearbeiten: Die Antwort von @cfr ist vielversprechend, daher würde ich gerne an forest
seinem Stil arbeiten und ihn verfeinern tableaux
. Ich habe in den letzten zwei Tagen versucht, es selbst zu tun, aber es forest
stellte sich für einen Anfänger wie mich als unmöglich heraus, alle erweiterten Optionen in der Dokumentation zu verstehen. Daher würde ich der Person, die die Feinabstimmung für mich vornehmen kann, gerne eine Belohnung aussprechen. Das bedeutet
- der Abstand zwischen WFF und
\circ
Separator sollte verkleinert werden, - die Kanten sollten mit der Mitte der
\circ
Trennzeichen ausgerichtet sein, wobei die möglichen Indizes ignoriert werden, - das obige sollte auch funktionieren, wenn kein Index für das
\circ
Trennzeichen angegeben ist.
Antwort1
Diese Antwort verwendet einen völlig anderen Ansatz, da der Code aus der ursprünglichen Version der Frage leider verloren gegangen ist. Sie ist möglicherweise weniger hilfreich, da sie nicht auf diesem Code basiert, aber ich werde sie hier lassen, da sie irgendwann für jemanden von Nutzen sein könnte.
Hier ist ein grundlegender Forest-Stil tableaux
, der für diese Art von Diagramm verwendet werden könnte.
Das Problem bei der Verwendung label
besteht darin, dass es bei der Positionierung der Knoten relativ zueinander nicht berücksichtigt wird. tableaux
erstellt stattdessen zusätzliche Knoten für diesen Inhalt, die zusammen mit dem „Haupt“-Knoten angegeben werden. Dadurch ist es möglich, die Dinge korrekt am „Haupt“-Kreis auszurichten und gleichzeitig ausreichend Platz für die WFFs zu lassen.
Der einzige wirkliche Nachteil dabei ist, dass ein zusätzlicher phantom
Stammknoten erstellt werden muss, da wir sonst mit 2 oder 3 Wurzeln enden würden (dem Hauptknoten auf der obersten Ebene und WFFs auf jeder Seite). Das ist nicht möglich. Daher der Phantom-Stammknoten.
Wenn Sie viele dieser Aktionen ausführen, können Sie das Hinzufügen des Phantom-Roots vermeiden, indem Sie eine neue Umgebung erstellen, die dies automatisch erledigt. (Das environ
Paket kann hierfür mit einem benutzerdefinierten Namen für den Umgebungskörper verwendet werden.)
edges
Zur Bereitstellung des Stils wird die Bibliothek von Forest verwendet forked edges
.
Die Feinabstimmung bleibt dem Leser überlassen. Beispielsweise könnte es besser aussehen, die Geschwisterabstände anzupassen, um die WFFs näher heranzubringen.
\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage[edges]{forest}
\usepackage{amssymb}
\begin{document}
\forestset{%
declare toks={F}{},
declare toks={T}{},
tableaux/.style={%
forked edges,
for tree={
math content,
parent anchor=children,
child anchor=parent,
},
where level=0{%
for children={no edge},
phantom,
}{%
delay={%
content/.wrap value={\circ_{##1}},
insert before/.wrap pgfmath arg={%
[{##1}, no edge, math content]
}{T()},
insert after/.wrap pgfmath arg={%
[{##1}, no edge, math content]
}{F()},
},
if={n_children("!u")==1}{%
before packing={calign with current edge},
}{}
},
}
}
\newcommand*{\necc}{\ensuremath{\mathbin{\Box}}}
\newcommand*{\lif}{\ensuremath{\mathbin{\rightarrow}}}
\begin{forest}
tableaux
[
[1, F=(\necc p \lif \necc q) \lif \necc (p \lif q)
[1, T=\necc p \lif \necc q, F=\necc (p \lif q)
[1, T=\necc q, F=\necc (p \lif q)
[2, T=q, F=p \lif q, edge=densely dotted
[2, T={p, q}, F=q, label=below:$\otimes$]
]
]
[1, F={\necc p, \necc(p \lif q)}
[3, F=p, edge=densely dotted]
[4, F=p \lif q, edge=densely dotted
[4, F=q, T=p]
]
]
]
]
]
\end{forest}
\end{document}
BEARBEITEN
Dies geht auf die 3 der Frage hinzugefügten Desiderate ein. Wir vermeiden die Auswirkung der Indizes auf die Ausrichtung, indem wir sie als Beschriftungen und nicht als Teil der Knoten darstellen. Wir passen den Abstand zu den WFFs an, bevor wir den Baum zeichnen, da wir die Geschwisterabstände nicht allgemein verringern möchten, sondern nur den Abstand zwischen den Kreisen und den zugehörigen WFFs. Dies ist mit und ohne Indizes in Ordnung.
Abhängig von Ihrer tatsächlichen Nutzung, Schriftfamilie und -größe usw. möchten Sie möglicherweise die in den Anpassungen verwendeten bestimmten Abmessungen anpassen. Dies sind -3.5pt
und 3.5pt
für die Indizes und 7.5pt
und -7.5pt
für die WFFs im MWE unten.
\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage[edges]{forest}
\usepackage{amssymb}
\begin{document}
\forestset{%
declare toks={T}{},
declare toks={F}{},
tableaux/.style={%
forked edges,
for tree={
math content,
parent anchor=children,
child anchor=parent,
},
where level=0{%
for children={no edge},
phantom,
}{%
before typesetting nodes={%
content/.wrap value={\circ},
},
delay={%
my label/.wrap pgfmath arg={{[inner sep=0pt, xshift=-3.5pt, yshift=3.5pt, anchor=north west, font=\scriptsize]-45:$##1$}}{content()},
insert before/.wrap pgfmath arg={%
[{##1}, no edge, math content, before drawing tree={x'+=7.5pt}]
}{T()},
insert after/.wrap pgfmath arg={%
[{##1}, no edge, math content, before drawing tree={x'-=7.5pt}]
}{F()},
},
if={n_children("!u")==1}{%
before packing={calign with current edge},
}{}
},
}
}
\newcommand*{\necc}{\ensuremath{\mathbin{\Box}}}
\newcommand*{\lif}{\ensuremath{\mathbin{\rightarrow}}}
\begin{forest}
tableaux
[
[1, F=(\necc p \lif \necc q) \lif \necc (p \lif q)
[1, T=\necc p \lif \necc q, F=\necc (p \lif q)
[1, T=\necc q, F=\necc (p \lif q)
[2, T=q, F=p \lif q, edge=densely dotted
[2, T={p, q}, F=q, label=below:$\otimes$]
]
]
[1, F={\necc p, \necc(p \lif q)}
[3, F=p, edge=densely dotted]
[4, F=p \lif q, edge=densely dotted
[4, F=q, T=p
[99, F=X!, T=XX!!
[, F=XXX!!!, T=XXXX!!!!]
]
]
]
]
]
]
]
\end{forest}
\end{document}
BEARBEITEN BEARBEITEN
Wie in einem Kommentar erwähnt, hat mein Edit dazu geführt, dass die Closures verschwunden sind. Das liegt daran, dass sie mit erstellt wurden label
und die Nummern oben rechts in den Knoten ebenfalls mit hinzugefügt wurden label
. Obwohl die Labels an verschiedenen Stellen angefordert werden und in normalem TikZ-Code in Ordnung wären, definiert Forest label
so, dass nur eines pro Knoten zulässig ist. Außerdem:label
Auchüberschreibt alle zuvor mit tikz
oder angegebenen Anmerkungen pin
. Von forest.sty
:
label/.style={tikz={\path[late options={%
name=\forestoption{name},label={#1}}];}},
pin/.style={tikz={\path[late options={%
name=\forestoption{name},pin={#1}}];}},
Jeder Aufruf tikz
überschreibt alle vorherigen Einstellungen. Daher sammelt sich kein Code an, sondern ersetzt vorhandenen Code.
Ich bin mir nicht sicher, welchen Grund der Autor für diese Wahl hatte, daher bin ich mir nicht ganz sicher, wie ich das am besten angehen soll. Eine Möglichkeit wäre, für die Zahlen zu verwenden , was die Verwendung von im Baum selbst afterthought
ermöglichen sollte . In diesem Fall könnten wir die Zahlen jedoch nicht als TikZ s angeben, ohne im Wesentlichen den Code zu reproduzieren, den Forest von vornherein für verwendet. Da dies keinen Vorteil zu bringen scheint, ist es verlockend, stattdessen neu zu definieren, indem der Präambel des Dokuments der folgende Code hinzugefügt wird:label
label
label
label
\forestset{% Sašo Živanović won't like this ...
label/.style={%
tikz+={%
\path[late options={%
name=\forestoption{name},label={#1}}
];
}
},
}
Hier +
ist, was den Unterschied macht. Jetzt label
werden s akkumuliert, anstatt sich gegenseitig und/oder vorherige Verwendungen von pin
, tikz
oder zu überschreiben tikz+
. Wie bereits erwähnt, kann ich mir nicht vorstellen, dass dies die Art von Dingen ist, die ich tun soll, also empfehle ich es nicht, auch wenn es funktioniert:
Eine komplexere Alternative besteht darin, Folgendes zu verwenden:
\forestset{%
my label/.style={%
tikz+={%
\path[late options={%
name=\forestoption{name},label={#1}}
];
}
}
}
Die Platzierung der Zahlen erfolgt dann einfach durch my label
anstelle von label
. Komplette Konfiguration:
\forestset{%
declare toks={T}{},
declare toks={F}{},
my label/.style={%
tikz+={%
\path[late options={%
name=\forestoption{name},label={#1}}
];
}
},
tableaux/.style={%
forked edges,
for tree={
math content,
parent anchor=children,
child anchor=parent,
},
where level=0{%
for children={no edge},
phantom,
}{%
before typesetting nodes={%
content/.wrap value={\circ},
},
delay={%
my label/.wrap pgfmath arg={{[inner sep=0pt, xshift=-3.5pt, yshift=3.5pt, anchor=north west, font=\scriptsize]-45:$##1$}}{content()},
insert before/.wrap pgfmath arg={%
[{##1}, no edge, math content, before drawing tree={x'+=7.5pt}]
}{T()},
insert after/.wrap pgfmath arg={%
[{##1}, no edge, math content, before drawing tree={x'-=7.5pt}]
}{F()},
},
if={n_children("!u")==1}{%
before packing={calign with current edge},
}{}
},
}
}
was zum gleichen Ergebnis wie oben führt, ohne den Stil von Forest neu zu definieren label
.