我在演示中做了很多项目列表beamer
,在后面的步骤中,我希望很好地格式化,例如,将所有内容排版到第一个冒号以粗体显示,其余部分 scriptsize 放在 中\parbox
。我使用的常见习惯是为此目的定义一个自定义\Item
命令,该命令解析项目文本并发出\item
具有预期格式的:
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{calc}
\begin{document}
\def\Item#1:#2\endItem{\item \parbox{2cm}{\strut\textbf{#1:}}\parbox[t]{\linewidth-2cm}{\footnotesize#2}}
\begin{frame}{A frame}
Common metasyntactic variables (used to name absolutely anything)
\begin{itemize}
\Item foo: f*cked over and over? Well, we do not really know the meaning of this beast.\endItem
\Item bar: beyond all reason?\endItem
\end{itemize}
\end{frame}
\end{document}
但是,为了将项目文本的“其余部分”扫描为宏参数,我必须通过明确的结束标记来完成每个项目\endItem
,而我想避免这种情况。例如这个相关问题,我也不想将该项目的文本放入花括号组中。
是否有另一种更优雅的方式来扫描到 的末尾\item
?
答案1
您可以使用列表和一些样式重新创建相同的效果description
。不幸的是,beamer
没有用于描述列表的描述部分的模板。因此,设置字体大小必须\footnotesize
涉及一些技巧。也许有人可以想出一个不那么麻烦的方法。
\documentclass{beamer}
\usepackage{etoolbox}
\setbeamertemplate{description item}{%
\usebeamertemplate*{itemize item} %
\insertdescriptionitem:\hfill%
}
\setbeamercolor{description item}{fg=black}
\setbeamerfont{description item}{series=\bfseries,size=\normalsize}
\setbeamersize{description width=2cm}
\makeatletter
\apptocmd\@@description{\footnotesize}
\makeatother
\begin{document}
\begin{frame}{A useless list}
\begin{description}
\item[first] This is the first list item
\item[bar] And this is the second one
\end{description}
\end{frame}
\end{document}
答案2
这是一个有点老的帖子,但可以使用latex3正则表达式。也就是说,我们可以吸收环境的所有内容,然后将其拆分为其中\item
的命令序列。然后,我们可以在处理序列时添加结尾的\endItem
's。我想我是从 egreg 的一个答案中学到这个技巧的。
下面的代码使用来自的b
参数选项\NewDocumentEnvironment
解析。我不确定这个b
选项是什么时候添加的xparse
,但它是最近才添加的,所以下面的代码很可能需要一个版本l3 软件包2019-05-03(目前为最新版本)或更高版本发布的版本。该b
选项使环境内容等于#1
——之前我使用的是环境包来做这种事情。输出是预期的:
以下是代码:
\documentclass{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{calc}
\usepackage{xparse}
\ExplSyntaxOn
\seq_new:N \l_itemize_seq
\NewDocumentEnvironment{Itemize}{ +b }{
\regex_split:nnN {\c{item}} {#1} \l_itemize_seq
\seq_pop:NN \l_itemize_seq \l_tmpa_tl% remove the (hopefully) empty first item
\seq_if_empty:NF \l_itemize_seq {
\begin{itemize}
\seq_map_inline:Nn \l_itemize_seq {\Item##1\endItem}
\end{itemize}
}
}{}
\ExplSyntaxOff
\begin{document}
\def\Item#1:#2\endItem{\item \parbox{2cm}{\strut\textbf{#1:}}%
\parbox[t]{\linewidth-2cm}{\footnotesize#2}}
\begin{frame}{A frame}
Common metasyntactic variables (used to name absolutely anything)
\begin{Itemize}
\item foo: f*cked over and over? Well, we do not really know the
meaning of this beast.
\item bar: beyond all reason?
\end{Itemize}
\end{frame}
\end{document}
我专门针对问题的语法写了这篇文章\Item#1\endItem
,但可以使其更具通用性。