我在用外页和pythontex包以制作一本练习册。我注意到环境不能在 exsheets 的环境内(或)pycode
使用。但是,命令在 内正常工作。question
solution
\pyc
question
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
和类似的环境运行。您需要和的版本,question
将solution
其内容写入辅助文件而不是使用。这本质上是与其选项\NewEnviron
相同的方法。beamer
fragile
正如 egreg 所指出的,在或环境\verb
中不起作用。这可能会引发为什么以及类似的 pythontex 命令的问题question
solution
\pyc
做工作,因为它们通常需要逐字参数。答案是与.和类似命令用于重新标记其参数的\pyc
非常不同,后者本质上将参数恢复为逐字状态。但是,由于参数最初是在将环境内容读取为宏参数时标记的,因此如果 的参数包含或字符或不匹配的括号,则此方法会失败。(我有一些关于在未来版本的 pythontex 中解决这个问题的想法,使用正确定义的、、和。)\verb
\pyc
\scantokens
\pyc
#
%
\#
\%
\{
\}
这解释了类似的东西是如何\pyc{...}
工作的,其中参数由花括号分隔。使用另一个字符的情况(例如\pyc/.../
)有点棘手。\pyc
获取第一个分隔字符,并动态创建一个宏,该宏将捕获所有内容,直到该字符再次出现。然后它调用这个新宏来实际捕获参数。这使得参数捕获机制本质上与 catcode 无关(同样,除了#
、%
和不匹配的括号)。
答案2
question
和环境solution
在内部使用 包中定义的__exsheets_questions_internal:
和环境。__exsheets_solution_internal:
\NewEnviron
environ
用定义的环境的内容\NewEnviron
被吸收为宏参数,这使得其中的任何逐字命令或环境都是非法的。
在或环境中,\verb
您会遇到同样的问题。verbatim
question
solution
软件包文档在第三部分中讨论了这个问题,其中exsheets-listing
描述了子软件包。也许也可以做类似的事情来允许环境,但和pycode
的语法似乎不适合复杂的用法。lstquestion
lstsolution