在org文件中包含代码片段

8
我想使用org模式来写一本技术书。我正在寻找一种方法,可以将外部文件中的现有代码插入到babel代码块中,并在导出为pdf时得到良好的格式。
例如:
#+BEGIN_SRC python "./code/foo.py" 
  # insert_line (45,50)
#+END_SRC

请给我在foo.py中从第45行到50行的等效代码

#+BEGIN_SRC python
 def times_two(x):
   y = x*2
   return y

 print times_two(5)    
#+END_SRC

有没有什么方法可以做到这一点?
2个回答

8

1
这似乎可以工作,但我没有使用BEGIN_SRC时得到的漂亮格式。如果我在begin_src中使用include,那么它将不会获取文件,而是原样打印include语句。 - Dan
10
@Dan,如果你想要格式化,你需要指定 src,比如说,#+include: "./code/foo.py" :lines "45-50" src python -n 会标记为Python并添加行号。 - Matt Hancock
@Dan 我认为这是最好的解决方案,可以为包含的文件提供语法高亮,正是我一直在寻找的。谢谢。 - Alejandro Alcalde

6
你可以使用shell脚本并打印带有:wrap的标题行。例如,此处我打印了wos.py脚本的第9-18行。如果设置:exports,则shell脚本不会导出。
#+BEGIN_SRC sh :wrap src python :exports results
sed -n 9,18p wos.py
#+END_SRC

#+RESULTS:
#+BEGIN_src python
class HTTPSudsPreprocessor(urllib2.BaseHandler):
    def __init__(self, SID):
        self.SID = SID

    def http_request(self, req):
        req.add_header('cookie', 'SID="'+self.SID+'"')
        return req

    https_request = http_request

#+END_src

如果您没有sed,可以编写一个小的Python脚本来完成相同的操作。只需记得将行号向后移动一位,并将结果设置为代码即可。
#+BEGIN_SRC python :results code :exports results
with open("wos.py") as f:
    print("".join(f.readlines()[8:17]))    
#+END_SRC

#+RESULTS:
#+BEGIN_SRC python
class HTTPSudsPreprocessor(urllib2.BaseHandler):
    def __init__(self, SID):
        self.SID = SID

    def http_request(self, req):
        req.add_header('cookie', 'SID="'+self.SID+'"')
        return req

    https_request = http_request

#+END_SRC

我已经让 sed 正常工作了,但似乎无法运行 Python 脚本。它只是给了我 None。我在终端中运行了同样的脚本,它完全正常。很奇怪... - Dan
你可能需要使用:results output code。我将默认值从输入更改为输出。 - John Kitchin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接