Sphinx拡張の拡張
Sphinx拡張は誰かが作ってくれた拡張が沢山(主にsphinxcontribに )あります。ただ、多くの拡張はhtml用に作られており、latexでは使えないことがしょっちゅうです。まあニコ動の映像を貼ったりするのはhtmlの特権っぽいですが。
既存の拡張を別の形式の書き出しでも使いたいケースで困ったのが今回の話です。
今回はsphinxcontrib-textstyle を改造しました。
普通の拡張の拡張
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
すると RubyTag
は rt
なんて持ってないよってエラー吐きます。この 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の仕様かもしれないし色々と学びが足りない。