\beamer@leftmargin 缩进的控制序列未定义

\beamer@leftmargin 缩进的控制序列未定义

根据以下示例http://texdoc.net/texmf-dist/doc/latex/beamer/beameruserguide.pdf#subsubsection.8.2.2我认为以下代码应该可以工作:

\documentclass{beamer}
\usepackage{lipsum}

\begin{document}

\begin{frame}{E}
\hskip-\beamer@leftmargin
\lipsum[2]
\end{frame}

\end{document}

但是编译pdflatex -synctex=1 -interaction=nonstopmode test.tex失败,日志的第 180 行出现错误https://pastebin.com/HmRdN0Vc

谁能解释一下这里出了什么问题?

答案1

@通常不能成为命令名称的一部分,因为它的 catcode 为 12(其他),而命令名称字符需要 catcode 为 11(字母)。解决方案是将框架包装起来\makeatletter ... \makeatother以正确更改 catcode @(另请参阅这个问题):

\makeatletter
\begin{frame}{E}
\hskip-\beamer@leftmargin
\lipsum[2]
\end{frame}
\makeatother

至于在框架内使用这些宏的问题,beamer似乎不会在正常段落构建模式下处理框架的内容,而是以宏调用的参数形式读取其内容。此时框架内的所有 catcode 都是固定的,无法再更改。\makeatletter因此不会产生任何影响。不过,有一个选项fragile可以允许 catcode 发生变化的内容:

\begin{frame}[fragile]{E}
\makeatletter
\hskip-\beamer@leftmargin
\makeatother
\lipsum[2]
\end{frame}

相关内容