有人知道我该如何将 Python 源代码导入我的文档吗?现在我正在使用 listings 包并提供我的外部源代码的起始行号和结束行号。问题是,一旦代码在任何位置发生变化,外部文件中对这些行号的引用将不再正确。
请看下面我的最小示例:
\documentclass{standalone}
\usepackage{listings}
\begin{filecontents}{testcode.py}
class Y:
"""
-----------------------------
The vertical motion of a ball
-----------------------------
Methods:
constructor(v0)
value(t)
formula()
Attributes:
v0: the initial velocity of the ball (time 0)
g: accerleration of gravity (fixed)
"""
# define (Y) __init__
def __init__(self, v0):
self.v0 = v0
self.g = 9.81
# define (Y) __call__
def __call__(self, t):
return self.v0*t - 0.5*self.g*t**2.
# define (Y) __str__
def __str__(self):
return 'v0*t - 0.5*g*t**2; v0=%g' % self.v0
# try01
y = Y(1.5)
y(0.2)
print y
\end{filecontents}
\begin{document}
\lstinputlisting[%
firstline = 22,
firstnumber = 22,
lastline = 25
]{testcode.py}
\end{document}
如您所见,我想__init__(self, v0)
在文档中显示该函数,并在外部文件中显示相应的行号。到目前为止,我必须提供第一行、第一个数字和最后一行。
如果我能像下面这样执行 sg 就太好了:
\lstinputlisting[%
startKeyword = '# define (Y) __init__',
endKeyword = 'self.g = 9.81',
]{testcode.py}
或者类似
\lstinputlisting[%
startKeyword = '# define (Y) __init__',
linesInTotal = 4,
]{testcode.py}
此代码应打印函数和外部文件的相应行号,以实现完整的可追溯性。
答案1
在列表手册的实验功能中,您会发现类似这样的内容,请参阅第 6.7 节。
对于一本 LaTeX 书,我使用此功能从 LaTeX 宏中提取数据(两个宏都相等,因此\relax
在 LaTeX 示例中什么也不做。即使它被标记为实验性的,它仍然运行得很好。
答案2
这是我的解决方案
\documentclass{scrartcl}
\usepackage{listings}
\lstset{
rangebeginprefix = {\#\#\#s\!\{},
rangebeginsuffix = {\}\!s\#\#\#},
rangeendprefix = {\#\#\#e\!\{},
rangeendsuffix = {\}\!e\#\#\#},
includerangemarker = false,
frame = single,
numbers = left
}
\begin{filecontents}{testcode.py}
class Y:
"""
-----------------------------
The vertical motion of a ball
-----------------------------
Methods:
constructor(v0)
value(t)
formula()
Attributes:
v0: the initial velocity of the ball (time 0)
g: accerleration of gravity (fixed)
"""
###s!{Listing-Y-init}!s###
def __init__(init, v0):
self.v0 = v0
self.g = 9.81
###e!{Listing-Y-init}!e###
###s!{Listing-Y-self}!s###
def __call__(self, t):
return self.v0*t - 0.5*self.g*t**2.
###e!{Listing-Y-self}!e###
###s!{Listing-Y-str}!s###
def __str__(self):
return 'v0*t - 0.5*g*t**2; v0=%g' % self.v0
###e!{Listing-Y-str}!e###
# try01
y = Y(1.5)
y(0.2)
print y
\end{filecontents}
\begin{document}
% by number:
% \lstinputlisting[%
% firstline = 22,
% firstnumber = 22,
% lastline = 25
% ]{testcode.py}
% by keyword indicateing start and end
\lstinputlisting[%
linerange = {Listing-Y-init}-{Listing-Y-init},
]{testcode.py}
\lstinputlisting[%
linerange = {Listing-Y-self}-{Listing-Y-self},
]{testcode.py}
\end{document}