我正在将 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。
但是,如果一次仅显示一行控制台会话就足够了(您的示例就是这样做的),则下面的方法将起作用。这依赖于重新定义\FancyVerbFormatLine
from 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}