beamer
如果我尝试使用article
模式和样式从幻灯片中获取文章amsart
,我的编译器(pdfLaTeX、LaTeX)就会陷入无限循环:
\documentclass{amsart}
\usepackage{beamerarticle}
\title{Test}
\author{Test}
\begin{document}
\begin{frame}
\frametitle{Test}
Test frame
\end{frame}
\end{document}
amsart
用article
in替换\documentclass{article}
可以使一切正常运行。
如果我删除\title
并\author
保留amsart
它也会起作用...所以
- 这是一个错误吗(来自
beamer
)? - 有没有办法使用
beamer
ANDamsart
并保留标题页信息?
答案1
准备一个文件,文件名称beameramsart.sty
如下,内容如下:
\ProvidesPackage{beameramsart.sty}
\RequirePackage{etoolbox}
\newcommand{\baa@keepamsart}[1]{%
\@for\next:=#1\do{%
\csletcs{amsart\next}{\next}%
\csletcs{amsart@\next}{\expandafter\string\csname\next\endcsname}%
\expandafter\appto\expandafter\amsartnames\expandafter{\next,}%
}%
}
\newcommand{\baa@restoreamsart}{%
\@for\next:=\amsartnames\do{%
\csletcs{\next}{amsart\next}%
\csletcs{\expandafter\string\csname\next\endcsname}{amsart@\next}%
\csundef{amsart\next}\csundef{amsart@\next}%
}%
}
\baa@keepamsart{title,author,date}
\RequirePackage{beamerarticle}
\baa@restoreamsart
\@onlypreamble\baa@keepamsart
\@onlypreamble\baa@restoreamsart
\endinput
将此文件保存在 LaTeX 文档旁边或 TeX 可以找到的位置;在 TeX Live 发行版中,它可以是目录
~/texmf/tex/latex/beameramsart
其中~
代表您的主目录;在装有 MacTeX 的 Mac OS X 上,它为
~/Library/texmf/tex/latex/beameramsart
现在您的文档可以
\documentclass{amsart}
\usepackage{beameramsart}
\begin{document}
\title{Test}
\author{Test}
\maketitle
\begin{frame}
\frametitle{Test}
Test frame
\end{frame}
\end{document}
有问题的命令在加载之前保存beamerarticle
,加载之后恢复;由于 Joseph 给出的原因,保存方式有点复杂。
答案2
这就是我所说的 中的“问题” beamer
,因为它更确切地说是一个错误,但修复起来并不安全。发生的事情\title
通常是一条非常简单的命令:
\documentclass{article}
\show\title
> \title=macro:
#1->\gdef \@title {#1}.
但amsart
将其重新定义为“强健”命令。这通常没问题,但beamer
会复制\title
并安装新定义。当 Till Tantau 编写时beamer
,他没有预料到需要处理强健命令,因此复制的方式会导致循环定义。
我将其归类为“问题”而不是错误的原因在于,在这个阶段(beamer
已经使用了很多年),几乎不可能在不严重破坏某些文档的情况下更改此区域的代码。因此,唯一能做的就是忍受这个问题。正如评论中指出的那样,在涉及之前设置\title
和可能是解决这个问题的最佳方法。\author
beamer
\documentclass{amsart}
\title{AN Other}
\author{Test}
\usepackage{beamerarticle}
\begin{document}
\maketitle
\begin{frame}
\frametitle{Test}
Test frame
\end{frame}
\end{document}