平衡点


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程度だと気にならないかと思いますけれど).

個別にインストールする場合は以下の通り.

  1. とりあえず pTeX,upTeX を使えるようにする:

    % sudo apt-get install texlive-lang-japanese

上記パッケージを install することで, ptex2pdf も使えるようになります.

  1. XeTeX, LuaTeX も使えるようにする:

    % sudo apt-get install texlive-xetex
    % sudo apt-get install texlive-luatex
  2. 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 生成に失敗します).以下の手順で設定が必要です:

  1. /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] >> ;
  2. 以下を唱えます

    % 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 の予定です.よろしくお願いします.

参考文献


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

_ send unblock request: cmigemo

昨日(migemo-elのエラー)の続き.

とりあえず upload して unblock request を送ってみた:


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ネットワークを使うと,この辺上手くやってくれるので大分楽なんですけれど,

  1. そもそも,ホスト環境であるラップトップ側で dnsmasq は既に動いているので,virt-manager から dnsmasq が二重に上がる.別に何か問題がある訳じゃないけれど,気にいらない.
  2. 仮想環境側のアドレスがコロコロと変わるのがちょっと.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

としておけば良いかと.

まとめ

というわけで,気になっていた

  1. dnsmasq の二重起動
  2. 仮想環境側の IP を固定
  3. 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 の表示設定

カスタマイズする際には以下を参考に

考えてみれば 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)

としてみたり.

結果

結局,こんな感じ.

mode-lineのカスタマイズ結果

時計とか行数は全く表示させていないので,右側がとってもシンプルだけれど,まあ良いか,という.


連絡先など
最近の日記
一覧
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|02|03|04|08|09|10|11|12|
2013|01|02|03|04|05|06|08|09|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|09|10|
2016|02|03|
2017|01|02|03|05|06|07|09|11|12|
2018|03|06|07|10|11|12|
2019|01|02|03|04|05|07|10|12|
2020|01|02|03|04|05|08|09|10|11|12|
2021|01|02|03|05|06|07|08|09|11|12|
2022|01|02|03|04|05|06|08|10|11|12|
2023|02|03|04|06|08|09|11|12|
2024|01|02|03|
Back to Top ▲