Пакет Forest: Как использовать \forestset в преамбуле?

Пакет Forest: Как использовать \forestset в преамбуле?

Я пытаюсь автоматизировать макет для определенных деревьев, которые я хочу использовать повторно, но, похоже, мне не удается заставить команду \forestsetработать в преамбуле. В кодах ниже я предполагаю, что закомментированная часть файла в основном документе должна быть ненужной, как только эта информация будет передана в преамбулу. Но в текущем виде информация преамбулы не может изменить макет по умолчанию результирующего дерева. (Обратите внимание, что это также не приводит к ошибке компиляции.)

\documentclass[10pt,oneside,pdftex,dvipsnames,a4paper]{article}
\usepackage{forest}
\forestset{ 
  sn edges/.style={
  for tree={
    grow'=0, 
    l=0pt, inner sep=0.075cm, s sep=0.1mm,
    child anchor=west,parent anchor=south,
    anchor=west,calign=first,
    edge path={
      \noexpand\path [draw, \forestoption{edge}]
      (!u.south west) +(7.5pt,0) |- node{} (.child anchor)\forestoption{edge label};
    },
    before typesetting nodes={
      if n=1
        {insert before={[,phantom]}}
        {}
    },
    fit=band,
    before computing xy={l=15pt},
  }
 }
}
%-------------------------------------------------------------
\begin{document}
\begin{forest}
  % for tree={
  %   grow'=0, 
  %   l=0pt, inner sep=0.075cm, s sep=0.1mm,
  %   child anchor=west,parent anchor=south,
  %   anchor=west,calign=first,
  %   edge path={
  %     \noexpand\path [draw, \forestoption{edge}]
  %     (!u.south west) +(7.5pt,0) |- node{} (.child anchor)\forestoption{edge label};
  %   },
  %   before typesetting nodes={
  %     if n=1
  %       {insert before={[,phantom]}}
  %       {}
  %   },
  %   fit=band,
  %   before computing xy={l=15pt},
  % }
[$B$
  [$B_{1}$]
  [$B_{2}$
    [$A$
      [$A_{1}$,tikz={\node [draw,inner sep=0.5pt,fit to=tree]{};}]
      [$A_{2}$
        [$D$]
        [$E$]
      ]
      [$A_{3}$
      ]
    ]
  ]
]
\end{forest}
\end{document}

решение1

Вы определяете стиль sn edgesв преамбуле, но не говорите, что хотите, чтобы ваше дерево его использовало. Для этого вам следует указать имя стиля как ключ в вашем дереве.

МВЭ:

\documentclass{article}
\usepackage{forest}
\forestset{ 
  sn edges/.style={
  for tree={
    grow'=0, 
    l=0pt, inner sep=0.075cm, s sep=0.1mm,
    child anchor=west,parent anchor=south,
    anchor=west,calign=first,
    edge path={
      \noexpand\path [draw, \forestoption{edge}]
      (!u.south west) +(7.5pt,0) |- node{} (.child anchor)\forestoption{edge label};
    },
    before typesetting nodes={
      if n=1
        {insert before={[,phantom]}}
        {}
    },
    fit=band,
    before computing xy={l=15pt},
  }
 }
}
%-------------------------------------------------------------
\begin{document}
\begin{forest}
sn edges,
[$B$
  [$B_{1}$]
  [$B_{2}$
    [$A$
      [$A_{1}$,tikz={\node [draw,inner sep=0.5pt,fit to=tree]{};}]
      [$A_{2}$
        [$D$]
        [$E$]
      ]
      [$A_{3}$
      ]
    ]
  ]
]
\end{forest}
\end{document}

Результат:

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

Альтернативой является не создание нового стиля, а автоматическое применение заданного стиля ко всем деревьям с помощью ключа default preambleв \forestset. В этом случае вам не нужно указывать ключ стиля для отдельных деревьев.

\documentclass{article}
\usepackage{forest}
\forestset{ 
  default preamble={
  for tree={
    grow'=0, 
    l=0pt, inner sep=0.075cm, s sep=0.1mm,
    child anchor=west,parent anchor=south,
    anchor=west,calign=first,
    edge path={
      \noexpand\path [draw, \forestoption{edge}]
      (!u.south west) +(7.5pt,0) |- node{} (.child anchor)\forestoption{edge label};
    },
    before typesetting nodes={
      if n=1
        {insert before={[,phantom]}}
        {}
    },
    fit=band,
    before computing xy={l=15pt},
  }
 }
}
%-------------------------------------------------------------
\begin{document}
\begin{forest}
[$B$
  [$B_{1}$]
  [$B_{2}$
    [$A$
      [$A_{1}$,tikz={\node [draw,inner sep=0.5pt,fit to=tree]{};}]
      [$A_{2}$
        [$D$]
        [$E$]
      ]
      [$A_{3}$
      ]
    ]
  ]
]
\end{forest}
\end{document}

решение2

В \forestsetвам нужно определить стиль, имя которого рассматривается в forestсреде. Смотрите MWE ниже:

\documentclass[a4paper]{article}
\usepackage{forest}
\forestset{my tree/.style = {% NEW
    for tree={
        inner sep=0.075cm, 
        l sep=1mm,% CHANGED AND CORRECTED
        s sep=1mm,% changed
        grow'=0,
        child anchor=west,parent anchor=south,
        anchor=west,calign=first,
        edge path={
          \noexpand\path [draw, \forestoption{edge}]
          (!u.south west) +(7.5pt,0) |- node{} (.child anchor)\forestoption{edge label};
        },
        before typesetting nodes={
          if n=1
            {insert before={[,phantom]}}
            {}
        },
        fit=band,
        before computing xy={l=15pt},
            }% end of for tree
                        }% end of my tree style
        }% end of forestset
%-------------------------------------------------------------
\begin{document}
\begin{forest} my tree
 [$B$
  [$B_{1}$]
  [$B_{2}$
    [$A$
      [$A_{1}$,tikz={\node [draw,inner sep=0.5pt,fit to=tree]{};}]
      [$A_{2}$
        [$D$]
        [$E$]
      ]
      [$A_{3}$
      ]
    ]
  ]
]
\end{forest}
\end{document}

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

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