有关在 Beamer 中处理长描述环境项的更多信息

有关在 Beamer 中处理长描述环境项的更多信息

这是处理长描述环境项

Gonzalo Medina 非常乐于助人,帮我解决了一个问题处理长描述环境项

但是,我仍然有几个问题,并且想避免在评论中进行冗长的讨论。因此我提出了这个问题。我相信任何解决方案都应该能够同时解决我的所有问题,所以我没有分别提出这些问题。

  • 我不太明白 Gonzalo 的解决方案是如何工作的。为了解决Overfull \hbox我报告的问题,他改变了长度\beamer@descdefault。现在,这似乎解决了这个问题,但我不明白为什么,而且它还改变了项目标签的左对齐方式。
  • 如果可能的话,我个人倾向于让标签始终与左边距对齐。
  • 然而,更重要的是:

    Ldescription \item是另一个列表环境时,事情就会变得有点不对劲,如下例所示。子列表中第一个项目中的“项目符号”位于错误路线(并导致其他)Overfull \hbox

任何关于如何确保嵌套列表正常工作的建议都将不胜感激。但是,如果可能的话,我宁愿不必定义自己的\item命令。

梅威瑟:

\documentclass{beamer}
\usepackage{lipsum}

\makeatletter
\def\Ldescription{%
  \@ifnextchar[{\beamer@testforospec}{\beamer@descdefault\beamer@descriptionwidth\@@Ldescription}%
}

\def\beamer@testforospec[{\@ifnextchar<{\beamer@scandefaultospec[}{\@Ldescription[}}%

\def\beamer@scandefaultospec[#1]{\def\beamer@defaultospec{#1}\Ldescription}

\def\@Ldescription[#1]{%
\setbox\beamer@tempbox=\hbox{\def\insertdescriptionitem{#1}
  \usebeamertemplate**{description item}}%
\beamer@descdefault\wd\beamer@tempbox\@@description%
}%

\def\@@Ldescription{%
  \beamer@descdefault35pt%
  \list
  {}
  {\labelwidth\beamer@descdefault\leftmargin2.8em\let\makelabel\beamer@Ldescriptionitem}%
  \beamer@cramped%
  \raggedright
  \beamer@firstlineitemizeunskip%
} 

\def\endLdescription{\ifhmode\unskip\fi\endlist}
\long\def\beamer@Ldescriptionitem#1{%
  \def\insertdescriptionitem{#1}%
  \hspace\labelsep{\parbox[b]{\dimexpr\textwidth-\labelsep\relax}{%
        \usebeamertemplate**{description item}%
    }}}
\makeatother


\def\myLdescription{Ldescription}
%\def\myLdescription{description}%uncomment to compare with beamer's normal description environment



\overfullrule=1mm

\begin{document}

\begin{frame}
\noindent I live a very, very wild lifestyle.
\begin{\myLdescription}
\item[very very very very long item]
\begin{itemize}
    \item description 1
    \item[test] 1,2,3
\end{itemize}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut
purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis.\par
Curabitur dictum gravida mauris. Nam arcu libero,
nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque.
\begin{itemize}
    \item description A
    \item[test] x,y,z
\end{itemize}
\item[short item] description 2
\item[another very very very very long item] description 3
\item[i] description 4
\end{\myLdescription}
\end{frame}

\end{document}

答案1

  • 对于第一个和第二个问题: 的想法\beamer@descdefault是它的值必须不小于\leftmargin列表中的值(否则\hbox会产生过满)。要使标签与左边距对齐,这两个值(\leftmargin\beamer@descdefault)必须相等;由于\leftmargin设置为2.8em\beamer@descdefault也必须设置为2.8em(在原始答案中,我最初将其设置\beamer@descdefault30pt,略小于2.8em,这会产生过满的框)。

  • 对于第三个问题:环境背后的想法Ldescription是标签将位于自己的行上(尽可能宽,即\textwidth-\labelsep),而描述文本将位于新行上。添加\leavevmode内部会itemize产生所需的结果;我使用etoolbox包来实现这一点。

代码:

\documentclass{beamer}
\usepackage{lipsum}
\usepackage{etoolbox}

\AtBeginEnvironment{itemize}{\leavevmode}
\makeatletter
\def\Ldescription{%
  \@ifnextchar[{\beamer@testforospec}{\beamer@descdefault\beamer@descriptionwidth\@@Ldescription}%
}

\def\beamer@testforospec[{\@ifnextchar<{\beamer@scandefaultospec[}{\@Ldescription[}}%

\def\beamer@scandefaultospec[#1]{\def\beamer@defaultospec{#1}\Ldescription}

\def\@Ldescription[#1]{%
\setbox\beamer@tempbox=\hbox{\def\insertdescriptionitem{#1}
  \usebeamertemplate**{description item}}%
\beamer@descdefault\wd\beamer@tempbox\@@description%
}%

\def\@@Ldescription{%
  \[email protected]%
  \list
  {}
  {\labelwidth\beamer@descdefault\leftmargin2.8em\let\makelabel\beamer@Ldescriptionitem}%
  \beamer@cramped%
  \raggedright
  \beamer@firstlineitemizeunskip%
} 

\def\endLdescription{\ifhmode\unskip\fi\endlist}
\long\def\beamer@Ldescriptionitem#1{%
  \def\insertdescriptionitem{#1}%
  \hspace\labelsep{\parbox[b]{\dimexpr\textwidth-\labelsep\relax}{%
        \usebeamertemplate**{description item}%
    }}}
\makeatother


\def\myLdescription{Ldescription}
%\def\myLdescription{description}%uncomment to compare with beamer's normal description environment

\overfullrule=1mm

\begin{document}

\begin{frame}
\noindent I live a very, very wild lifestyle.
\begin{\myLdescription}
\item[very very very very long item]
\begin{itemize}
    \item description 1
    \item[test] 1,2,3
\end{itemize}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut
purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis.\par
Curabitur dictum gravida mauris. Nam arcu libero,
nonummy eget, consectetuer id, vulputate a, magna. Donec
vehicula augue eu neque.
\begin{itemize}
    \item description A
    \item[test] x,y,z
\end{itemize}
\item[short item] description 2
\item[another very very very very long item] description 3
\item[i] description 4
\end{\myLdescription}
\end{frame}

\end{document}

输出:

在此处输入图片描述

相关内容