编译以下 MWE 时出现以下错误。如何修复?
段落在
\verbatim@
完成之前就结束了。...
第一分钟
\documentclass{article}
\usepackage{sagetex}
\newcount\i
\i=10
\begin{document}
\loop
%==================== BEGIN ===========================
\begin{sageblock}
f(x) = exp(x) * sin(\i*x)
\end{sageblock}
The second derivative of $f$ is
\[
\frac{\mathrm{d}^{2}}{\mathrm{d}x^{2}} \sage{f(x)} =
\sage{diff(f, x, 2)(x)}.
\]
Here's a plot of $f$ from $-1$ to $1$:
\begin{center}
\sageplot{plot(f, -1, 1)}
\end{center}
%=================== END ==============================
\advance \i -1
\ifnum \i>8
\repeat
\end{document}
第二轮
% secondMWE.tex
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{sagetex}
\newcount\i
\i=10
\begin{document}
\loop
\begin{preview}
\sageplot[width=0.75\linewidth]{plot(sin(\the\i*x),x,0,2*pi)}
\end{preview}
\advance \i -1
\ifnum \i>7
\repeat
\end{document}
预期输出显示 3 个具有不同频率的正弦图。
编辑
阅读了现有的答案后,我提出了以下想法,对于 TeX 专家来说,这可能并不难实现。为了简单起见,让我使用第二个 MWE ( secondMWE.tex
)。
构建过程只需 4 步,而不是 3 步。
首先,执行,后台会生成
pdflatex secondMWE
一个新的完整 TeX 文件,例如。它包含类似secondMWE_complete.tex
% secondMWE_complete.tex \documentclass[preview,border=12pt,12pt]{standalone} \usepackage{sagetex} \begin{document} \begin{preview} \sageplot[width=0.75\linewidth]{plot(sin(10*x),x,0,2*pi)} \end{preview} \begin{preview} \sageplot[width=0.75\linewidth]{plot(sin(9*x),x,0,2*pi)} \end{preview} \begin{preview} \sageplot[width=0.75\linewidth]{plot(sin(8*x),x,0,2*pi)} \end{preview} \end{document}
- 第二,做
pdflatex secondMWE_complete
- 第三,做
sage secondMWE_complete.sagetex.sage
- 第四、再做
pdflatex secondMWE_complete.tex
一次
- 第二,做
答案1
我从来没有费心去学习比 Python 更难、更没用、比 Python 更难的语法,所以我不是 100% 确定,但我不认为有可能像 frougon 的答案中那样,sagetex
按照你尝试的方式混合起来expl3
这里,这远远超出了我的知识范围或想要学习的范围。您面临的问题是 LaTeX 的编译是一个 3 阶段过程。首先,LaTeX 运行,并且本质上会为需要 Sage 计算的地方留出一些空间。其次,Sage 运行并填写框。第三阶段是 LaTeX 在前两个步骤生成的 LaTeX 和 Sage 上运行。这将创建最终文档。当您使用\loop
它时,似乎您假设 LaTeX 和 Sage 正在协同工作,因此i
会将其传递给 Sage,并且 Sage 根据变化不断更改函数i
。这不符合 3 步编译过程,所以我认为没有办法让它工作。
我将尝试完全使用 Python 进行如下工作:
\documentclass{article}
\usepackage{sagetex}
\begin{document}
%==================== BEGIN ===========================
\begin{sagesilent}
output = r""
for i in range(10,7,-1):
f(x) = exp(x)*sin(i*x)
output += r"The function is $f(x)= %s$."%(latex(f(x)))
output += r" The second derivative of $f(x)$ is \[ \frac{\mathrm{d}^{2}}{\mathrm{d}x^{2}} %s = %s.\]"%(latex(f(x)),latex(diff(f, x, 2)(x)))
output += r"Here's a plot of $f$ from $-1$ to $1$:\\"
output += r"\begin{center}"
output += r"\sageplot[width=8cm]{plot(%s,-1,1)}"%(f(x))
output += r"\end{center}"
output += r"\vspace{.15in}"
\end{sagesilent}
%=================== END ==============================
\sagestr{output}
\end{document}
\
注意:1. r"" 用于原始字符串,这样我们就可以毫无问题地输入“坏”东西,例如。然后在循环运行时构建字符串。最后用 将其完全插入\sagestr
。这意味着第一次通过文档是空的。第二次通过字符串时会创建字符串。第三次通过时有完整的代码,可以毫无问题地通过 LaTeX。2. 使用latex(f(x))
清理了演示;例如,乘法符号消失了。尝试从代码中删除任何,您会看到差异。3. 最后,我们可以控制绘图的宽度以使文档看起来更美观;这是使用 中的 latex( )
选项完成的。需要一点时间来适应使用字符串,但它解决了给您带来麻烦的大多数问题。[width=8cm]
\sageplot
sagetex
答案2
作为 DJP解释,这真的很难按照你想要的方式去做,因为sageblock
使用了某种verbatim
,而后者与 LaTeX 代码根本不能很好地混合(根据定义)。
不过,为了展示当人们稍微理解了背后的底层机制时可以做什么verbatim
,这里有一个让你的第一个示例与你的\loop
构造一起工作的技巧。它是 LaTeX2e 风格和风格的混合,expl3
因为我从 LaTeX2e 开始,但决定使用一个方便的expl3
因为我从 LaTeX2e 开始,但最终Bruno Le Floch 的回答。
\documentclass{article}
\usepackage{sagetex}
\usepackage{xparse}
\ExplSyntaxOn
\makeatletter
\NewDocumentEnvironment { mysageblock } { m +b }
{
\def\my@contents##1{#2}%
\edef\my@tmpvalue{\number\csname #1\endcsname}%
\edef\my@contents{%
\unexpanded\expandafter\expandafter\expandafter{%
\expandafter\my@contents\expandafter{\my@tmpvalue}}}%
% Trick from <https://tex.stackexchange.com/a/25753/73317>
\exp_args:Nx \scantokens
{
\token_to_str:N \begin{sageblock}
\exp_not:V \my@contents
\token_to_str:N \end{sageblock}
}
}
{ }
\makeatother
\ExplSyntaxOff
\newcount\i
\i=10
\begin{document}
\loop
%==================== BEGIN ===========================
\begin{mysageblock}{i}
f(x) = exp(x) * sin(##1*x)
\end{mysageblock}
The second derivative of $f$ is
\[
\frac{\mathrm{d}^{2}}{\mathrm{d}x^{2}} \sage{f(x)} =
\sage{diff(f, x, 2)(x)}.
\]
Here's a plot of $f$ from $-1$ to $1$:
\begin{center}
\sageplot{plot(f, -1, 1)}
\end{center}
%=================== END ==============================
\advance \i -1
\ifnum \i>8
\repeat
\end{document}
对于第二个示例,由于sageplot
不使用verbatim
,因此不存在这样的复杂性。您的代码对我来说工作正常。您可以使频率变化更加明显,以说服自己:
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{sagetex}
\newcount\i
\i=3
\begin{document}
\loop
\begin{preview}
\sageplot[width=0.75\linewidth]{plot(sin(\the\i*x),x,0,2*pi)}
\end{preview}
\advance \i -1
\ifnum \i>0
\repeat
\end{document}
注意:也许您应该避免使用单字母变量名\i
,例如,这通常用于排版无点 i。