尽管已修复,但 enumitem 仍破坏了 beamer 的 itemize

尽管已修复,但 enumitem 仍破坏了 beamer 的 itemize

我以为我已经驯服了enumitem。我有这个逐项修复和这个枚举修复

然后我尝试[<+->]构造。失败了。注释该enumitem部分可以避免错误,但我宁愿不这样做。

在当前状态下,此代码会产生两个错误,一个是由于 ,[<+->]另一个是由于\onslide

 \documentclass{beamer}

 \usepackage{enumitem}
 \setitemize{label=\usebeamerfont*{itemize item}%
   \usebeamercolor[fg]{itemize item}
   \usebeamertemplate{itemize item}}%https://tex.stackexchange.com/a/24491
 \setenumerate[1]{%
   label=\protect\usebeamerfont{enumerate item}%
         \protect\usebeamercolor[fg]{enumerate item}%
         \insertenumlabel.}%https://tex.stackexchange.com/a/45950

 \begin{document}
 \begin{frame}
 \begin{itemize}[<+->]
 \item 1
 \item 2
 \end{itemize}
 \onslide<2>{text}
 \end{frame}
 \end{document}

答案1

答案很简单:不要enumitem与投影机一起使用。

Beamer 有自己的机制来改变逐项项目的外观,而且非常灵活——因此不需要使用其他包。

\documentclass{beamer}

\setbeamertemplate{itemize item}{\includegraphics[width=2em]{duck}}

\begin{document}
    \begin{frame}
        \begin{itemize}[<+->]
            \item 1
            \item 2
        \end{itemize}
        \onslide<2>{text}
    \end{frame}
\end{document}

在此处输入图片描述

答案2

您可以使用\beamerdefaultoverlayspecification{<+->}以下解决方法(请参阅beamer 文档第 89 页)。

\documentclass{beamer}

\usepackage{enumitem}
\setlist[itemize]{%
    label=\usebeamerfont*{itemize item}%
        \usebeamercolor[fg]{itemize item}%
        \usebeamertemplate{itemize item}%
}%http://tex.stackexchange.com/a/24491
\setlist[enumerate,1]{%
    label=\protect\usebeamerfont{enumerate item}%
        \protect\usebeamercolor[fg]{enumerate item}%
        \insertenumlabel.%
}%http://tex.stackexchange.com/a/45950

\begin{document}
\begin{frame}
    \beamerdefaultoverlayspecification{<+->}
    \begin{itemize}
        \item 1
        \item 2
    \end{itemize}
    \onslide<2>{text}
\end{frame}
\end{document}

只是为了好玩:您还可以为 enumitem 定义一个新键来指定默认覆盖规范。不过,我更建议\beamerdefaultoverlayspecification直接使用,如上所示。

\documentclass{beamer}

\usepackage{enumitem}
\setlist[itemize]{%
    label=\usebeamerfont*{itemize item}%
        \usebeamercolor[fg]{itemize item}%
        \usebeamertemplate{itemize item}%
}%http://tex.stackexchange.com/a/24491
\setlist[enumerate,1]{%
    label=\protect\usebeamerfont{enumerate item}%
        \protect\usebeamercolor[fg]{enumerate item}%
        \insertenumlabel.%
}%http://tex.stackexchange.com/a/45950

% definition of new key for enumitem:
\makeatletter
\enitkv@key{enumitem}{overlay}{%
    \beamerdefaultoverlayspecification{#1}%
}
\makeatother

\begin{document}
\begin{frame}
    \begin{itemize}[overlay=<+->]
        \item 1
        \item 2
    \end{itemize}
    \onslide<2>{text}
\end{frame}
\end{document}

为什么我建议使用第一种方法: 第二种方法没有优势,因为它在内部使用了第一种方法。第一种方法使用标准命令,如果读者还不了解这些命令,可以很容易地在文档中查找它们。另一方面,第二种方法可能会让阅读你代码的其他人感到困惑,因为他们很可能会认为密钥是由 enumitem 包定义的,当他们在自己的代码中尝试它时,会因为无法工作而感到沮丧。而且需要记住的是,您需要为想要使用它的每个文档定义此键(并且可能每次都需要查找定义)。

第一种方式打字速度更快,因为自动完成功能会帮你完成。使用自动完成功能还可以确保你不会犯打字错误。

布局应该保持一致。因此,你应该\beamerdefaultoverlayspecification在序言中使用一次,之后可能就不需要再使用它了。


编辑:根据第 9 页脚注 7,我已将\setitemize和替换\setenumerate为因为\setlistenumitem 文档这些已被弃用。

相关内容