平衡点
2014/12/05
_ Debian 8.x (Jessie) での TeX 環境
この記事は「TeX & LaTeX Advent Calendar 2014」の 12/05 分の記事です.昨日は @CardinalXaro の 「LaTeXで踊る -TeX & LaTeX Advent Calendar 2014- 」でした(...おお,本当に踊ってるよ).
さて.
一昨年の Advenct Calendar で Ubuntu 12.04/Debian Squeeze での TeXLive (>=2012) 環境 という話を書きました.また(その前の日に)次期安定版 Debian 7.0 'Wheezy' での TeX 環境(特に pTeX 環境)についてなんて事も書いていました(こちらはDebian/Ubuntu JP Advenct Calendar の記事です).
今年の話題はその改訂版になります.なんか @iwamatsu にもネタ振られたし: --nigauri.org--(2014-10-13)
(2014-12-05 08:00 誤字修正)
(2014-12-05 08:30 誤字修正) pLaTeX, upLaTeX の場合に,dvips→ps2pdfwr として PDF を生成する場合にしか触れていないのですが,Postscript 経由で PDF を生成せざるを得ない場合を除いて,dvipdfmx を使う方が良いと思います.
(2014-12-05 09:00 追記) TeXLive リリースマネージャであり,Debian の TeXLive のパッケージメンテナでもある Norbert Perining さんによる Writing Japanese in LaTeX : Part 1 – Introduction | There and back again が同じ日に公開されています.英語の記事ですが,現在使える TeX Engine での日本語組版についてのサマリがありますので,参考になるかと思います.
パッケージとして提供されている TeXLive の状況
昨年 の G.W. にリリースされた Debian 7.x (Wheezy) から,パッケージとして提供されている TeX 環境は TeX Live ベースへ移行しています.Wheezy で提供されている TeX 環境は TeXLive 2012 でしたが,Jessie で提供される TeX 環境は Debian -- Details of package texlive-full in jessie によれば 2014.20141024-1 となっています.TeXLive 2014 + 10/24までの更新,ですね:
% pdflatex This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) (preloaded format=pdflatex) restricted \write18 enabled. ,**
とか
% platex This is e-pTeX, Version 3.14159265-p3.5-130605-2.6 (utf8.euc) (TeX Live 2015/dev/Debian) (preloaded format=platex) restricted \write18 enabled. ,**
みたいに.
ちなみに Debian の TeX 関連パッケージは基本的に TeXLive のリリース版を適切に分割してまとめることで生成されています.「バージョンが古い」とか「○○が無い」という場合には,CTAN: Comprehensive TeX Archive Network に登録されていないか,CTAN に集録されている版の更新が遅れているのが原因(であることが多い)です.
新規インストール
何も考えずに
% sudo apt-get install texlive-full
でも良いですが,結構なサイズになります(とはいえ,今時数GB程度だと気にならないかと思いますけれど).
個別にインストールする場合は以下の通り.
とりあえず pTeX,upTeX を使えるようにする:
% sudo apt-get install texlive-lang-japanese
上記パッケージを install することで, ptex2pdf も使えるようになります.
XeTeX, LuaTeX も使えるようにする:
% sudo apt-get install texlive-xetex % sudo apt-get install texlive-luatex
DVI と PDF の Viewer はお好みで:
% sudo apt-get install evince xdvik-ja
default デスクトップ環境は Gnome ですから,PDF の閲覧には Evince を使うのかな? 日本語の表示が可能な xdvi, いわゆる pxdvi は xdvik-ja としてパッケージングしています(とはいえ,今なら直接 PDF を閲覧するのが良いと思いますが...).
旧バージョンからのアップグレード
今のところ特にハマり所はありません(無い筈).普通にアップグレードできました.wheezy → jessie のアップグレードに関する(全体の)ドキュメントは現在鋭意修正・更新中ですので,もしTeX関連のアップグレードに失敗するみたいでしたら,御気軽にご連絡下さい or BTS に投稿下さい.
日本語が扱えるTeX あれこれ
昨年の TeX Advent Calender の記事ですが, @_yuu_ による LaTeX - TeX処理系御伽話 なんかが参考になるのではないでしょうか?
個人的には,
- pLaTeX: (計算機にそれほど詳しくない)他人とデータのやりとりをする時(共著なんか)
- XeLaTeX or LuaTeX: 個人で作業する時,もしくは複数人でも説明が楽な相手の場合
と使い分けています.
以下,処理系毎に「現状」に関してまとめていきます.
pTeX
多分,多くの人々が現状では p(La)TeX をお使いかと思います.共著作業の際に(年上の方々に)説明するのが楽ですし,学会のTeXフォーマットが p(La)TeX 前提だったりするので,わりと離れられませんよね....
dvipdfmx, dvips+ps2pdfwrを使用した日本語フォントの埋め込みと xdvik-ja での表示の制御に関して.以前提供されていた updmap-setup-kanji{,-sys} コマンドは kanji-config-updmap{,-sys} コマンドに rename されていますので,
フォントを埋め込まない場合:
% kanji-config-updmap noEmbed or % sudo kanji-config-updmap-sys noEmbed
IPAexフォントを埋め込む場合:
% sudo apt-get install fonts-ipaexfonts # <-- install されていなかったら. % kanji-config-updmap ipaex or % sudo kanji-config-updmap-sys ipaex
で,一通り設定が終わります.
ただし,現状では dvips + ps2pdfwr での処理がちょっと半端(?)です.
まず, noEmbed を指定した場合.
platex → dvips で生成された PostScript では実フォント名が用いられません(望んだ動作だと思います).しかしながら,これを ps2pdfwr で処理すると, Ryumin-Light, GothicBBB-Medium として /usr/share/fonts/truetype/fonts-japanese-{mincho,gothic}.ttf が埋め込まれます(これらのフォントは alternatives で切り替え可能です).
この挙動の制御は Ghostscript の管轄で,Debian の場合は /etc/ghostscript/cidfmap.d/90gs-cjk-resource-japan1.conf で設定されています(この設定のおかげで,PostScript 内で Ryumin-Light, GothicBBB-Medium で指定されている場合でも gs で表示が可能なわけです). noEmbed なのに PDF 生成までやると /usr/share/fonts/truetype/fonts-japanese-{mincho,gothic}.ttf が埋め込まれるってのは混乱しないかな,とか思ったりもします(PDFの規格としては埋め込むのが正しいですが).
次に, ipaex を指定した場合. platex→dvips で PostScript を生成すると,ファイル中のフォント指定が IPAex{Mincho,Gothic}-H になります. ですが,現在 Debian で提供されている Ghostscript には,IPAexフォントのエントリがありません(ので gs での Postscript 表示, ps2pdfwr での PDF 生成に失敗します).以下の手順で設定が必要です:
/etc/ghostscript/cidfmap.d/ 以下に, 10-local-ipaexfonts.conf 等の名前で以下のファイルを置きます. 番号はとりあえず 10 番台にしました.
/IPAexMincho << /FileType /TrueType /Path (/usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf) /SubfontID 0 /CSI [(Japan1) 6] >> ; /IPAexGothic << /FileType /TrueType /Path (/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf) /SubfontID 0 /CSI [(Japan1) 6] >> ; /IPAMincho << /FileType /TrueType /Path (/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf) /SubfontID 0 /CSI [(Japan1) 6] >> ; /IPAGothic << /FileType /TrueType /Path (/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf) /SubfontID 0 /CSI [(Japan1) 6] >> ;
以下を唱えます
% sudo update-gsfontmap
これで, Ghostscript から IPAex{Mincho,gothic} が見えるようになり,IPAex フォントを埋め込んだ PDF を生成することができます.
upTeX
状況は pTeX と変わりませんので kanji-config-updmap{,-sys} で設定して下さい.
ただし, dvips→ps2pdfwr の場合には,ちゃんとグリフ探せない場合がありますね.新しく文書を書き始める場合には dvipdfmx を使う方が良い思いますが,必要に迫られて dvips→ps2pdfr でPDFを生成する場合には,どうしたら良いかな....
XeTeX
パッケージで提供されている ZXjatype, ZXjafont, BXjscls のバージョンは
- ZXjatype: v0.6
- ZXjafont: v0.2
- BXjscls: v0.3a
となっていますので,とりあえず日本語での組版に困る事はないでしょう(BXjscls が古い...?). 例えば以下のソースを xelatex で typeset することで,IPA{明朝,ゴシック}が埋め込まれた PDF が生成されます.
# source: tex \documentclass[a4paper]{bxjsarticle} \usepackage{zxjatype} \usepackage[ipa]{zxjafont} \usepackage{xltxtra} \begin{document} \section{幸田露伴「雲のいろ〳〵――卿雲」} 景雲といひ、卿雲といひ、慶雲といへる、しかと指し定められたる雲にはあらざるべし。 卿雲爛たり糺縵〻たり、といへる、煙にあらず雲にあらず紫を曳き光を流す、といへる、 大人作矣、五色氤氳、といへる、金柯初めて繞繚、玉葉漸く氤氳、といへる、 還つて九霄に入りて沆瀣を成し、夕嵐生ずる處鶴松に歸る、 といへる詩の句などによりて見れば、歸するところは美しき雲といふまでなり。 \end{document}
luaTeX
LuaTeX-ja も更新されています.例えば以下のソースを lualatex で typeset することで,IPAex{明朝,ゴシック}が埋め込まれた PDF が生成されます.
# source: tex \documentclass{ltjsarticle} \usepackage[ipaex]{luatexja-preset} \begin{document} \section{幸田露伴「雲のいろ〳〵――卿雲」} 景雲といひ、卿雲といひ、慶雲といへる、しかと指し定められたる雲にはあらざるべし。 卿雲爛たり糺縵〻たり、といへる、煙にあらず雲にあらず紫を曳き光を流す、といへる、 大人作矣、五色氤氳、といへる、金柯初めて繞繚、玉葉漸く氤氳、といへる、 還つて九霄に入りて沆瀣を成し、夕嵐生ずる處鶴松に歸る、 といへる詩の句などによりて見れば、歸するところは美しき雲といふまでなり。 \end{document}
番外: pdfLaTeX で日本語組版
pdfLaTeX で処理を行ないたい場合には,パッケージが提供している BXjscls が古い(v0.3)ので github: zr-tex8r/BXjscls より取得して install しましょう.そうすると,例えば以下を pdflatex で typeset することで,PDF が生成されます.
# source: tex \documentclass[pdflatex,jadriver=standard]{bxjsarticle} \begin{document} \section{幸田露伴「雲のいろ〳〵――卿雲」} 景雲といひ、卿雲といひ、慶雲といへる、しかと指し定められたる雲にはあらざるべし。 卿雲爛たり糺縵〻たり、といへる、煙にあらず雲にあらず紫を曳き光を流す、といへる、 大人作矣、五色氤氳、といへる、金柯初めて繞繚、玉葉漸く氤氳、といへる、 還つて九霄に入りて沆瀣を成し、夕嵐生ずる處鶴松に歸る、 といへる詩の句などによりて見れば、歸するところは美しき雲といふまでなり。 \end{document}
「tlmgr 使いたいんですけれど...?」
Ubuntu 12.04/Debian Squeeze での TeXLive (>=2012) 環境 の 2014 版を実行することになります.新しい equivs 用の control ファイルは Debian support - TeX Live - TeX Users Group で提供されていますので,これを使って下さい.
詳細は以前の記事を参照下さい.
まとめ
以上,駆け足でしたが,現在の Jessie での TeX 環境についてまとめてみました.Ubuntu は最近まったく触らなくなったので良く知りませんが,14.04 あたりなら,そんなに状況は変わっていないんじゃないかと思います.
そんなこんなで.
明日は mattskala の予定です.よろしくお願いします.
参考文献
- 次期安定版 Debian 7.0 'Wheezy' での TeX 環境(特に pTeX 環境)について
- Ubuntu 12.04/Debian Squeeze での TeXLive (>=2012) 環境
- Writing Japanese in LaTeX : Part 1 – Introduction | There and back again
- KeN's GNU/Linux Diary | Debian SqueezeでのGhostscriptフォント設定方針
- Debian -- Details of package texlive-full in jessie
- LaTeX - TeX処理系御伽話
- Debian support - TeX Live - TeX Users Group
- TeX Wiki
2014/12/10
_ migemo-el のエラー
Emacs 24.4 + cmigemo + migemo-el(emacs-jp版)で,たまに以下のエラー. (「保険」を探そうとして HoKe の段階で出た backtrace )
Debugger entered--Lisp error: (invalid-regexp "Unmatched [ or [^") re-search-backward("\\(保[[:space:]^M\n]*[険健]\\|ホ[[:space:]^M\n]*ケ[[:space:]^M\n]*[ンノネヌニナ]\\|ほ[[:space:]^M\n]*け[[:space:]^M\n]*[んのねぬにな]\\|h[[:space:]^M\n]*o[[:space:]^M\n]*k[[:space:]^M\n]*e[[:space:]^M\n]*n\\|h[[:space:]^M\n]*o[[:space:]^M\n]*k[[:space:]^M\n]*e[[:space:]^M" 71698 t) isearch-lazy-highlight-search() byte-code("\306^X\307 ^Yr\310\216\311\n!\203^Y^@\312 \n=\204^Y^@\313\n!\210\212\314 ^[\315\216\f\203'^@^M\202)^@^N^]b\210^N^^\203^K^A\316 ^^^_^N \203G^@^N S\211^V \317X\203G^@\306^V^^^N^_\203\315^@\317\224\317\225^^!\211^^\"^N!U\203\232^@\f\203}^@^N\"^N#\203k^@^N^]\202m^@\320 U\203w^@\306^V^_\202\300^@\321u\210\202\300^@^N\"^N#\203\210^@^M\202\212^@\322 U\203\224^@\306^V^_\202\300^@\323u\210\202\300^@\324^N\"^N!\"\211^^$^N%B^V%\325^N$\326\327#\210\325^N$\330^N&#\210\325^N$\331\312 #\210)\f\203\311^@`^U\202\314^@`^V^]*^N^_\204^G^A^N#\203\340^@\306^V^^\332^V'\202^G^A\332^V#\f\203\370^@\322 ^U^N(\206\360^@e\322 ]b\210\202^G^A\320 ^V^]^N)\206^B^Ad\320 ^b\210)\202+^@^N'?\205^Z^A\333^N*\306\334#\211^V+.^G\207" [inhibit-quit save-selected-window--state isearch-lazy-highlight-window save-match-data-internal isearch-lazy-highlight-forward isearch-lazy-highlight-end nil internal--before-save-selected-window ((internal--after-save-selected-window save-selected-window--state)) window-live-p selected-window select-window match-data ((byte-code "\301^H\302\"\207" [save-match-data-internal set-match-data evaporate] 3)) isearch-lazy-highlight-search 0 window-end 1 window-start -1 make-overlay overlay-put priority 1000 face window t run-at-time isearch-lazy-highlight-update isearch-lazy-highlight-start looping found max me mb isearch-lazy-highlight-wrapped ov isearch-lazy-highlight-overlays lazy-highlight-face nomore isearch-lazy-highlight-start-limit isearch-lazy-highlight-end-limit lazy-highlight-interval isearch-lazy-highlight-timer] 5) isearch-lazy-highlight-update() apply(isearch-lazy-highlight-update nil) byte-code("r\301^H\302H^H\303H\"\210)\301\207" [timer apply 5 6] 4) timer-event-handler([t 0 0 250000 nil isearch-lazy-highlight-update nil idle 0])
なんか,timer まわりの変更で悲鳴上がってた気がするんだけれど,なんだったっけ?
とりあえず
(setq migemo-isearch-min-length 2) (setq migemo-use-frequent-pattern-alist nil)
が必要だなぁ. 今回のは後者が原因.
2014/12/11
2014/12/12
_ unblock result: cmigemo
昨日送ったl unblock request(#772791 - unblock: cmigemo/1:1.2+gh0.20140306-5)にお返事
On Thu, Dec 11, 2014 at 02:40:47PM +0900, Youhei SASAKI wrote: > These two variables fix migemo + isearch error reported #772786. This bug is severity:normal. Unless that severity is incorrect, this is no longer appropriate for this stage of the freeeze, so I'm declining your request.
..おおっと!
2014/12/18
_ NetworkManager で仮想環境用に bridge を作成
始めに
ラップトップでは上流のネットワークが有線だったり無線だったりで、ちょっと面倒ですね.
virt-managerなんかでdnsmasqを用いたNATネットワークを使うと,この辺上手くやってくれるので大分楽なんですけれど,
- そもそも,ホスト環境であるラップトップ側で dnsmasq は既に動いているので,virt-manager から dnsmasq が二重に上がる.別に何か問題がある訳じゃないけれど,気にいらない.
- 仮想環境側のアドレスがコロコロと変わるのがちょっと.dnsmasq の dhcpd 機能で IP を渡しているのだけれども,仮想MACアドレスに対応して固定のIPを振ったとしても,lease time が過ぎると毎回アドレス取得している感じ.
といった点が気になっていました.
そんな訳で,矢吹さんのノートPCで、LXCを運用するときのTIPS - Yukiharu YABUKI の tDiary(2011-10-30)を参考に bridge インターフェースを作成して iptables で NAT する様にしてみたのですが,今度は仮想環境側を落とした後に NetworkManager が
(プロセス番号) libnm-glib-WARNING **: Error in get_property: Method "Get" with signature "ss" on interface "org.freedesktop.DBus.Properties" doesn't exist
と悲鳴を上げる様になりました.
さて,どうするか,…としばし悩みましたが,良く見たら NetworkManager でも bridge を管理できるみたいで.試しに NetworkManager 側で bridge を作成してみたら上記の悲鳴は出なくなりました.というわけで,その手順のメモなど.
環境は
% lsb_release -a LSB Version: (略) Distributor ID: Debian Description: Debian GNU/Linux 8.0 (jessie) Release: 8.0 Codename: jessie
となっています(…が,sid です.良く見たら /etc/debian_version も 8.0 になってるな.freeze 期間だからかしら).Wheezy の NetworkManager でもブリッジって作成できるのかしらん?
NAT の設定
iptables で,bridge から現在接続されている上流(eth0 or wlan0) への NAT を設定します.
先ず /etc/sysctl.d/ 以下に適当なファイル名(vm-forward.conf としました)で以下の内容を記載しておきます.
net.ipv4.ip_forward=1
その後
% sudo sysctl -p
で設定を反映.
次に,iptables で
% sudo iptables -A FORWARD -i [bridge name] -s XXX.XXX.XXX.0/24 -m conntrack --ctstate NEW -j ACCEPT % sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT % sudo iptables -t nat -A POSTROUTING -s XXX.XXX.XXX.0/24 -j MASQUERADE % sudo iptables-save % sudo /etc/init.d/netfilter-persistent
として,iptables の設定を更新します. XXX.XXX.XXX.0/24 はブリッジに振る/仮想マシンに振る IP 空間, [bridge name] は作成する bridge インターフェースの名前です.
以上で,ブリッジインターフェースからの接続を上流に IP Masquerade できるようになります.
NetworkManager でブリッジの作成
nm-connection-editor で作成するのが楽です.自動起動にチェックを入れておくと,常にブリッジインターフェースが存在するので,ホストがネットワークに接続されていない場合でも仮想環境とは通信が可能です.
ちなみに,ログ見てたら /usr/bin/arping を実行しようとしていました. とりあえず /usr/sbin/arping からの symbolic link を貼っておきましたが, これ Bug なのかしら…?
virt-manager, lxc での設定
virt-manager で作成した仮想ネットワークは削除して,仮想マシン側で NIC に作成したブリッジを割り当てておきます.
lxc でコンテナを作成する際には
lxc.network.type=veth lxc.network.link=[bridge name] lxc.network.flags=up
としておけば良いかと.
まとめ
というわけで,気になっていた
- dnsmasq の二重起動
- 仮想環境側の IP を固定
- NetworkManager の悲鳴
が解決された様です.
外界と仮想環境とを接続したい,と思ったら一手間かける必要がありそうですが,とりあえずこれで運用して,どうなるか試してみます.
2014/12/19
_ モードラインのダイエット (1/n)
元ネタ:
というわけで, 現在設定中…
DDSKKのモード表示
SKK の ON/OFF や入力モードを切り替える度にモードラインがピョコピョコと動いてちょっと煩わしい とりあえず安直に advice かけてみたり.
(defadvice skk-make-indicator-alist (after my:set-skk-default-indicator activate) (dolist (elem '((abbrev " [aA]" . "--[aA]:") (latin " [_A]" . "--[_A]:") (default " [--]" . "--[--]:"))) (setq ad-return-value (append (cons elem nil) (delq (assoc (car elem) ad-return-value) ad-return-value)))))
本来は face の設定もある筈なのであまり良くないが,そもそも face は設定していないから,とりあえず良しとする.
でも,skk を一回は ON にしないと駄目っぽいなぁ.find-file-hooks あたりに hook かけたら良いのだろうか?
2014/12/20
_ モードラインのダイエット (2/n)
昨日 の続き。
DDSKK のモード表示,その2
昨日の advice に付け加えて,安直だけれど major-mode の切替時に一度 skk を呼ぶことで modeline を更新することに. ~/.skk に
(defadvice skk-make-indicator-alist (after my:set-skk-default-indicator activate) (dolist (elem '((abbrev " [aA]" . "--[aA]:") (latin " [_A]" . "--[_A]:") (default " [--]" . "--[--]:"))) (setq ad-return-value (append (cons elem nil) (delq (assoc (car elem) ad-return-value) ad-return-value)))))
~/.emacs.d/init.el に
(defun my:update-modeline-for-ddskk () "" (progn (skk-mode) (skk-mode))) (add-hook 'after-change-major-mode-hook 'my:update-modeline-for-ddskk)
かっこ悪いなぁ….トグルする関数無かったっけ?
elscreen
上に TAB を表示させているので,modeline に番号を表示する必要はない. modeline に番号を表示するかどうかについての設定は
(setq elscreen-display-screen-number nil)
で良い.
良い…のだが,初回起動時に常に mode-line-format が更新されている. これは require された時に
(let ((point (memq 'mode-line-position mode-line-format)) (elscreen-mode-line-elm '(elscreen-display-screen-number (" " elscreen-mode-line-string)))) (when (null (member elscreen-mode-line-elm mode-line-format)) (setcdr point (cons elscreen-mode-line-elm (cdr point)))))
が実行されているから. 安直にはこれをコメントアウトすれば良いのだけれど,なんか良い方法無いかなぁ….
major-mode, minor mode の表示設定
カスタマイズする際には以下を参考に
- mode-lineのモード情報をコンパクトに表示する - Life is very short
- Hiding and replacing modeline strings with clean-mode-line - Mastering Emacs
考えてみれば minor-mode の表示は見ていないので,全部非表示にしても全く問題無い.というわけで, ~/.emacs.d/init.el に
(defvar my:mode-line-cleaner-alist '( ;; major, (global-whitespace-mode . "") (lisp-interaction-mode . "LI") (emacs-lisp-mode . "EL") ;; ... )) (defun my:clean-mode-line () (interactive) (setq minor-mode-alist nil) (loop for (mode . mode-str) in my:mode-line-cleaner-alist do (when (eq mode major-mode) (setq mode-name mode-str)))) (add-hook 'after-change-major-mode-hook 'my:clean-mode-line)
としてみたり.
結果
結局,こんな感じ.
時計とか行数は全く表示させていないので,右側がとってもシンプルだけれど,まあ良いか,という.