当 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
选择。