过去,我经常在 Python 项目中使用 noweb,但这次我遇到了奇怪的行为:编织文件中不遵循缩进。这是一个使用 noweb 2(版本noweave.nw,v 1.6 1998/08/17 00:10:34
)的最小示例:
Test file. Here is some Python code:
<<main>>=
for i in range(100):
i += 1
<<printing>>
@
And some more code:
<<printing>>=
repr(i)
当我将它解开时,我得到了正确的 Python 代码:
for i in range(100):
i += 1
repr(i)
当我编织它时,我得到以下 TeX 代码:
\documentclass{article}\usepackage{noweb}\pagestyle{noweb}\noweboptions{}\begin{document}\nwfilename{test.nw}\nwbegindocs{0}Test file. Here is some Python code:% ===> this file was generated automatically by noweave --- better not edit it
\nwenddocs{}\nwbegincode{1}\moddef{main}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
for i in range(100):
i += 1
\LA{}printing\RA{}
\nwendcode{}\nwbegindocs{2}\nwdocspar
And some more code:
\nwenddocs{}\nwbegincode{3}\moddef{printing}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
repr(i)
\nwendcode{}\end{document}
看起来还不错(至少与我过去 20 年左右得到的结果没有什么不同),但编译时会产生以下输出:
其中,for i in range(100):
和以下两行之间的缩进已消失。在 Python 中,缩进非常重要,因为它表示代码块嵌套。
有谁知道如何规避这个问题并恢复到 noweave 早期的行为,即尊重缩进(无论我使用制表符还是 4 个空格的字符串)?
答案1
逐字记录模式的管理发生了一些变化。
为了恢复原来的预期行为,你可以在某处添加(可能是在末尾noweb.sty
)
\let\obeyedspace\@xobeysp
概念证明:
\documentclass{article}
\usepackage{noweb}
\pagestyle{noweb}
\noweboptions{}
\makeatletter
\let\obeyedspace\@xobeysp
\makeatother
\begin{document}
\nwfilename{test.nw}\nwbegindocs{0}
Test file. Here is some Python code:% ===> this file was generated automatically by noweave --- better not edit it
\nwenddocs{}\nwbegincode{1}\moddef{main}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
for i in range(100):
i += 1
\LA{}printing\RA{}
\nwendcode{}\nwbegindocs{2}\nwdocspar
And some more code:
\nwenddocs{}\nwbegincode{3}\moddef{printing}\endmoddef\nwstartdeflinemarkup\nwenddeflinemarkup
repr(i)
\nwendcode{}
\end{document}