Пусть покупатель будет бдителен ...

Пусть покупатель будет бдителен ...

Есть ли способ указать, что вы хотите, чтобы дерево растянулось на всю ширину текста? Другими словами, чтобы самый левый узел был выровнен с левым полем, а самый правый — с правым полем, а затем все, что находится между ними, было нарисовано относительно этих точек?

Вот MWE дерева, которое я пытаюсь подогнать;

\documentclass{article}
\usepackage[margin=.75in]{geometry}
\usepackage[linguistics]{forest}

\begin{document}

\begin{center}
\begin{forest}
    [IP$_{<t>}$
        [VP$_{<<e,t>,t>}$
            [NP $_{<<<e,t>,e,t>>,t>}$
                [at least five $_{<<e,t>,<<<e,t>,<e,t>>,t>>}$]
                [NP $_{<e,t>}$
                    [students $_{<<e,t>,<e,t>>}$]
                    [$t_{2_{<e,t>}}$]
                ]
            ]
            [arrived $_{<e,t>}$]
        ]
        [CP$_{<e,t>}$
            [who$_1$]
            [CP$_{<t>}$
                [$t_{1_{<e>}}$]
                [VP $_{<e,t>}$
                    [took $_{<e,<e,t>>}$]
                    [semantics $_{<e>}$]
                ]
            ]
        ]
    ]
\end{forest}
\end{center}

\end{document}

решение1

Я думаю, что я исправил представление основных типов, если я правильно понял. Поскольку я не лингвист и на самом деле не знаю, что это значит, примите это как есть.

Я добавил for tree={draw}иshowframe просто для демонстрационных целей. Поскольку в Okular есть ошибка, которая портит изображения, вам придется либо скомпилировать его, либо представить его, чтобы увидеть демонстрацию, но я тщательно протестировал его на образцендеревья гден= 1. Поскольку это ваше дерево, то в данном случае оно, по крайней мере, работает.

Стиль

widen tree to width=<dimension expression>

принимает один необязательный аргумент. Если не указано, то используется значение по умолчанию, 0ptпоэтому стиль не будет иметь никакого эффекта.

Примечания

  1. Алгоритм пытается быть консервативным. Это означает, что он будет медленным, если вы примените стиль ко многим деревьям. Я рекомендую memoize.

  2. Он не настолько консервативен, что не сломается в экстремальных случаях. Для этих целей «экстремальным случаем» является любой случай, в котором алгоритм терпит неудачу.

  3. Не оставляйте компиляцию без присмотра.Если что-то пойдет не так, это может войти в вечный forestцикл. Я недуматьэто произойдет. Как объяснялось в (1), я тщательно это проверил, но осторожность не помешает.

  4. Я сказал алгоритму остановиться, когда разница между деревом и целью не превысит 1pt.Не меняйте это значение на 0pt.Расчеты TeX'а являются лишь приблизительными. Уменьшение пособия до0pt волязапустить бесконечный цикл.

  5. Никаких допусков для меток, краев или границ узлов не предусмотрено. Если в вашем дереве есть что-либо из этого и они выступают по ширине, вы должны соответствующим образом скорректировать целевую ширину.

  6. Я не рекомендую это по эстетическим или оперативным соображениям. Я не уверен, зачем вам конкретно нужна елка определенной ширины. Но, может быть, мне просто не хватает воображения.

Пусть покупатель будет бдителен ...

\documentclass{article}
\usepackage[margin=.75in,showframe]{geometry}
\usepackage[linguistics]{forest}
\forestset{% ateb: https://tex.stackexchange.com/a/715314/
  declare dimen register=target wd,
  target wd'=0pt,
  declare dimen register=needed wd,
  needed wd'=0pt,
  adjust tree/.style={
    tempcounta'=1,
    tempcountc'=0,
    for tree breadth-first={%
      if={ >OR> {level}{tempcountc} }{
        tempcountc/.option=level,
        tempcountd'=1,
      }{
        tempcountd'+=1,
        if={ >RR> {tempcountd}{tempcounta} }{
          tempcounta/.register=tempcountd,
        }{},
      },
    },
    tempcounta*/.register=tempcountc,
    tempcounta'+=1,
    tempdima/.process={ RRw2+d {needed wd}{tempcounta}{##1/##2} },
    where={>O_<{s}{0pt}}{
      s-/.register=tempdima,
    }{
      s+/.register=tempdima,
    },
    compute xy stage,
    tempdima/.max={>OOw2+d{x}{max x}{##1+##2}}{tree},
    tempdimb/.min={>OOw2+d{x}{min x}{##1+##2}}{tree},
    tempdimc/.register=tempdima,
    tempdimc-/.register=tempdimb,
    needed wd/.register=target wd,
    needed wd-/.register=tempdimc,
    if={ >Rd>{needed wd}{1pt} }
    {% pam alla i ddim ddefnyddio loop yma?
      adjust tree,
    }{},
  },
  widen tree to width/.style={
    target wd=#1,
    needed wd/.register=target wd,
    before drawing tree={
      tempdima/.max={>OOw2+d{x}{max x}{##1+##2}}{tree},
      tempdimb/.min={>OOw2+d{x}{min x}{##1+##2}}{tree},
      tempdimc/.register=tempdima,
      tempdimc-/.register=tempdimb,
      needed wd-/.register=tempdimc,
      if={ >Rd>{needed wd}{1pt} }
      {% pam alla i ddim ddefnyddio loop yma?
        adjust tree,
      }{},
    },
  },
}
\begin{document}

\begin{center}
  \begin{forest}
    widen tree to width=\linewidth,
    for tree={draw},
    [IP$_{t}$ 
      [VP$_{<<e,t>,t>}$
        [NP $_{<<<e,t>,e,t>>,t>}$
          [at least five $_{<<e,t>,<<<e,t>,<e,t>>,t>>}$]
          [NP $_{<e,t>}$
            [students $_{<<e,t>,<e,t>>}$]
            [$t_{2_{<e,t>}}$]
          ]
        ]
        [arrived $_{<e,t>}$]
      ]
      [CP$_{<e,t>}$
        [who$_1$]
        [CP$_{t}$
          [$t_{1_{e}}$]
          [VP $_{<e,t>}$
            [took $_{<e,<e,t>>}$]
            [semantics $_{e}$]
          ]
        ]
      ]
    ]
  \end{forest}
\end{center}

\end{document}

введите описание изображения здесь

Связанный контент