直接在 sagetex 块中输入 sage 文件

直接在 sagetex 块中输入 sage 文件

\lstinputlisting是否有类似于sagetex 的命令,它可以直接导入.sage相关块中的文件并对其进行评估sagetex

如果不是,那么如何编写这样的命令?

\lstinputlisting这个想法与IE,在 sage 开发环境中编写源代码并通过 让其直接与 latex 交互sagetex

我想出了以下代码:

\newcommand{\sagesilentinput}[1]{%
    \newwrite\texfile
    \immediate\openout\texfile=#1.tex
    \immediate\write\texfile{\noexpand\begin{sagesilent}}
  %
      \newread\sagefile
      \openin\sagefile=#1
      \typeout{Reading #1}
      %
      % %% Taken from https://tex.stackexchange.com/q/63463/9517
      \begingroup\endlinechar=-1
      \loop\unless\ifeof\sagefile
      \read\sagefile to\fileline 
      \typeout\fileline % For debug purposes, but nothing is typed out either
      \immediate\write\texfile{\unexpanded\expandafter{\fileline}}  
      \repeat
      \endgroup
      %
      \immediate\write\texfile{\noexpand\end{sagesilent}}
      \immediate\closeout\texfile
      \closein\sagefile
  %
  \input{#1.tex}
}

它应该将文件的名称作为参数,创建一个包含内容的foo.sage文件foo.sage.tex

\begin{sagesilent}
<contents of foo.sage>
\end{sagesilent}

然后输入。

然而,它不起作用,该文件只包含

\begin{sagesilent}

\end{sagesilent}

就像循环没有读取一行一样。如果我使用\readline而不是 ,结果是一样的\read

使用 sagetex 的 MNWE:

\documentclass{article}

\usepackage{sagetex} 

\usepackage{filecontents}

\begin{filecontents}{example.sage}
def myfunction(a,b):
    return a+b;       
\end{filecontents}

\newcommand{\sagesilentinput}[1]{%
  \newwrite\texfile
  \immediate\openout\texfile=#1.tex
  \immediate\write\texfile{\noexpand\begin{sagesilent}}
    \typeout{Writing #1.tex}
    %
    \newread\sagefile
    \openin\sagefile=#1
    \typeout{Reading #1}
    %
    % %% Taken from https://tex.stackexchange.com/q/63463/9517
    \begingroup\endlinechar=-1
    \loop\unless\ifeof\sagefile
    \read\sagefile to\fileline 
    \typeout\fileline % For debug purposes, but nothing is typed out either
    \immediate\write\texfile{\unexpanded\expandafter{\fileline}}  
    \repeat
    \endgroup
    %
    \immediate\write\texfile{\noexpand\end{sagesilent}}
  \immediate\closeout\texfile
  \closein\sagefile
  %
  \input{#1.tex}
}

\begin{document}

\sagesilentinput{example.sage}

\sage{myfunction(3,4)}

\end{document}

没有 sagetex 的 MNWE(可以从 的内容上看到成功example.sage.tex):

\documentclass{article}

%\usepackage{sagetex}

\usepackage{filecontents}

\begin{filecontents}{example.sage}
def myfunction(a,b):
    return a+b;       
\end{filecontents}

\newcommand{\sagesilentinput}[1]{%
  \newwrite\texfile
  \immediate\openout\texfile=#1.tex
  \immediate\write\texfile{\noexpand\begin{sagesilent}}
    \typeout{Writing #1.tex}
    %
    \newread\sagefile
    \openin\sagefile=#1
    \typeout{Reading #1}
    %
    % %% Taken from https://tex.stackexchange.com/q/63463/9517
    \begingroup\endlinechar=-1
    \loop\unless\ifeof\sagefile
    \read\sagefile to\fileline 
    \typeout\fileline % For debug purposes, but nothing is typed out either
    \immediate\write\texfile{\unexpanded\expandafter{\fileline}}  
    \repeat
    \endgroup
    %
    \immediate\write\texfile{\noexpand\end{sagesilent}}
  \immediate\closeout\texfile
  \closein\sagefile
  %
  %\input{#1.tex}
}

\begin{document}

\sagesilentinput{example.sage}

%\sage{myfunction(3,4)}

\end{document}

答案1

这不是一个答案,但至少是一种解决方法。它没有解决该问题中提出的具体复制问题,但它实现了最终目的,并且不会创建外部文件。

问题是,无法使用 LaTeX\input在相关块中加载 sage 文件,因为\input在 评估内容之前不会展开Sage。但是,可以使用 Sage 语法获得相同的结果:

\begin{sagesilent}
  load("example.sage")
\end{sagesilent}

由于包装内部sagetex来源)sagesilent块不能包含在宏中,但考虑到代码非常简单,这并不是什么问题。

相关内容