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の仕様かもしれないし色々と学びが足りない。
今日の手詰まり
縦書きクラスファイル中の尾注のマークが\rensujiで囲うと消失する。より正確に言うと本文中のendnotemarkは思った通りの表示になるけどtheendnotes中のマークが消える。
下のような感じで発生。endnotesの中をちゃんと検証すれば解決するだろうか。将来的にはendnotemarkの位置も右に寄せたいのだけれど。
\usepackage{endnotes} \let\footnote=\endnote \renewcommand{\theendnote}{\rensuji{*\arabic{endnote}}} \renewcommand{\notesname}{註} \usepackage{etoolbox} \patchcmd{\enoteformat}{\normalsize}{0pt}{}{}
VMwareでアップデートしたら「vmciのバージョンが合ってません」と言われたので
何も考えてないと最近のラノベタイトルみたいなタイトルになるって前にも書いた気がする。 割と直ぐに解決したので備忘録として。
状況
VMwareがupdateしたがったのでしてみたらゲストが立ち上がらなくなった。エラーメッセージから、vmci.sysファイルがupdateでバージョンが変わったらしい。
Could not get vmci driver version: The handle is invalid. You have an incorrect version of driver "vmci.sys". Try reinstalling VMware Workstation. Module DevicePowerOn power on failed. Failed to start the virtual machine.
環境
- Windows 8.1 Pro
- VMware Workstation11
解決策
PHReeK.oRG » VMWare Workstation 9 Incorrect VMCI.SYS Driver Version | Blog
最初に見たのがココというだけで、VMware公式とかにものってるっぽい?
要約すると
- guest名.vmxファイルをメモ帳なりで開いて
vmci0.present = "TRUE"
を"FALSE"
に書き換える。- guestを再起動、指示に従う。
ということ。一度vmci.sysの読み込みを無効化してguest側をVMwareに再調整してもらったとゆー。
latexで複数のスタイルファイルを読み込んだ際にRequirePackageされたPackageが競合したのを解決した話
どこのラノベタイトルかMi○lかse○lのゲームタイトルかという感じのタイトル長となりましたが、そんな話.
problem
Sphinxで独自の(というかデフォルトのhowto, manual以外のクラスファイル)を使おうとした際にErrorで make latexpdfja
が止まる. どうやら"\iiint"とかが定義済みだ、とかが出る.
で、その原因なんですが, Sphinx.styでRequireしてるamsmathパッケージ, timesパッケージと使おうとしているクラスでtxfontsをRequireしているときに発生するんですね. 通常の \usepackage
で使おうとしているときにコレにぶちあたったら, その順番をamsmath, txfontsのようにすれば解決するんですが *1, 今回は別の.styや.cls内で呼ばれてるんですよね.
当然, .styなり.clsなりの中身で直接該当部分をコメントアウトすれば避けられる話なんですが, Sphinxは「 make latex
コマンドを行った際にsphinx.styをbuild/latexに置く」という動作を行うので, 一度 make clean
でディレクトリ真っ白にされるとまた設定しなおさなければならないんですよ. じゃあもう片方を書きなおせばという話なんですが, 今回使用するのは自分で用意したクラスファイルではなく, 手を入れるのが躊躇われるという状況にあるわけです.
I did it!
上記のようなコーナーケースにぶち当たったわけです. 解決としては「tex内部で呼ばれる順序をどうにかする」「.tex内でtxfontsかamsmathのRequireをやめさせる」などがあるわけですが, 正直前者は僕の知識ではキツイ. 後者にしたって具体的にはどんなコマンドを叩けばいいんだというところだったのですが, @_yyu_ 氏の助言により, \RequirePackage
コマンドを \renewcommand
で定義しなおせば良いのでは, という話になりました. 今回その試みが成功したので書き残しておきます.
.texファイルの先頭で( \documentclass
とかが読み込まれた後だと具合が悪い)
\RequirePackage{letltxmacro} \RequirePackage{xstring} \LetLtxMacro\latexRequirePackage\RequirePackage \renewcommand\RequirePackage[2][]{\IfStrEq{#2}{txfonts}{}{\latexRequirePackage[#1]{#2}}}
とすれば今回は通りました. 内容的には
マクロを書くために2つ呼んでいます. CTAN収録パッケージなのでlatex環境を普通どおりに構築していれば概ね問題ないはず.
\usepackage
でない理由は,\usepackage
は\documentclass
と\begin{document}
の間で使うというような話をどこかで聞いたので.letltxmacro の作法についてはあまり詳しくないのでCTANのページなどをご参照ください. 置き換えるマクロと新しいマクロの宣言,
\renewcommand
でその中身の記述といったようなことをしています.\RequirePackage[2][]
となっているのは前半は引数2つということです. 後半はわかってないです.\IfStrEq
はxstringから呼んできます. 文字列の比較, 成功時失敗時処理が簡単に行なえました. 便利!
\IfStrEq{str1}{str2}{true}{false}
といった感じです. 今回はRequirePackageされた中身がtxfontsだった場合何もしてほしくないので成功時がemptyです. 失敗時, つまりそれ以外のパッケージだった場合は通常通りRequirePackage
をしてもらっています.
終わりに
このコーナーケースを踏んだ理由の一つに, 現在Sphinxの拡張でbuilderの置き換えを利用したものを作っている途中だからというのがあります. 「正直ドキュメント色が薄いからリリース番号とかつけなくていい」「紙を多く使うから目次出力しなくていい」というような要望にプリアンブルあれこれしなくてもいいようにしたいという要望から拡張として作ることになったのです. この問題が解決したことによって大分完成に近づいたのでできたら記事にする予定です.
今回は@linerlock氏にも助けてもらいました.
Broadwell with Ubuntuでグラフィック表示がバグった
新PCを月賦で組んで、ヨッシャー届いたーでいろいろいじってた話はまた後でする予定ですが、一点困ってたのが解消したのでこれだけ書きます。あとの記事でも載せるかもですが。
主にフォントまわりこわれる
環境はUbuntu14.10. 15betaを使う度胸はない。ハードウェアはx250, BroadwellでIntelHDGraphics5500. 症状としてはフォントがちゃんと表示されない. フォント以外もときどき変. 主にawesomeを使っていたときに如実に壊れてたのでこのあたり原因かなとか思ってたんですが, GNOMEとかでも頻度は減るものの壊れてたりしたので。インストールし直しても出たのでグラフィックまわりですねぇどうしよとなっていたのですが, ちゃんと? あった.
Intel(R) Graphics Installer 1.0.5 for Linux* | Linux Graphics
installは自己責任で.
いや, 研究が進んでなかったのをこのせいにするわけではないんですが, ホント助かりました.
......Ubuntu15.04ではBroadwellプロセッサに本格対応らしいのでこの辺必要ないかもですね.
エディタの文字幅がなぜか揃わなかった件
ずるずると年越した.
フォント合成したコーディング用フォントが, なぜか半角文字と全角文字の幅が1:2になってくれない. ちゃんとロケールとかも設定したのに何故, と思ってたんですが, 複数の要因があったようです.
まず, 合成元フォントにAdobeのSourceCodeProを使っていたんですが, こいつの文字幅がフォント情報では500になっているのに実際の文字を見ると600になっていたこと. ……結論から言うと, 僕のケースでは関係なかったんですが.
Emacsやターミナルではちゃんと1:2になっているっぽいのにAtomエディタだとなぜか揃わない. 上にあるフォントの調整も行ったのですが, なぜか直らない. 悩むこと数ヶ月. ある日, フォントの大きさをいじっていて気付いた.
行間の設定だコレ\ .
どうやら, 合成した半角文字と全角文字で高さに差があったようで, その分の調整で半角文字が必要以上に詰まっていたようです. 行間に0.2ほどデフォルトから余裕を持たせたところ, 無事に1:2で表示されました.
ちなみに, コーディング用のフォントは
MasayukiFukada/CodeMFont · GitHub
を参考に, 日本語フォントを「源真ゴシックMonospace」を変更して合成しています.