Latex:在Beamer幻灯片中,文本应自动填充框架

4
在 beamer 幻灯片中,我希望内容能够均匀地分布在整个幻灯片上。
使用选项 \documentclass[slidestop]{beamer} 可以轻松地将内容指定为顶部/居中对齐,但当幻灯片上只有几个项目符号时,它们会聚集在顶部,我希望 beamer 自动决定它们之间的间距以使它们均匀分布。
这是否可能,而不需要通过试错来放置 vspace?

你能发一个最小化的例子吗? - Scott Morrison
2个回答

8

我认为使用\vfill可以减少试错的部分。每个项目符号之间加入一个\vfill应该可以保证等距离间隔。尝试在项目符号之前和/或之后使用\vfill以获得与前面的文本或页面底部的分隔。我不使用也不了解Beamer,但我猜想有一种方法可以将\vfill命令放入Beamer模板中。

\documentclass{article}
\begin{document}
\begin{itemize}
\vfill\item This is text of first item
\vfill\item This is text of second item
\vfill\item This is text of third item
\end{itemize}
\end{document}

根据您的评论,这里是一种在主列表项中自动使用vfill但在子项中没有vfill的定义方式。 这种方式允许您使用相同的\item命令,无论您是在主列表还是嵌套列表中,但需要您定义或重新定义环境,并注意何时添加主(即v填充)列表和何时添加非v填充(即嵌套)列表:

\documentclass{article}

\newenvironment{novfillenum}{\begin{enumerate}\let\item\olditem}%
{\end{enumerate}}
\newenvironment{vfilleditems}{\begin{itemize} \let\olditem\item \renewcommand\item{\vfill\olditem}}%
{\end{itemize}}

\begin{document}
\begin{vfilleditems}
\item Item One 
   \begin{novfillenum}
        \item subitem1
        \item s2
        \item s3
    \end{novfillenum}
\item Item Two 
   \begin{novfillenum}
        \item subitem1
        \item s2
        \item s3
    \end{novfillenum}
\item item three
   \begin{novfillenum}
        \item subitem1
        \item s2
        \item s3
    \end{novfillenum}
\end{vfilleditems}

\end{document}

不,这并不能达到目的。我希望间距能够自动决定。我想要避免使用vfill。我希望LaTeX/Beamer能够检测帧的高度并均匀地分布项目符号。 - thequark
@thequark:嗯,我会说它确实有所帮助,因为建议的修复方法比使用\vspace要好得多。事实上,使用\vfill可以检测到框架的高度并自动调整空间以匹配。只需为每个项目使用\vfill\item而不是使用\item即可。这应该可以让您达到90%-99%的目标。您可以定义宏使其更简单,但对我来说\vfill\item似乎非常简单。 - Herbert Sitz
1
@thequark:在上面的帖子中,我添加了一个代码示例,展示了使用项目和子项目完成您所要求的不同方法。 - Herbert Sitz
@Herbert:感谢您的帮助,现在它可以工作了。但是我想知道是否有一种解决方案,用户不必更改文档结构,而是可以更新itemize本身,而不是使用新的和不同的环境。我阅读了关于更新labeli、labelii以获取不同级别的项目符号的内容。对于vfill,是否可能出现这样的情况?如果这样的解决方案可行,那么用户就不必费心使用不同的环境来处理项目和子项目。 - thequark
@thequark:是的,标签的更改也让我想到了这个可能性,但我怀疑vfill是否能在标签中起作用。如果vfill在标签中有效,则更改标签应该可以实现你想要的效果。我会尝试一下... - Herbert Sitz
显示剩余2条评论

2

因为第一个答案太拥挤了,所以在这里添加另一个示例。测试修改标签命令,结果似乎可以工作,但却会产生错误,我确信是因为 \vfill 是标签结构的一部分。我很惊讶它似乎能创建所需的输出,但需要进行一些调整才能使其正常工作:

\begin{document}

\let\oldlabelitemi\labelitemi
\renewcommand{\labelitemi}{\vfill\oldlabelitemi{\hspace{1ex}}}

\begin{itemize}

\item Item One 
    \begin{itemize}
    \item subone
    \item subtwo
    \item subthree
    \end{itemize}
\item Item Two 
   \begin{itemize}
        \item subitem1
        \item s2
        \item s3
    \end{itemize}
\item item three
   \begin{itemize}
        \item subitem1
        \item s2
        \item s3
    \end{itemize}
\end{itemize}

\end{document}

1
@Herbert Sitz:我非常钦佩您的回答和为找到解决方案并帮助thquack所做出的所有努力。我正在注意您说的一切 :) - Vivi
@Herbert:我之前尝试过这种方法,当我尝试你的例子时,我得到了以下错误(与我之前尝试时相同):9 error| 缺少}插入。 } \item I tem One - thequark
@quark:是的,我认为这不是一个好的解决方案。我确定问题是因为在标签中放置\vfill导致的;标签应该只是一个字符,而不是页面格式信息。 - Herbert Sitz
@Vivi:我理解你的想法,但仍然认为org-mode是你最有效的下一步。Emacs对于编码人员来说非常棒,但对于一般写作用途来说并不是那么好。对于想要完成基本写作任务的人,我会建议他们从一开始就使用org-mode来启动Emacs。Org-mode也可以轻松地被称为“Emacs写作”。当你阅读有关它的内容时,org-mode可能看起来很复杂,但如果你实际运行它,你会发现它简化了事情。例如,对于像在LaTeX中发布这样的东西,Org会自动为您添加大多数LaTeX标记(而且标记不会使您的文档混乱)。 - Herbert Sitz
@Herbet:我刚发现在beamer文档类中无法更新labelitemi。为了自定义演示文稿的元素,应该使用命令:\setbeamertemplate{itemize subitem}{\textendash}。现在这只是将标签更改为破折号(-),而不是我想要的常规符号。让我们查看\setbeamertemplate的定义,看看是否还有其他可能性。 - thequark
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接