Floresta: Criar nó fantasma que não ocupa espaço?

Floresta: Criar nó fantasma que não ocupa espaço?

Quero criar um nó fantasma que não ocupe espaço no topo da árvore, para fins de alinhamento, de modo que o primeiro nó rotulado da árvore se alinhe com o número do exemplo. Obviamente, a configuração l sep=0ptnão é suficiente. O que mais preciso definir para conseguir isso?

MWE:

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{expex}

\begin{document}

\ex\begin{forest}
[, phantom
    [{Jane is ...}, tier=words]
    [AjP
        [Specifier
            [very, tier=words]
        ]
        [Aj'
            [Aj
                [fond, tier=words]
            ]
            [PP
                [{of Cheetah}, roof, tier=words]
            ]
        ]
    ]
]
\end{forest}\xe

\end{document}

Árvore com nó superior vazio ocupando espaço indesejado

Responder1

Não consigo reproduzir seu problema com a versão atual do forest. Mas com a versão atual, você pode adicionar baselinequalquer nó para torná-lo a linha de base da árvore.

(Comentário linguístico não relacionado: "especificador" é o nome de uma posição sintática, não uma categoria sintática ou nó na árvore, e geralmente nunca deve aparecer na árvore.)

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{expex}

\begin{document}

\ex
\begin{forest}
[,phantom,
    [{Jane is ...}, tier=words]
    [AjP,baseline
        [Specifier
            [very, tier=words]
        ]
        [Aj'
            [Aj
                [fond, tier=words]
            ]
            [PP
                [{of Cheetah}, roof, tier=words]
            ]
        ]
    ]
]
\end{forest}
\xe

\end{document}

saída de código

Responder2

Você realmente não precisa de uma phantomraiz aqui. Você só precisa remover a aresta do primeiro filho e especificar o alinhamento da raiz.

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{expex}

\begin{document}

\ex
\begin{forest}
  where n children=0{tier=words}{}
  [AjP, calign child=2
    [Jane is \dots, no edge]
      [Specifier
          [very]
      ]
      [Aj'
          [Aj
              [fond]
          ]
          [PP
              [of Cheetah, roof]
          ]
      ]
  ]
\end{forest}
\xe

\end{document}

alinhamento sem fantasma

Responder3

Antes da v2.0.3, Forest definiria o nó da linha de base (o nó cuja âncora será alinhada à linha de base) sempre que a baselinechave fosse usada, mesmo que fosse usada em um phantomnó que não fosse desenhado pelo TikZ. Seria de se esperar que isso resultasse em um erro TikZ, mas isso não aconteceu.

Depois que um nó é criado no TikZ, seu nome persiste mesmo fora do grupo (acho que isso pode ser considerado um bug), com o "nó" posicionado em (0,0), como aqui:

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \node(foo){};
\end{tikzpicture}

\begin{tikzpicture}
  \draw[->] (-1,1) -- (foo.center) -- (1,1);
\end{tikzpicture}

\end{document}

O bug do nome do nó persistente TikZ

Combine o que foi dito acima com o fato de que Forest reutiliza nomes de nós (a raiz geralmente é nomeada node@2por padrão) e você terá o problema. Se você definir o nó da linha de base como root (como faz a biblioteca linguística) e tornar a raiz fantasma (como é comumente feito para compor árvores lado a lado), o TikZ efetivamente definirá a linha de base como y=0. O resultado é mostrado pelo exemplo de OPs.

Agora, o Forest 2.0.3 (onde o problema introduzido por draw tree methodfoi corrigido) ficou esperto e parou de instruir o TikZ a definir o nó de linha de base para nós fantasmas (mais precisamente, qualquer nó que não seja desenhado). Assim, a partir desta versão, a linha de base não está mais definida para árvores linguísticas lado a lado. O resultado, conforme prometido pelo manual do TikZ, é que “a extremidade inferior da imagem é colocada na linha de base do texto ao redor”, como no exemplo a seguir. (Os nós são drawn para ver melhor o alinhamento.)

\documentclass{article}

\usepackage[linguistics]{forest}
\usepackage{gb4e}

\begin{document}
\begin{exe}
\ex\begin{forest}
  for tree=draw
  [,phantom
    [VP[V][DP]]
    [VP[V][DP]]
  ]
\end{forest}
\end{exe}
\end{document}

Isto é o que obtemos ao compilar o código acima com Forest v2.0.3 - v2.1.4.

compilado por v2.0.3 - 2.1.4

Para ser absolutamente claro: considero este o comportamento esperado. Contudo, isso não significa que seja odesejadocomportamento ... e é por isso que a biblioteca linguística da v2.1.5 tenta ser mais inteligente: grosso modo, ela define a linha de base para o "primeiro nó não fantasma". No nosso exemplo, esse é o VP esquerdo, então obtemos:

compilado por 2.1.5

(Observação temporária: Forest 2.1.5 já foi submetido ao CTAN e também está disponível emGitHub.)

Agora, é certo que, no exemplo do OP, tudo isso não ajuda em nada, já que "o primeiro nó não fantasma" resolve para Jane is .... O novo padrão de linha de base em linguística funciona para o caso comum de árvores lado a lado; para qualquer coisa fora do comum, basta configurar baselinemanualmente, conforme recomendado emA resposta de Alan.

informação relacionada