0

私が知る限りcode-block、reStructuredText 構文に関してあいまいになるため、空白行で開始または終了するリテラル テキスト ブロック (ディレクティブなど) を作成することはできません。

それで大丈夫です。

しかし、今はdocutilsliteral_block()ノードを使用するカスタム ディレクティブを作成したいと考えており、(ディレクティブのコード内で) ディレクティブの内容の先頭および/または末尾に空の行を追加したいと考えています。

これは reStructuredText 構文では不可能であるため、ディレクティブのオプションを使用して空白行の数を指定する予定ですが、それは私の問題ではなく、質問の一部でもありません。念のため、疑問に思っています...

これが私がやりたいことの最小限の例です:

import docutils

class MyDirective(docutils.parsers.rst.Directive):

    has_content = True

    def run(self):
        text = '\n\n' + '\n'.join(self.content.data) + '\n\n'
        node = docutils.nodes.literal_block(text, text)
        print(node)
        return [node]

def setup(app):
    app.add_directive('mydirective', MyDirective)

次のように使用できます。

.. mydirective::

    Hello, world!

これは機能しますが、ディレクティブに追加した改行が何らかの形で Sphinx に飲み込まれます (HTML と LaTeX の両方の出力で)。

どうすればそれを回避できますか?

改行は実際にはnodeオブジェクトに格納されていますが (の出力に見られるようにprint())、後で Sphinx の処理中にどこかで失われるようです。

私はスフィンクスの機械について自分でこれを追跡するのに十分な知識がありません。どんな助けでも大歓迎です!

4

2 に答える 2

0

私は自分の質問に対する答えを見つけましたが、それは私が望んでいたよりもはるかに複雑です...

カスタム ノード クラスを作成し、literal_blockインスタンスを子ノードとして追加しました。空行の数をカスタム ノード クラスの属性として保存しています。次に、HTML と LaTeX 用の "visit" 関数と "depart" 関数 (実際には後者のみ) を作成しました。これらは、ノード属性から数値を取得しself.body、改行をいじる際に洗練されていない文字列置換を行います。

これは HTML と LaTeX の両方で問題なく機能しますが、より洗練された解決策について聞いていただければ幸いです。

于 2015-12-04T17:43:45.037 に答える
0

CSS の margin-top および margin-bottom プロパティを試してみたいと思います。

于 2015-12-03T09:27:11.727 に答える