是否可以扫描到当前 `\item` 的末尾

是否可以扫描到当前 `\item` 的末尾

我在演示中做了很多项目列表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,但可以使其更具通用性。

相关内容