第一分钟

第一分钟

编译以下 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}

Cocalc 中的输出是: 在此处输入图片描述

\注意:1. r"" 用于原始字符串,这样我们就可以毫无问题地输入“坏”东西,例如。然后在循环运行时构建字符串。最后用 将其完全插入\sagestr。这意味着第一次通过文档是空的。第二次通过字符串时会创建字符串。第三次通过时有完整的代码,可以毫无问题地通过 LaTeX。2. 使用latex(f(x))清理了演示;例如,乘法符号消失了。尝试从代码中删除任何,您会看到差异。3. 最后,我们可以控制绘图的宽度以使文档看起来更美观;这是使用 中的 latex( )选项完成的。需要一点时间来适应使用字符串,但它解决了给您带来麻烦的大多数问题。[width=8cm]\sageplotsagetex

答案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。

相关内容