根据以下示例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}