Python sphinx 保留Sphinx Makefile代码块中的选项卡';s

Python sphinx 保留Sphinx Makefile代码块中的选项卡';s,python-sphinx,restructuredtext,Python Sphinx,Restructuredtext,我使用Sphinx和StructuredText输入和HTML输出来记录基础设施的不同部分。其想法是,阅读文档的用户可以复制示例并将其传递到自己的文件中。对于Makefile示例,如何做到这一点?Makefiles在某些位置需要制表符,但Sphinx将制表符转换为空格 示例:命令行必须以最终HTML中的选项卡开头。这里用三个空格表示缩进和一个制表符: .. code-block:: Makefile target: dependency command -i $< -o $

我使用Sphinx和StructuredText输入和HTML输出来记录基础设施的不同部分。其想法是,阅读文档的用户可以复制示例并将其传递到自己的文件中。对于Makefile示例,如何做到这一点?Makefiles在某些位置需要制表符,但Sphinx将制表符转换为空格

示例:
命令
行必须以最终HTML中的选项卡开头。这里用三个空格表示缩进和一个制表符:

.. code-block:: Makefile

   target: dependency
    command -i $< -o $@
。。代码块::Makefile
目标:依赖性
命令-i$<-o$@
代码块
没有控制选项卡扩展的选项


使用sphinx代码块makefile选项卡的web搜索可以在包含的代码中进行选项卡扩展(我更喜欢将其内联),或者如何编辑sphinx makefile,但这并不能解决我的问题。

选项卡扩展发生在解析RST的早期阶段,因此您必须自定义解析器本身以禁用它。我希望这能奏效

从键入import Union开始
从docutils.nodes导入文档
从docutils.statemachine导入字符串列表
从sphinx.parsers导入RSTParser
类别NoTabExpansionRSTParser(RSTParser):
def parse(self,inputstring:Union[str,StringList],document:document)->None:
如果isinstance(inputstring,str):
lines=inputstring.splitlines()
inputstring=StringList(行、文档、当前\u源)
super().parse(输入字符串,文档)
def设置(应用程序):
app.add_source_解析器(NoTabExpansionRSTParser,override=True)

仅供参考,这里是选项卡扩展发生的地方,上面的代码绕过了它

line=docutils.statemachine.string2line(
inputstring,tab_宽度=document.settings.tab_宽度,
转换(空白=真)

在astring.splitlines()中返回[s.expandtabs(制表符宽度).rstrip()]