带有水平线的倒置语法树

带有水平线的倒置语法树

我知道可以使用 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而不是bussproofssemantics。此外,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改进充其量只是微不足道的,而结果在其他方面甚至离目标更远。

我的结论是bussproofssemanticprftree都不适合排版这种树。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}

<code>prftree</code> 证明

相关内容