编辑

编辑

当涉及到语法时,有些事情我不明白minipage。在下面的例子中(这是我的真实情况,而不是 MWE),为什么我不能通过三个小页面“X”+“或”+“Y”来获得“X 或 Y”显示,{0.33\linewidth}每个小页面都有?

我已尝试了十几个版本(更改宽度参数,使用两个而不是三个小页面,并在它们之间使用“或”等),但我从未获得这个“X 或 Y”的良好显示。

\documentclass{beamer}
\usepackage{forest}
\newcommand*{\phonfeat}[1]{
    \ensuremath{%
        \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\begin{document}
\begin{frame}
    \begin{minipage}{0.33\linewidth}
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [\phonfeat{+syllabic\\ $-$high\\ +low\\ \dots}
            [\phonfeat{+highpitch\\ $-$lowpitch}]
            [\phonfeat{$-$highpitch\\ +lowpitch}]
        ]
    \end{forest}
    \end{minipage}
    \begin{minipage}[t]{0.33\linewidth}
    or
    \end{minipage}
    \begin{minipage}[t]{0.33\linewidth}
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [a
            [H]
            [L]
        ]
    \end{forest}
    \end{minipage}

\end{frame}
\end{document}

在此处输入图片描述


编辑 这是一个例子自音节音系学。我试图复制最初介绍该理论的论文中对自音节音系学的第一个说明(John Goldsmith。1976。自音节音系学概述。语言分析 2,23-68):

在此处输入图片描述

答案1

此解决方案采用了另一种方法。它抛弃了minipages 和\phonfeat。(如果您确实想这样做,请使用 Forest 的align选项并包装节点以添加分隔符。)

相反,我使用一些我编写的样式来回答有关avm包的问题。这些样式将avm环境包装在 Forest 样式中。

为了实现垂直间距,我修改begin draw为使用 TiZ 的baseline选项。然后我将其包装在里面,linguistics centre根据linguistics默认值设置默认前导,但没有选项baseline,但有居中。这意味着我们sn edges开箱即用,无需手动设置锚点等。

您可以轻松地以通常的方式在全局或局部范围内应用linguisticslinguistics centre默认值。(我认为您可能需要某些幻灯片的标准默认值和其他幻灯片的居中 - 因此需要样式而不是全局声明default preamble。)

linguistics[如果提供一个不设置的选项就好了baseline,因为我认为在 Beamer 演示中,垂直居中树木并不是一种不常见的要求。但也许我错了。]

水平间距只有几个\hfill秒,因此我们不需要担心事物的宽度。

% gweler hefyd: ateb: http://tex.stackexchange.com/a/353744/ addaswy o gwestiwn J. Bratt: http://tex.stackexchange.com/q/352874/
% gweler hefyd: forest2-1-avm-avm-only.tex forest-2-1-avm-ss-avm.tex, forest2-avm-spacing.tex
\documentclass{beamer}
\usepackage{forest}
\useforestlibrary{linguistics}
\usepackage{avm,array}
\forestset{%
  avm only/.style={%
    TeX={\setlength\extrarowheight{-10pt}},
    before typesetting nodes={%
      for tree={%
        make pure avm,
      },
    },
  },
  make pure avm/.style={%
    content/.wrap value={%
      \begin{avm}##1\end{avm}
    },
    plain content,
  },
  linguistics centre/.style={% based on linguistics defaults: baseline is removed & begin draw is added
    default preamble={
     sn edges,
     for tree={align=center},
     begin draw/.code={\begin{tikzpicture}[baseline=(current bounding box.center)]},
    },
  },
  linguistics centre,
}
\begin{document}
\begin{frame}
  \hfill
  \begin{forest}
    avm only,
    linguistics centre,
    [\[+syllabic\\$-$high\\+low\\\dots\]
      [\[+highpitch\\$-$lowpitch\]]
      [\[$-$highpitch\\+lowpitch\]]
    ]
  \end{forest}%
  \hfill
  or\hfill
  \begin{forest}
    linguistics centre,
    [a
      [H]
      [L]
    ]
  \end{forest}%
  \hfill\hskip0pt%
\end{frame}
\end{document}

中心树

如果您需要子脚本等,请参阅代码中提到的链接,了解实现此功能的avmmake avm样式。

编辑

正如我在评论中所说,linguistics centre完全独立于avm only。上面的代码对第二棵树使用前者,对第一棵树使用两者。因此,前者可用于管理垂直对齐,而无需更改树的任何内容。

与森林的垂直对齐

两张幻灯片都使用\phonfeat:一张直接使用;一张间接使用。

正如我之前提到的,如果你使用\phonfeat,请注意它会在内容前引入一个空格。如果你不总是想要那里有一个空格,显然你应该从宏定义中删除那个空格。

虚假空间

第一行使用没有空格的定义;第二行使用有空格的原始定义。

\documentclass{beamer}
\usepackage{forest}
\useforestlibrary{linguistics}
\newcommand*{\phonfeat}[1]{%
  \ensuremath{%
    \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\newcommand*{\phonfeatorig}[1]{
  \ensuremath{%
    \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\forestset{%
  linguistics centre/.style={% based on linguistics defaults: baseline is removed & begin draw is added
    default preamble={
     sn edges,
     for tree={align=center},
     begin draw/.code={\begin{tikzpicture}[baseline=(current bounding box.center)]},
    },
  },
  linguistics centre,
  phonfeat/.style={%
    linguistics centre,
    delay={%
      for tree={%
        content/.wrap value=\phonfeat{##1},
      },
    },
  },
}
\begin{document}
\begin{frame}
  Note the difference:

  \phonfeat{a\\b}\phonfeat{c\\d}

  \phonfeatorig{a\\b}\phonfeatorig{c\\d}
\end{frame}
\begin{frame}
  \hfill
  \begin{forest}
    linguistics centre,
    [\phonfeat{+syllabic\\$-$high\\+low\\\dots}
      [\phonfeat{+highpitch\\$-$lowpitch}]
      [\phonfeat{$-$highpitch\\+lowpitch}]
    ]
  \end{forest}%
  \hfill
  or\hfill
  \begin{forest}
    linguistics centre,
    [a
      [H]
      [L]
    ]
  \end{forest}%
  \hfill\hskip0pt%
\end{frame}
\begin{frame}
  \hfill
  \begin{forest}
    phonfeat,
    [+syllabic\\$-$high\\+low\\\dots
      [+highpitch\\$-$lowpitch]
      [$-$highpitch\\+lowpitch]
    ]
  \end{forest}%
  \hfill
  or\hfill
  \begin{forest}
    linguistics centre,
    [a
      [H]
      [L]
    ]
  \end{forest}%
  \hfill\hskip0pt%
\end{frame}
\end{document}

答案2

最后一次编辑没有更改字体(建议):

\documentclass[10pt]{beamer}
\usepackage{forest}
\newcommand*{\phonfeat}[1]{
    \ensuremath{%
        \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\begin{document}
\begin{frame}
    \noindent\begin{minipage}{0.33\linewidth}
    \begin{forest} for tree = {parent anchor = south, child anchor = north, l sep=2em}
        [\phonfeat{+syllabic\\ $-$high\\ +low\\ \dots}
            [\phonfeat{+highpitch\\ $-$lowpitch}]
            [\phonfeat{$-$highpitch\\ +lowpitch}]
        ]
    \end{forest}
    \end{minipage}%
    \begin{minipage}{0.33\linewidth}
    \begin{center}
    or
    \end{center}
    \end{minipage}%
    \begin{minipage}{0.33\linewidth}
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [a
            [H]
            [L]
        ]
    \end{forest}
    \end{minipage}
\end{frame}
\end{document}

第一个答案(为什么)

尝试这个:

\documentclass{beamer}
\usepackage{forest}
\newcommand*{\phonfeat}[1]{
    \ensuremath{%
        \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\begin{document}
\begin{frame}
    \fbox{\begin{minipage}{0.46\textwidth}
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [\phonfeat{+syllabic\\ $-$high\\ +low\\ \dots}
            [\phonfeat{+highpitch\\ $-$lowpitch}]
            [\phonfeat{$-$highpitch\\ +lowpitch}]
        ]
    \end{forest}
    \end{minipage}
    }
    \fbox{\begin{minipage}{0.18\textwidth}
    \begin{center}
    or
    \end{center}
    \end{minipage}}
    \fbox{
    \begin{minipage}{0.2\textwidth}
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [a
            [H]
            [L]
        ]
    \end{forest}
    \end{minipage}}

\end{frame}
\end{document}

输出:

在此处输入图片描述

\fbox 显示你的森林从第一个小页面开始就溢出了,所以我手动更改了小页面的长度。

...\fbox解决了很多问题:P

编辑(通过改变字体大小解决):

但我还发现了其他一些事情:

下面的代码:

\documentclass[10pt]{beamer}
\usepackage{forest}
\newcommand*{\phonfeat}[1]{
    \ensuremath{%
        \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\begin{document}
\begin{frame}
    \noindent\begin{minipage}{0.33\linewidth}
    \scriptsize
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [\phonfeat{+syllabic\\ $-$high\\ +low\\ \dots}
            [\phonfeat{+highpitch\\ $-$lowpitch}]
            [\phonfeat{$-$highpitch\\ +lowpitch}]
        ]
    \end{forest}
    \end{minipage}\hfill
    \begin{minipage}{0.33\linewidth}
    \scriptsize
    \begin{center}
    or
    \end{center}
    \end{minipage}\hfill
    \begin{minipage}{0.33\linewidth}
    \scriptsize
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [a
            [H]
            [L]
        ]
    \end{forest}
    \end{minipage}
\end{frame}
\end{document}

工作正常。但是如果你删除 \hfill,它会在最后一行中给出最后一个 minipage(除非你减少 minipage 的长度。它以某种方式连接。但是 minipage 之间的空间(标记)导致了问题。因此,使用代替%\hfill可以正常工作。)

答案3

在此处输入图片描述

您的小页面的宽度不符合其内容的宽度。更简单的解决方案是使用tabular封装单元格内容的环境,adjustbox以便确定单元格内容的垂直位置 - 在顶部(valign=t)还是在中间(`valign=m):

\documentclass{beamer}
\usepackage{forest}
\usepackage{adjustbox}

\newcommand*{\phonfeat}[1]{
    \ensuremath{%
        \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}

\begin{document}
\begin{frame} 
    \centering
    \setlength\tabcolsep{0pt}
    \begin{tabular}{ccc}
    \adjustbox{valign=m}{
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [\phonfeat{+syllabic\\ $-$high\\ +low\\ \dots}
            [\phonfeat{+highpitch\\ $-$lowpitch}]
            [\phonfeat{$-$highpitch\\ +lowpitch}]
        ]
    \end{forest}        }
    &
    \adjustbox{valign=m}{
    or
                        }
    &
    \adjustbox{valign=m}{
    \begin{forest} for tree = {parent anchor = south, child anchor = north}
        [a
            [H]
            [L]
        ]
    \end{forest}        }
    \end{tabular}
\end{frame}
\end{document}

如果希望底部对齐,则adjustbox可以省略使用。

编辑: adjustbox在内容周围添加空间(与 dominipage或类似tabular)。如果觉得这令人不安,您可以通过设置\tabcolsep为(部分)补偿其水平部分0pt,因为现在已添加到上面姆韦

我没有干涉forest树的设计。它可以如何改进,你可以在 nice 中看到成本加运费回答。

答案4

当我在 Beamer 中遇到此类问题时,我总是使用文本位置具有绝对定位的包。经过多次尝试和错误,我认为满足 OP 要求(在同一行上有三个相同宽度且不重叠的框)的代码可以是:

\documentclass{beamer}
\usepackage{forest}
\usepackage[absolute,overlay,showboxes]{textpos} %absolute positioning
\TPGrid[20mm,20mm]{30}{10}
\textblockorigin{0mm}{0mm}
\newcommand*{\phonfeat}[1]{
\ensuremath{%
    \left[\begin{tabular}{@{}l@{}}#1\end{tabular}\right]}}
\begin{document}
\begin{frame}
\begin{textblock}{14.54}(0,5)
%\begin{minipage}{0.33\linewidth}
\begin{forest} for tree = {parent anchor = south, child anchor = north}
    [\phonfeat{+syllabic\\ $-$high\\ +low\\ \dots}
        [\phonfeat{+highpitch\\ $-$lowpitch}]
        [\phonfeat{$-$highpitch\\ +lowpitch}]
    ]
\end{forest}
%\end{minipage}
\end{textblock}
\begin{textblock}{14.54}(14.54,5)
%\begin{minipage}[t]{0.33\linewidth}
or
%\end{minipage}
\end{textblock}
\begin{textblock}{14.54}(29.08,5)
%\begin{minipage}[t]{0.33\linewidth}
\begin{forest} for tree = {parent anchor = south, child anchor = north}
    [a
        [H]
        [L]
    ]
\end{forest}
%\end{minipage}
\end{textblock}
\end{frame}
\end{document}

在我看来,结果不太令人满意。

在此处输入图片描述

相关内容