将 beamer 框架的脆弱选项替换为 \scantokens

将 beamer 框架的脆弱选项替换为 \scantokens

当 beamer 框架中有一些逐字代码时,我们需要使用fragile选项。但这个fragile选项经常使反向搜索跳转到错误的文件。

因此,我尝试在以下示例中用命令替换fragile选项:\scantokens

\documentclass{beamer}
\usepackage{verbatim}

\newcommand{\mycmd}[1]{%
\scantokens{\begin{verbatim}
#1
\end{verbatim}}}

\begin{document}

\begin{frame}
Before
\mycmd{
  \hello \world
}
After
\end{frame}

\end{document}

上面的代码确实有效。现在我想定义一个环境而不是命令,但以下代码会导致错误。

! File ended while scanning text of \scantokens.

\documentclass{beamer}
\usepackage{verbatim}

\newenvironment{myenv}
{%
   \scantokens\bgroup\verbatim
}
{%
   \endverbatim\egroup
}

\begin{document}

\begin{frame}
Before
\begin{myenv}
  \hello \world
\end{myenv}
End
\end{frame}

\end{document}

定义这种环境的正确方法是什么?

答案1

由于几个原因,这行不通。

第一个原因。

语法\scantokens

\scantokens <general text>

并且 a<general text>可以以隐式括号开头,但不能以此结尾:终止符必须是一个明确的括号。

第二个原因

行尾在执行其工作之前进行管理\scantokens,因此它们会丢失。使用命令形式的代码也会受到此问题的影响。例如

\documentclass{beamer}
\usepackage{verbatim}

\newcommand{\mycmd}[1]{%
\scantokens{\begin{verbatim}
#1
\end{verbatim}}}

\begin{document}

\begin{frame}
Before
\mycmd{
  \hello \world
  \hello \world
  \hello \world
}
After
\end{frame}

\end{document}

生产

在此处输入图片描述

结论

对不起,你完蛋了。这是个无解的fragile选择。

相关内容