自己顕示欲の開放治療所

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の仕様かもしれないし色々と学びが足りない。

今日の手詰まり

縦書きクラスファイル中の尾注のマークが\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.

環境

解決策

PHReeK.oRG » VMWare Workstation 9 Incorrect VMCI.SYS Driver Version | Blog

最初に見たのがココというだけで、VMware公式とかにものってるっぽい?

要約すると

  1. guest名.vmxファイルをメモ帳なりで開いて
  2. vmci0.present = "TRUE""FALSE" に書き換える。
  3. guestを再起動、指示に従う。

ということ。一度vmci.sysの読み込みを無効化してguest側をVMwareに再調整してもらったとゆー。

latexで複数のスタイルファイルを読み込んだ際にRequirePackageされたPackageが競合したのを解決した話

 どこのラノベタイトルかMi○lかse○lのゲームタイトルかという感じのタイトル長となりましたが、そんな話.

problem

 Sphinxで独自の(というかデフォルトのhowto, manual以外のクラスファイル)を使おうとした際にErrormake 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}}}

とすれば今回は通りました. 内容的には

  1. マクロを書くために2つ呼んでいます. CTAN収録パッケージなのでlatex環境を普通どおりに構築していれば概ね問題ないはず. \usepackage でない理由は, \usepackage\documentclass\begin{document} の間で使うというような話をどこかで聞いたので.

  2. letltxmacro の作法についてはあまり詳しくないのでCTANのページなどをご参照ください. 置き換えるマクロと新しいマクロの宣言, \renewcommand でその中身の記述といったようなことをしています. \RequirePackage[2][] となっているのは前半は引数2つということです. 後半はわかってないです.

  3. \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プロセッサに本格対応らしいのでこの辺必要ないかもですね.

生存報告

Sphinx1.3b2の感触書こうと思っていたらいつの間にか1.3.1リリースですよおい。 1ヶ月近く風邪と後遺症で悩まされるとは思わなんだ。

ToDoあるいは最近の進捗

  • Sphinx1.3
  • NewPC環境構築の話
  • Hyper-V をノートPCでいじる話
  • GitHub, Bitbucketのコメントの返事

エディタの文字幅がなぜか揃わなかった件

ずるずると年越した.

フォント合成したコーディング用フォントが, なぜか半角文字と全角文字の幅が1:2になってくれない. ちゃんとロケールとかも設定したのに何故, と思ってたんですが, 複数の要因があったようです.

まず, 合成元フォントにAdobeのSourceCodeProを使っていたんですが, こいつの文字幅がフォント情報では500になっているのに実際の文字を見ると600になっていたこと. ……結論から言うと, 僕のケースでは関係なかったんですが.

フォントの合成 - ふなWiki

Emacsやターミナルではちゃんと1:2になっているっぽいのにAtomエディタだとなぜか揃わない. 上にあるフォントの調整も行ったのですが, なぜか直らない. 悩むこと数ヶ月. ある日, フォントの大きさをいじっていて気付いた.

行間の設定だコレ\ .

どうやら, 合成した半角文字と全角文字で高さに差があったようで, その分の調整で半角文字が必要以上に詰まっていたようです. 行間に0.2ほどデフォルトから余裕を持たせたところ, 無事に1:2で表示されました.

ちなみに, コーディング用のフォントは

MasayukiFukada/CodeMFont · GitHub

を参考に, 日本語フォントを「源真ゴシックMonospace」を変更して合成しています.

源真ゴシック (げんしんゴシック) | 自家製フォント工房