我知道可以使用 TikZ 在 Latex 中进行语法分析,但生成的树结构在我国并不常用。在这里,我们主要使用直线而不是层次树。
这是我想要实现的一个示例。我不知道从哪里开始。
有没有(或多或少)简单的方法可以做到这一点?有什么想法吗?
编辑:
尽管到目前为止提供的所有解决方案都是正确的,但最好修改您所提出的不同图表的以下特征:
这句话正在被分析(“La novela que me ha regalado mi hermana...”)应该位于图形上方并且所有单词必须在同一行;“la”不能紧挨着“Det”上方,“está”也不能紧挨着“N/V”上方。
所有语法功能不同的词(“OP”、“S/SN”、“PN/SV”、“Det”……)应该与它们上方的相应线条居中(或者至少靠近中心,但无需手动更改间距)。
应该可以修改图表的高度。
答案1
这是一个使用优秀解决方案forest
包裹。
\documentclass[tikz,border=5pt]{standalone}
\usepackage{forest}
% Node shape adapted from http://www.texample.net/tikz/examples/data-flow-diagram/
\makeatletter \pgfdeclareshape{myunderline}{
\inheritsavedanchors[from=rectangle]
\inheritanchorborder[from=rectangle]
\foreach \from in
{center,base,north,north east,east,south east,south,south west,west,north west}{
\inheritanchor[from=rectangle]{\from}
}
\backgroundpath{
\southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
\northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
% This can be improved by removing magic numbers
\pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya+1.75em}}
\pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya+1.75em}}
}
} \makeatother
\begin{document}
\begin{forest}
for tree={
fit=band, % Isolates space above this node from siblings’ descendants
no edge,
% Uncomment the line below for the dotted edges
% edge={dotted, semithick, gray!50, shorten <=8pt}, parent anchor=north,
% This can be improved by reducing space between levels where edges are drawn
inner sep=0pt, outer sep=0pt,
l sep=0pt, s sep=6pt, text depth=0.5em, grow'=north,
where level=0{} % No style for dummy root node
{where n children=0
{font=\bfseries,tier=word} % Leaves in bold on the same tier
{font=\small,tikz={\node[draw, thick, myunderline, fit to=tree] {};}} % Non-leaves
}
}
% This can be improved by removing the need for a parent and sibling of the actual root
[,phantom[,phantom][OP
[S/SN
[Det [La] ]
[N/Sust [novela] ]
[CN/SAdj/Prop Sub Adj
[PV/SV,
[\textit{nexo} [que] ]
[CI/SN [me] ]
[N/V [ha regalado] ]
]
[S/SN
[Det [mi] ]
[N [hermana] ]
]
]
]
[PN/SV
[N/V [est\'a] ]
[Attrib/SAdj
[N [ambientada] ]
]
[CCL/SPrep
[E [en] ]
[T/SN
[N [Australia\rlap.] ]
]
]
]
]]
\end{forest}
\end{document}
这是另一个带有模糊虚线边缘的版本:
只需更改选项即可以更常规的外观呈现相同的结构:
for tree={
edge={dotted, semithick, gray!80, shorten <=1pt,shorten >=3pt},
parent anchor=south, child anchor=north,
inner sep=0pt, outer ysep=2pt,
text depth=0.5em,
where n children=0{font=\bfseries,tier=word}{font=\small}
}
因此,您可以看到为什么人们更喜欢使用forest
而不是bussproofs
或semantics
。此外,forest
树语法要简单得多,并且不像在cfr 的答案。
查看forest
手册以了解更多样式选项。
2019 编辑:
fit to tree
选项语法已修改为fit to=tree
2020 年编辑:l
随着l=1.5em
垂直间距的变化而变化
答案2
例如:
\documentclass{standalone}
\usepackage[inference]{semantic}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
\setpremisesend{0pt}
\setpremisesspace{1pt}
\setnamespace{0pt}
\inference{%
\inference{%
\inference{\mbox{La}}{Det}
&
\inference{\mbox{novela}}{N/Sust}
&
\inference{%
\inference{%
\inference{\mbox{que}}{nexo}
&
\inference{\mbox{me}}{CI/SN}
&
\inference{\mbox{ha regalado}}{N/V}
}
{PV/SV}
&
\inference{%
\inference{\mbox{mi}}{Det}
&
\inference{\mbox{hermana}}{N}
}
{S/SN}
}
{CN/SAdj/Prop. Sub. Adj}
}
{S/SN}
&
\inference{%
\inference{\mbox{está}}{N/V}
&
\inference{%
\inference{\mbox{ambientada}}{N}
}
{Attrib/SAdj}
&
\inference{%
\inference{\mbox{en}}{E}
&
\inference{%
\inference{\mbox{Australia}}{N}
}
{T/SN}
}
{CCL/SPrep}
}
{PN/SV}
}
{OP}
\end{document}
答案3
这是另一种方法...基于我的回答通过堆叠彩色下划线突出显示文本
\documentclass{article}
\usepackage{stackengine}
\newlength\tmpln
\newlength\lunderset
\newlength\rulethick
\lunderset=1\baselineskip\relax
\rulethick=.8pt\relax
\def\stackalignment{l}
\newcommand\nunderline[3][1]{\setbox0=\hbox{#2}\tmpln=\wd0%
\stackunder[#1\lunderset-\rulethick]{\strut#2}{%
\smash{\raisebox{-.6\baselineskip}{\makebox[0pt][l]{\scriptsize #3}}}%
\rule{\tmpln}{\rulethick}}}%
\let\Nun\nunderline
\let\HS\hspace
\begin{document}
\Nun{\Nun{\Nun[3]{La}{Det}}{}}{}%
\Nun{\Nun[4]{ }{}}{}%
\Nun{\Nun{\Nun[3]{novela}{N/Sust}}{}}{}%
\Nun{\Nun[4]{ }{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {que}{\itshape nexo}}{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun[2]{ }{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {me}{CI/SN}}{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun[2]{ }{PV/SV}}{CN/SAdj/Prop. Sub. Adj}}{S/SN}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {ha}{}}{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun { }{}}{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {regalado}{N/V}}{}}{}}{}}{}%
\Nun{\Nun{\Nun[3]{ }{}}{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {mi}{Det}}{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun[2]{ }{}}{}}{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {hermana}{\HS{5ex}N}}{S/SN}}{}}{}}{OP}%
\Nun[5]{ }{}%
\Nun{\Nun{\Nun[3]{est\'a}{N/V}}{}}{}%
\Nun{\Nun[4]{ }{}}{}%
\Nun{\Nun{\Nun{\Nun[2]{ambientada}{\HS{7ex}N}}{Attrib/SAdj}}{\HS{7ex}PN/SV}}{}%
\Nun{\Nun[4]{ }{}}{}%
\Nun{\Nun{\Nun{\Nun[2]{en}{E}}{\HS{4ex}CCL/SPrep}}{}}{}%
\Nun{\Nun{\Nun[3]{ }{}}{}}{}%
\Nun{\Nun{\Nun{\Nun{\Nun {Australia}{\HS{6ex}N}}{\HS{3ex}T/SN}}{}}{}}{}%
\end{document}
答案4
为了完整性,并部分回应评论中查询在我的其他答案,这是带有 的树集prftree
。可以看出,这并不比 更适合排版这种树semantic
。但是,如果有人想为逻辑排版这种自然演绎证明,它看起来是一个非常好的包,具有许多便捷命令、灵活的自定义和良好的语法。这里的树非常冗长,因为没有一个便捷命令是合适的:这绝对是一个用于符号逻辑的包。结果在某些方面比 更接近目标树,但semantic
改进充其量只是微不足道的,而结果在其他方面甚至离目标更远。
我的结论是bussproofs
,semantic
和prftree
都不适合排版这种树。forest
相对于问题的需求,和解决方案stackengine
肯定更胜一筹。
然而,为了逻辑,这些包比这里提供的其他解决方案更出色。它们就是为此目的而设计的,可以更轻松地生成树,而且麻烦更少。prftree
看起来特别好,尽管这是我第一次使用它。对齐和间距设计为开箱即用,符合逻辑,并prftree
允许您使用标准推理规则指定树,这使其更具可读性、更简洁、更直观。因此,我上面的结论并不是对这些软件包的批评。它们只是不是为这种树设计的。
\documentclass[landscape]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{prftree,geometry,mathtools}
\begin{document}
\[
\prftree{%
\prftree{%
\prftree{\text{La}}{Det}
}{%
\prftree{\text{novela}}{N/Sust}
}{%
\prftree{%
\prftree{%
\prftree{\text{que}}{nexo}
}{%
\prftree{\text{me}}{CI/SN}
}{%
\prftree{\text{ha regalado}}{N/V}
}
{PV/SV}
}{%
\prftree{%
\prftree{\text{mi}}{Det}
}{%
\prftree{\text{hermana}}{N}
}{S/SN}
}
{CN/SAdj/Prop. Sub. Adj}
}
{S/SN}
}{
\prftree{%
\prftree{\text{está}}{N/V}
}{%
\prftree{%
\prftree{\text{ambientada}}{N}
}
{Attrib/SAdj}
}{%
\prftree{%
\prftree{\text{en}}{E}
}{%
\prftree{%
\prftree{\text{Australia}}{N}
}
{T/SN}
}
{CCL/SPrep}
}
{PN/SV}
}
{OP}
\]
\end{document}