Exsheets 和 pythontex 兼容性

Exsheets 和 pythontex 兼容性

我在用外页pythontex包以制作一本练习册。我注意到环境不能在 exsheets 的环境内(或)pycode使用。但是,命令在 内正常工作。questionsolution\pycquestion

pycode最简单的解决方法是在外面写solution,简而言之,这对我来说很有效。但是,我想了解这种限制背后的原因。

\documentclass{article}
\usepackage{pythontex}
\usepackage{exsheets}

\begin{document}
    \begin{question}
        \begin{pycode}
         i_Go = J_L * J_M
        \end{pycode}
    \end{question}
\end{document}

答案1

egreg 的回答涵盖了大部分细节。以下是一些附加信息。

lstquestion和环境lstsolution允许列表,通过将环境内容写入辅助文件,然后在适当的位置读回辅助文件。由于环境被保存为文件而不是作为宏参数捕获,因此逐字材料可以正常工作。可以应用相同的方法来允许pycode和类似的环境运行。您需要和的版本,questionsolution其内容写入辅助文件而不是使用。这本质上是与其选项\NewEnviron相同的方法。beamerfragile

正如 egreg 所指出的,在或环境\verb中不起作用。这可能会引发为什么以及类似的 pythontex 命令的问题questionsolution\pyc工作,因为它们通常需要逐字参数。答案是与.和类似命令用于重新标记其参数的\pyc非常不同,后者本质上将参数恢复为逐字状态。但是,由于参数最初是在将环境内容读取为宏参数时标记的,因此如果 的参数包含或字符或不匹配的括号,则此方法会失败。(我有一些关于在未来版本的 pythontex 中解决这个问题的想法,使用正确定义的、、和。)\verb\pyc\scantokens\pyc#%\#\%\{\}

这解释了类似的东西是如何\pyc{...}工作的,其中参数由花括号分隔。使用另一个字符的情况(例如\pyc/.../)有点棘手。\pyc获取第一个分隔字符,并动态创建一个宏,该宏将捕获所有内容,直到该字符再次出现。然后它调用这个新宏来实际捕获参数。这使得参数捕获机制本质上与 catcode 无关(同样,除了#%和不匹配的括号)。

答案2

question和环境solution在内部使用 包中定义的__exsheets_questions_internal:和环境。__exsheets_solution_internal:\NewEnvironenviron

用定义的环境的内容\NewEnviron被吸收为宏参数,这使得其中的任何逐字命令或环境都是非法的。

在或环境中,\verb您会遇到同样的问题。verbatimquestionsolution

软件包文档在第三部分中讨论了这个问题,其中exsheets-listing描述了子软件包。也许也可以做类似的事情来允许环境,但和pycode的语法似乎不适合复杂的用法。lstquestionlstsolution

答案3

克莱门斯正在开发 exsheets 的后续产品 xsim,其中已修复此问题。xsim 软件包已在卡坦并随 TeXLive 和 MiKTeX 一起提供。

以下代码有效:

\documentclass{article}
\usepackage{pythontex}
\usepackage{xsim}

\begin{document}
\begin{exercise}
\begin{pycode}
i_Go = 2
\end{pycode}
\py{i_Go}
\end{exercise}
\end{document}

相关内容