\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
块不能包含在宏中,但考虑到代码非常简单,这并不是什么问题。