这是处理长描述环境项
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@descdefault
为30pt
,略小于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}
输出: