
Ich habe den folgenden Baum. Ich möchte, dass die Dächer so breit wie der Text sind, nicht breiter. Gibt es eine Möglichkeit, dies mit zu erreichen forest
? Insbesondere sollte es die Breite des oberen Textes haben. Dies ist in Fällen wichtig, in denen die Übersetzung viel breiter als der Originaltext ist. Das Dach sollte zum Originaltext passen, da dieser analysiert wird, die Übersetzung ist zusätzlich und logischerweise kein Teil der Struktur.
\documentclass{minimal}
\usepackage{forest}
\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word}{}}},
background tree/.style={for tree={text opacity=0.2,draw opacity=0.2,edge={draw opacity=0.2}}}
}
\begin{document}
\begin{forest}
sn edges
[NP
[Det [das\\the] ]
[N'
[N'
[N [Bild\\picture] ]
[PP [vom Gleimtunnel\\of.the Gleimtunnel,triangle ] ] ]
[PP [im Gropiusbau\\in.the Gropiusbau,triangle ] ] ] ]
\end{forest}
\end{document}
Bearbeiten:Unten finden Sie eine fast perfekte Lösung von Sašo. Ein Problem bleibt jedoch bestehen. Ich habe einen Befehl definiert, \trace
den ich in Bäumen verwenden möchte. Wenn ich ihn mit dem Übersetzungscode verwende, erhalte ich den folgenden Fehler:
! Argument of \@rsbox has an extra }.
<inserted text>
\par
l.45 \end{forest}
?
Dies ist der Code:
\documentclass{minimal}
\usepackage{forest}
\forestset{
with translation/.style={
l sep=0,inner xsep=0,
append translation/.expanded/.wrap pgfmath arg={\gettranslation{##1}}{content},
content/.expanded/.wrap pgfmath arg={\gettext{##1}}{content},
},
append translation/.style={append={[#1,no edge,l=0,inner xsep=0,inner ysep=0,outer ysep=0,before
computing xy={l-=2pt}]}},
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=top},
where n children=0{tier=word,delay=with translation}{} %,delay=with translation
}
}
\def\gettext#1{\gettextA#1;;\endget}
\def\gettextA#1;#2;{\removesep#1;}
\def\gettranslation#1{\gettranslationA#1;;\endget}
\def\gettranslationA#1;#2;{\removesep#2;}
\def\removesep#1;#2\endget{#1}
\newcommand{\trace}{\raisebox{0.2ex}{\_}\rule{0cm}{0.7em}}
\begin{document}
\begin{forest}
sn edges
[NP
[Det [eine;a] ]
[N$'$
[A [kluge;smart] ]
[N$'$
[N [\trace ] ] ] ] ]
\end{forest}
\end{document}
\end{forest}
Gibt es eine Möglichkeit, solche Befehle in übersetzten Bäumen zuzulassen?
Antwort1
Im Folgenden habe ich einen Trick verwendet, der im großen Beispiel im Forest-Handbuch (Abschnitt 4.2) gezeigt wird, um den Inhalt des Knotens zu analysieren. Dann wird (i) direkt unter dem Text ein zusätzlicher Knoten erstellt und mit der Übersetzung gefüllt (also mit allem, was \\
im Originalinhalt danach kommt) und (ii) die Übersetzung wird aus dem Inhalt gelöscht. (Dieser Analysemechanismus ist so eingestellt, dass er auf alle Blätter des Baums angewendet wird.)
Außerdem ist tikz
's für die Text- und Übersetzungsknoten inner xsep
auf gesetzt , sodass die Dreiecke eng am Text anliegen.0
Bearbeiten: Der Code wurde geändert, um Knoten ohne Übersetzungen zu akzeptieren. Dies konnte ich jedoch nur mit einem einfacheren Trennzeichen tun; unten ;
wird verwendet.
Zweite Bearbeitung: .expanded
Handler in den Stilen append translation
und content
wurden durch eine Kette von .expand once
und ersetzt, .expand twice
um das zusätzliche Problem zu lösen, das durch entsteht \trace
(siehe bearbeitete Frage des OP).
\documentclass{minimal}
\usepackage{forest}
\forestset{
with translation/.style={
l sep=0,inner xsep=0,
append translation/.expand once/.expand twice/.wrap pgfmath arg={\gettranslation{##1}}{content},
content/.expand once/.expand twice/.wrap pgfmath arg={\gettext{##1}}{content},
},
append translation/.style={append={[#1,no edge,l=0,inner xsep=0,inner ysep=0,outer ysep=0,before
computing xy={l-=2pt}]}},
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=top},
if n children=0{tier=word,delay=with translation}{} %,delay=with translation
}
}
\def\gettext#1{\gettextA#1;;\endget}
\def\gettextA#1;#2;{\removesep#1;}
\def\gettranslation#1{\gettranslationA#1;;\endget}
\def\gettranslationA#1;#2;{\removesep#2;}
\def\removesep#1;#2\endget{#1}
\newcommand{\trace}{\raisebox{0.2ex}{\_}\rule{0cm}{0.7em}}
\begin{document}
\begin{forest}
sn edges,
[NP
[Det [das] ]
[N'
[N'
[N [Bild;picture] ]
[PP [vom Gleimtunnel;of.the Gleimtunnel,triangle]] ] ]
[PP [im Gropiusbau;in.the Gropiusbau,triangle ] ] ] ]
\end{forest}
\begin{forest}
sn edges
[NP
[Det [eine;a] ]
[N$'$
[A [kluge;smart] ]
[N$'$
[N [\trace ] ] ] ] ]
\end{forest}
\end{document}
Dritte Bearbeitung: where n children=0
innerhalb der Definition von sn edges
in das logisch korrektere geändert if n children=0
. Während dies in der aktuellen (v1.0.10) Version des Pakets keinen Unterschied macht (außer dass es langsamer läuft), where n children
erzeugt die Version in der (bevorstehenden) v1.1 des Pakets ein falsches Ergebnis. Das liegt daran, dass v1.1 einen Fehler mit behebt delay
. In v1.0.x delay
wurde der erste Aufruf vergessen, wenn es mehr als einmal auf einem einzelnen Knoten verwendet wurde. Die falsche Version des obigen Codes funktioniert daher in v1.0.x, obwohl delay=with translation
mehr als einmal aufgerufen wird. In v1.1, wo delay=with translation
dreimaliges Aufrufen tatsächlich with translation
(später) dreimal aufruft, führt dies zu überflüssigen leeren Knoten.
Antwort2
Eine Möglichkeit:
\documentclass{article}
\usepackage{forest}
\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word,inner xsep=0pt,outer sep=0pt}{}}},
background tree/.style={for tree={text opacity=0.2,draw opacity=0.2,edge={draw opacity=0.2}}}
}
\newcommand\HideWd[1]{%
\makebox[0pt]{#1}%
}
\begin{document}
The default behaviour:\par
\begin{forest}
sn edges,
[NP
[Det [das\\the] ]
[N',s sep=20pt
[N',s sep=15pt
[N [Bild\\picture] ]
[PP [vom Gleimtunnel\\ of.the Gleimtunnel,triangle ] ] ]
[PP [im Gropiusbau\\ in.the Gropiusbau,triangle ] ] ] ]
\end{forest}
Hiding the wider text:\par
\begin{forest}
sn edges,
[NP
[Det [das\\the] ]
[N'
[N'
[N [Bild\\picture] ]
[PP [vom Gleimtunnel\\ \HideWd{of.the Gleimtunnel},triangle ] ] ]
[PP [im Gropiusbau\\ \HideWd{in.the Gropiusbau},triangle ] ] ] ]
\end{forest}
Hiding the wider text and correcting the separation:\par
\begin{forest}
sn edges,
[NP
[Det [das\\the] ]
[N',s sep=20pt
[N',s sep=15pt
[N [Bild\\picture] ]
[PP [vom Gleimtunnel\\ \HideWd{of.the Gleimtunnel},triangle ] ] ]
[PP [im Gropiusbau\\ \HideWd{in.the Gropiusbau},triangle ] ] ] ]
\end{forest}
\end{document}
Die Idee besteht darin, ein Feld mit einer Breite von 0 pt zu verwenden, um den breiteren Text zu „verbergen“ (das macht der \HideWd
Befehl). Dies hat jedoch einen unerwünschten Effekt bei der Berechnung der Distanz zwischen den betroffenen Geschwistern (siehe zweiter Baum im Bild), sodass ein manueller Eingriff erforderlich ist, um einige geeignete Werte bereitzustellen s sep
(siehe die dritten drei im Bild).
Antwort3
Dies ist eine Antwort auf die bearbeitete Frage zum Problem der Kombination des inSašo Živanovićs Antwortmithilfe eines benutzerdefinierten Makros.
Der Trick besteht darin, die Verwendung von \trace
im Baum durch einen neuen Stil zu ersetzen, trace
der das Makro ausführt und die Anwendung von with translation
auf Knoten mit 0 untergeordneten Elementen überschreibt.
\documentclass[tikz, border=5pt]{standalone}
\usepackage{forest}
\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=top}, for tree={where n children=0{tier=word, delay=with translation}{}}},
trace/.style={
replace by={[\trace, delay={}, tier=word]}
},
with translation/.style={
l sep=0,
inner xsep=0,
append translation/.expanded/.wrap pgfmath arg={\gettranslation{##1}}{content},
content/.expanded/.wrap pgfmath arg={\gettext{##1}}{content},
},
append translation/.style={
append={
[
#1,
no edge,
l=0,
inner xsep=0,
inner ysep=0,
outer ysep=0,
before computing xy={
l-=2pt
}
]
},
},
}
\def\gettext#1{\gettextA#1;;\endget}
\def\gettextA#1;#2;{\removesep#1;}
\def\gettranslation#1{\gettranslationA#1;;\endget}
\def\gettranslationA#1;#2;{\removesep#2;}
\def\removesep#1;#2\endget{#1}
\newcommand{\trace}{\raisebox{0.2ex}{\_}\rule{0cm}{0.7em}}
\begin{document}
\begin{forest}
sn edges
[NP
[Det [eine;a] ]
[N$'$
[A [kluge;smart] ]
[N$'$
[N [, trace ] ] ] ] ]
\end{forest}
\end{document}