如何不通过提供行号而是提供搜索词来导入源代码

如何不通过提供行号而是提供搜索词来导入源代码

有人知道我该如何将 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}

相关内容