I've used noweb references to actually assemble what will be tangled all at once. See how I did it here . The reason why the "incorrect" block is outdented is that tangle automatically tries to guess indentation level. (Take that as a handwavy thing - I don't know exactly how it does that nor how configurable it is) The solution I've found is noweb - basically you *wouldn't* tangle any of those blocks, but would create another non-evaluated or exportable block that has noweb references to the above blocks and how you want them arranged. *This* is the block you tangle. I haven't yet figured out how, but it should be possible to automatically configure things to run autopep8 after tangling - that would take care of indentation issues. Also I'm pretty sure there's no :weave header arg...at least I haven't seen it used and can't find it documented anywhere. On Fri, Nov 29, 2019 at 12:08 PM Norman Walsh wrote: > Hi, > > I’ve seen a couple of pointers recently to using Org mode and tangle > to write more literate Emacs configurations. I use Org+babel all the > time to write “interactive” documents, so I thought I’d try out tangle > from Org. > > I didn’t want to start with something as comlicated as my Emacs > config :-) so I figured I’d kick the tires with a small python > program. That did not end well. > > Consider: > > #+TITLE: Python literate programming > #+OPTIONS: html-postamble:nil > > It starts off as a completely standard Python3 program. > > ---%<------------------------------------------------------ > #+BEGIN_SRC python :tangle yes :weave no > #!/usr/bin/env python3 > > #+END_SRC > > It defines ~a~. > > #+BEGIN_SRC python :tangle yes > def a(): > print("a") > > > #+END_SRC > > And ~b~. > > #+BEGIN_SRC python :tangle yes > def b(): > print("b") > > > #+END_SRC > > Now ~c~ is a little more complicated: > > #+BEGIN_SRC python :tangle yes > def c(): > print("c") > #+END_SRC > > Not only does ~c~ print “c”, it calls ~a()~ and ~b()~. > > #+BEGIN_SRC python :tangle yes > b() > a() > #+END_SRC > > Finally, make it importable. Not that you’d want to. > > #+BEGIN_SRC python :tangle yes > if __name__ == "__main__": > main() > #+END_SRC > --->%------------------------------------------------------ > > That’s the script. It weaves into HTML more-or-less ok (there’s a > weird black box at the front of indented lines, but I can come back to > that later). > > It’s a complete mess when tangled. > > The extra blank lines between functions (to make pylint happy with > some PEP guideline) have disappeared. I guess I could live with that, > but the complete failure to preserve indention in the penultimate code > block is a show stopper: > > #!/usr/bin/env python3 > > def a(): > print("a") > > def b(): > print("b") > > def c(): > print("c") > > b() > a() > > if __name__ == "__main__": > main() > > (Also, why is there an extra blank line before the incorrectly > indented block?) > > Is this user error on my part somehow? I suppose I could write my own > version of tangle, though I’m not clear if the whitespace is lost in > the tangle function or in the Org mode data model. > > Thoughts? > > Be seeing you, > norm > > -- > Norman Walsh | We discover in ourselves what others > http://nwalsh.com/ | hide from us, and we recognize in > | others what we hide from > | ourselves.--Vauvenargues >