使用 PythonTex 进行 Beamer 和 Pause

使用 PythonTex 进行 Beamer 和 Pause

我正在将 PythonTex 与 MacTex、TexShop 和 anaconda3 一起使用:所有版本都是最新的,并且 pythontex-gallery 编译没有任何问题。

现在,因为我是一名老师,我想使用 beamer(我对框架使用 [fragile] 选项)并且特别是beamer 的\pause\overlay命令,在控制台模式下使用 PythonTex。

下面是我想要看到的代码,使用 PythonTex 命令和 \pause 命令,而不是很多的逐字逐句!

\documentclass{beamer}



\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}


\begin{document}
\begin{frame}[fragile]
\frametitle{Exercises}
What is the result in Python 2 of:
\begin{verbatim}
>>> 7 / 2
\end{verbatim}
\pause
\begin{verbatim}
 3
 \end{verbatim}
\pause
\begin{verbatim}
>>> 7./2.
\end{verbatim}
\pause
\begin{verbatim}
3.5
\end{verbatim}

\pause
What will be the last output?
\begin{verbatim}
>>> L = [5, 3, 42, 1]
>>> L[1:4]
\end{verbatim}
 \pause
 \begin{verbatim}
  [3, 42, 1]
 \end{verbatim}


\end{frame}
\end{document}

多谢

G。

答案1

下面我提供了一个示例,每次显示一条控制台线。这可能是最好的办法,至少不需要做太多工作。要使它正常工作,需要在序言中修补 beamer。

在每个控制台命令之后、在其输出之前自动插入\pause会很复杂。您必须为 Python 的code模块创建一个包装器(这是 PythonTeX 内部使用的),该包装器会分别突出显示每个命令和输出,并\pause在适当的位置插入。然后您必须将此自定义模块连接到 PythonTeX。

但是,如果一次仅显示一行控制台会话就足够了(您的示例就是这样做的),则下面的方法将起作用。这依赖于重新定义\FancyVerbFormatLinefrom fancyvrb,以便\pause在每行控制台内容的末尾插入 a 。

只需这样做就可以得到你想要的结果,但你必须运行 PythonTeX,然后重新编译文档每行控制台内容,这显然是不可接受的。这是由于 beamer 处理逐字内容的方式造成的;它不断地重新读取每个覆盖的逐字内容,每次重新读取都会让 PythonTeX 认为还有更多代码要执行。解决这个问题需要在每次重新读取之前重置控制控制台代码的 PythonTeX 计数器。这样做需要破解 beamer 内部结构。我在下面的示例中修补了 beamer 内部结构,这样 PythonTeX 只需运行一次。

\documentclass{beamer}

\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pythontex}

\makeatletter
\AtBeginEnvironment{pyconsole}{%
  \renewcommand{\FancyVerbFormatLine}[1]{#1\pause}}

% Need to go ahead and create a counter for each console session
% Proceed assuming only the default
\newcounter{pytx@pycon@default@default}
% Need temp counter for resetting console counter, since the counter
% is incremented each time beamer re-reads verbatim content
\newcounter{pythontex@temp}
\BeforeBeginEnvironment{frame}{%
  \setcounter{pythontex@temp}{\value{pytx@pycon@default@default}}}

% Need a custom version of beamer's verbatim input routine
% The original is from beamerbaseframe.sty
\def\beamer@@@frameinput<#1>[#2][#3]{%
  \global\advance\c@framenumber by-1\relax%
  \edef\beamer@temp{\noexpand\frame<#1>[#2][{#3,fragile=false}]%
    {\begingroup
      % Reset counter
      \setcounter{pytx@pycon@default@default}{\value{pythontex@temp}}%
      \noexpand\input{\beamer@verbfilename}\endgroup}}%
  \beamer@temp%
  \ifx\beamer@frameenvironmentsubst\beamer@frametext%
  \else%
    \expandafter\endgroup%
  \fi%
  \beamer@reseteecodes}
\makeatother

\begin{document}

\begin{frame}[fragile]
\frametitle{Exercises}
What is the result in Python 2 of:
\begin{pyconsole}
7 / 2
7./2.
\end{pyconsole}

What will be the last output?
\begin{pyconsole}
L = [5, 3, 42, 1]
L[1:4]
\end{pyconsole}
\end{frame}

\end{document}

相关内容