自己顕示欲の開放治療所

erg, programming and something.

別名:Laughing and Grief 雑記

Latin and Greekは習ったこともない

真面目な記事の他、特定の方には不快と思われる事柄に関して言及を行うことがあります。ちょっと頑張りますが、Blog内で解決できなかった場合要望があれば別ページに技術記事は書き直します

Sphinx拡張の拡張

Sphinx拡張は誰かが作ってくれた拡張が沢山(主にsphinxcontribに )あります。ただ、多くの拡張はhtml用に作られており、latexでは使えないことがしょっちゅうです。まあニコ動の映像を貼ったりするのはhtmlの特権っぽいですが。

既存の拡張を別の形式の書き出しでも使いたいケースで困ったのが今回の話です。

今回はsphinxcontrib-textstyle を改造しました。

tdoc.info

普通の拡張の拡張

textstyle.py

def setup(app):

+    app.add_node(
             html=(rubytag.visit_rubytag_node,rubytag.depart_rubytag_node),
             epub=(rubytag.visit_rubytag_node, rubytag.depart_rubytag_node),
             latex=(rubytag.latex_visit_rubytag_node, rubytag.latex_depart_rubytag_node),))
rubytag.py

+def latex_visit_rubytag_node(self,node):
+    if node.rt is None:  # if rt is not set, just write rb.
+         self.body.append(node.rb)
+         return
+
+    try:
+        self.body.append(r"\ruby{")
+        self.body.append(node.rb)
+        self.body.append('}{')
+        self.body.append(node.rt)
+        self.body.append('}')
+    except:
+        self.builder.warn('fail to load rubytag: %r' % node)
+        raise nodes.SkipNode
+def latex_depart_rubytag_node(self, node):
+    pass

動きません。

make latex すると RubyTagrt なんて持ってないよってエラー吐きます。この latex_visit_rubytag_node をadd_nodeのhtmlの方で指定すると動く不思議。仕様なのかがよくわからないのでちゃんと処理のコード読まないとって感じですが、今回はおいておきます。

普通じゃないかもしれない拡張

sphinx.extのmathbaseくんを参考にrubytag_roleを改造。

rubytag.py

def rubytag_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
    """Role for rubytag."""
    text = utils.unescape(text)
    has_explicit, rb, rt = split_explicit_title(text)

    config = inliner.document.settings.env.config

-     rubytag = RubyTag()
-     rubytag.rb = rb
-     rubytag.rt = rt
-     rubytag.rp_start = config.rubytag_rp_start
-     rubytag.rp_end = config.rubytag_rp_end
+    rp_start = config.rubytag_rp_start
+    rp_end = config.rubytag_rp_end
    if not has_explicit:
-        rubytag.rt = None
+        rt = None
-     return [rubytag], []
+    return [RubyTag(rb=rb, rt=rt, rp_start=rp_start, rp_end=rp_end)],[]

で、各 node.rb とかを node['rb'] などに置きかえていきます。 今度は動きました。LaTeX側ではokumacro.styが要るので、preambleもしくは add_latex_pacakage で読みこむようにしておきます。

反省

というかPythonの仕様かもしれないし色々と学びが足りない。