2014年6月20日金曜日

Ubuntu 14.04でのEmacsの設定(mozc, YaTeX, SyncTeX, フルスクリーン)

最近MacBook Air (mid 2012)の外付けSSDにUbuntu 14.04をインストールしたので,久しぶりに設定をゴニョゴニョしております.

Emacsの日本語入力では,以前はAnthyを使っていましたが,TeXフォーラムの「emacs, mozc, TeX入力」を見て,mozcでもドル記号を入力したときに自動で直接入力に切り替えることが出来そうだったので設定をしてみました.「~/.emacs.d/init.el」に次のように設定しています.
;;; 言語環境の指定
;;mozcの設定
(require 'mozc)
(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")

;;yatex-modeでドル記号を入力したときに直接入力に切り替える。
(define-key mozc-mode-map "$" 'YaTeX-insert-dollar-or-mozc-insert)
(defun YaTeX-insert-dollar-or-mozc-insert ()
  (interactive)
  (if (eq major-mode 'yatex-mode)
      (YaTeX-insert-dollar)
    (mozc-handle-event ?$)))

その他にも,SyncTeXの設定がしばらく見ない間に変わっていたので,TeXWikiを参考に設定も行いました.
synctex-for-evince-yatex.el」をダウンロードしてemacsが読める場所に置きます.
init.elには次のように書き込んでおきます.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; synctex関連
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;inverse search
(require 'dbus)

(defun un-urlify (fname-or-url)
  "A trivial function that replaces a prefix of file:/// with just /."
  (if (string= (substring fname-or-url 0 8) "file:///")
      (substring fname-or-url 7)
    fname-or-url))

(defun evince-inverse-search (file linecol &rest ignored)
  (let* ((fname (un-urlify file))
         (buf (find-file fname))
         (line (car linecol))
         (col (cadr linecol)))
    (if (null buf)
        (message "[Synctex]: %s is not opened..." fname)
      (switch-to-buffer buf)
      (goto-line (car linecol))
      (unless (= col -1)
        (move-to-column col)))))

(dbus-register-signal
 :session nil "/org/gnome/evince/Window/0"
 "org.gnome.evince.Window" "SyncSource"
 'evince-inverse-search)



;;forward-serach

  (require 'synctex-for-evince-yatex)
  (synctex-for-evince-dbus-initialize)
  (add-hook 'yatex-mode-hook
            '(lambda ()
               (YaTeX-define-key "f" 'synctex-for-evince-yatex-forward-search)))
これでUbuntuでも快適にLaTeX生活を送れるようになりました.

追記:2014/06/23: フルスクリーンの設定を書くのを忘れていました.
以下のように記述しておけば,F11キーでフルスクリーンモードに移れます.
;;フルスクリーンモード
(defun toggle-fullscreen ()
  "Toggle full screen on X11"
  (interactive)
  (when (eq window-system 'x)
    (set-frame-parameter
     nil 'fullscreen
     (when (not (frame-parameter nil 'fullscreen)) 'fullboth))))

(global-set-key [f11] 'toggle-fullscreen)

複数の文書で共通して使いたい文書の置き場所(LaTeX)

LaTeXでLebesgue積分のノートと複素解析のノート,Lie群のノートを作成しているのですが,実数関数についての微積分の内容をすべてのノートに共通させたいと以前から考えていました.

サブフォルダに置いてある文章ならば,import.styを使って読み込むことも可能ですが,同水準のフォルダ間の文章の読み込みは望みの挙動をしてくれる解決策を知りませんでした.
import.styを使うと,サブディレクトリ以外の他ディレクトリのファイルも読み込むことが可能なようです.しかし私が試した限りでは,警告やエラーが出ないものの,期待したファイルを読み込んでいない結果が得られました.またimport.styを使うと,YaTeX側で認識をしてくれないという問題があります(個人的にはこれが一番の問題).


仮に共有したい微積分のノートが「$HOME/notes/calculus」に置いてあるとします.

  • \inputコマンドを使うのであれば,これは相対パスを理解してくれるようなので,\input{../calculus/integral}といった記述をしても問題なくタイプセットを行うことが可能です.

しかし\includeコマンドを使おうと思うと,相対パス表記はLaTeX側で解釈してもらえないようで,エラーが出てしまいます.大規模の文章を扱うときには,\includeonlyコマンドを使って分割タイプセットを行いたいので,\inputしか使えないのは不満が残ります.

  • 別の解決策として1つのPC(OS)しか使わないのであれば,共通させたい文書を入れるフォルダを作って,その他の各文書のフォルダにはシンボリックリンクを貼っておけば良さそうです.
しかしこれにも問題点があって,私はLaTeXのノートをDropboxに保存して複数のPCで共有しているのですが,シンボリックリンクを使った方法だとDropbox上で実ファイルとして認識されてしまうようで,他のPCでは実ファイル化してしまい余計に扱いがややこしくなりました.

現在はMacやLinuxの環境では
  • ~/.bashrcなどに変数TEXINPUTSを
    export TEXINPUTS=$HOME/notes/calculus:$TEXINPUTS
    と記述してTeX側から共有したいファイルの場所が見えるようにする.
という解決策に落ち着きそうです.この方法だと,\include{integral}といった形で読みこめばよく,また\includeonlyコマンドも用いることができます.多くのディレクトリを追加すると,同じファイル名のものがあるときにかなりまずいことが起こりそうな予感がするので,ファイル名には慎重になる必要がありそうです.

YaTeXでincludeonlyの自動補完機能を使うとフルパスを記述されてしまうので,その点がなんとかならないかなとは思いますが,大分やりたいことに近づいたと思います.


2014/06/28:追記: TEXINPUTSを書き換える方法では,上記のように書き換えた場合,$HOME/notes/calculus内にauxファイルがあると,mainファイルに作成されたauxファイルよりもそちらを先に読みにいってしまうため,目次や式番号などが正しく作成されません.共有する文書を入れたディレクトリ内からはauxファイルを削除しておくようにしましょう.

他にも色々な解決法があるようです.
のあたりが参考になります.
\let\include=\inputとするものや,texmf.cnfの中のopenout_any, openin_anyという変数をa (any)にするものもありました.後者はカレントディレクトリの上位ディレクトリの読み書きを許すことになるので,セキュリティー上よろしくないようです.野良TeXファイルをタイプセットしないのであればこれでよいのかも.

    2014年5月20日火曜日

    emacs内でTeX文書の作成からpdf閲覧まで行う

    TeX WikiのEmacsに関する記述を見ていると,sheepheadさんのblog記事:Emacs上のPDFでisearch,occur,imenuとかなんでもしてしまうpdf-toolsの紹介が紹介されていました.Emacs23を導入したときに,EmacsでPDFファイルを表示するDocViewを試したことがありましたが,使い勝手が悪かったためすぐに使わなくなりました.

    まずdoc-view-modeの基本的な操作法をまとめておきます.
    キーコマンド機能
    n'doc-view-next-page次のページ
    p'doc-view-previous-page前のページ
    C-n'doc-view-next-line-or-next-page1行下方へスクロール
    C-p'doc-view-previous-line-or-previous-page1行上方へスクロール
    SPACE'doc-view-scroll-up-or-next-page下方スクロールまたは次のページ
    DEL'doc-view-scroll-down-or-previous-page上方スクロールまたは前のページ
    k'doc-view-kill-proc-and-bufferプロセスを終了しバッファを閉じる
    g'revert-bufferバッファを閉じる
    +'doc-view-enlarge拡大
    -'doc-view-shrink縮小
    カーソルキー -上下左右方向へスクロール
    M-g M-g 'doc-view-goto-page指定したページへ移動
    M->'doc-view-first-page最初のページへ移動
    M-<'doc-view-last-page最後のページへ移動

    上述の記事ではEmacsのdoc-view-modeの使い勝手を良くするEmacs拡張アプリであるpdf-toolsを紹介していたので,早速試してみました.環境はMac OS X MavericksでEmacs 24.4.50を使用しています.

    pdf-toolsを検索してみたのですが,検索上位に現れるGitHubのpolitza/pdf-toolsはLinux環境を前提としているようで,そのままソースをコンパイルしてみるとエラーが出ます.ソースコードを少し書き直すとMacでも使えたという情報も見かけたものの,ソースコードをいじる技術力がないので,誰かMacに対応したものを作っていないか他力本願で探してみるとGitHubにありました.

    axot/pdf-toolsからzipファイルをダウンロードして展開し,ソースをコンパイルしてみるとすんなり通りました.するとソースを展開したフォルダにpdf-tools-0.20.tarというファイルが出来たので,Emacs上で
    M-x package-install-file RET pdf-tools-0.20.tar RET
    
    としてインストールしました.これでdoc-view-mode上で動作する色々なマイナーモードが使用可能になります.

    M-x pdf-tools-helpで各マイナーモードや用意されている関数の説明を見ることができます.


    EmacsからC-x, C-fでpdfファイルを選択して開き
    • pdf-isearch-minor-mode
    • pdf-sync-minor-mode
    • pdf-link-minor-mode
    を試しました.まずdoc-view-modeはimagemagickのconvertコマンドを使ってpdfファイルをpngファイルに変換してEmacsのウィンドウ内に表示します.数ページのpdfファイルであればその変換にかかる時間が気にならないと思いますが,私は普段から数百ページのファイルを扱うことが多いため変換に時間が掛かり,LaTeXファイルのタイプセットの度にpdfファイルを再読み込みして変換をしなければならないため,この時点ですでにげんなりしてしまいます.画像ファイルの解像度が粗いのも気になりました.

    pdf-toolsで今回試したマイナーモードはいずれもよく働きます.
    isearchでは,検索した語句がハイライトされました.

    pdf-links-minor-modeをonにすると,pdfのhyperlinkでジャンプ出来るようになりました.またpdf-sync-minor-modeでは,pdfのダブルクリックした部分に該当するTeXソースファイルの内容が表示されることを確認できます.
    逆にソースファイルからpdfへジャンプする機能については,helpを見ると設定のための関数が用意されているので出来るとは思いますがそこまでは試していません.

    ページの遷移がコマンドで済むことやisearchが出来ることは便利なのですが,ページ数の多いファイルをタイプセットする毎にpdfファイルを読み直して画像ファイルへ変換するという手間がかかることを考えるとあまり実用的ではないかなぁ.

    2014年5月2日金曜日

    tikzを用いた部,章,節のカスタマイズ

    TeX Stack Exchangeのサイトを眺めていて,tikzを使った各種見出しのデザイン変更の仕方でとても格好の良いものが幾つかあったため,リンクをまとめてみます.

    tikzを使えばこんなことも出来るのかと感心させられました.

    2014年5月1日木曜日

    mdframedを用いた定理環境の修飾(platex+dvipdfmx, tikz)

    追記:2016/04/19 定理環境をmdframedを使ったものからtcolorboxを使ったものに変更しました。

    以前にplatexではmdframedでtikzを使った描画はうまくいかない風なことを書きましたが,あれはウソでした。すみません。

    mdframedパッケージを読み込む前に,graphicxパッケージにdvipdfmxオプションを付けて読み込んでおけば使えました。

    前回記事にした定理環境では,定理の番号に章番号や節番号を付けて出力したり参照したりするときに不便なため,書き直しをしました。次のように記述しておけば,platex+dvipdfmxできちんとした出力が得られます。
    \documentclass[a4paper,10pt,papersize]{jsarticle}
    \usepackage{amsmath,amssymb,mathrsfs}
    \usepackage{etoolbox}
    \usepackage[svgnames]{xcolor}
    \usepackage[dvipdfmx]{graphicx}
    \usepackage[framemethod=tikz]{mdframed}
    
    \newcounter{theo}
    \numberwithin{theo}{section}
    \newenvironment{theo}[1][]{%
    \refstepcounter{theo}%
    \ifstrempty{#1}%
    {\mdfsetup{%
    frametitle={%
    \tikz[baseline=(current bounding box.east),outer sep=0pt]
    \node[anchor=east,rectangle,fill=blue!20]
    {\strut 定理~\thetheo.};}}}%
    {\mdfsetup{%
    frametitle={%
    \tikz[baseline=(current bounding box.east),outer sep=0pt]
    \node[anchor=east,rectangle,fill=blue!20]
    {\strut 定理~\thetheo.~#1};}}%
    }%
    \mdfsetup{innertopmargin=5pt,linecolor=blue!20,%
    linewidth=2pt,topline=true,
    frametitleaboveskip=\dimexpr-\ht\strutbox\relax,}
    \begin{mdframed}[]\relax%
    }{\end{mdframed}} 
    
    
    \begin{document}
    
    \section{Riemann積分}
    \begin{theo}[Riemann積分の線型性]
    \label{theo:riemann}
    $\mathscr{R}(I)$を$\mathbb{R}^n$の有界閉区間$I$上でRiemann可積分な実数値関数全体
     の集合とする.$\mathscr{R}(I)$は実ベクトル空間であり,$I$上の積分は
    $\mathscr{R}(I)$から$\mathbb{R}$への線型写像である.即ち
    \begin{equation}
     f, g\in \mathscr{R}(I),\ c\in \mathbb{R}\text{ならば}
    f+g\in \mathscr{R}(I),\ cf\in \mathscr{R}(I)
    \end{equation}
    であり,なおかつ
      \begin{gather}
      \int_I (f+g)(x)\, dx
     =\int_I f(x)\, dx + \int_I g(x)\, dx, \\
      \int_I cf(x)\, dx 
     = c\int_I f(x)\, dx
     \end{gather}
    が成り立つ.
    \end{theo}
    
    定理\,\ref{theo:riemann}は凄い!
    
    \end{document}
    


    これを使って数学ノートのプリアンプルを書き換えました。現在は定理環境が次のような体裁になっています。

    2014年4月3日木曜日

    LaTeXで3本線のノルムを表示

    数学のノートを作っていて,縦3本線のノルム記号を表示したくなったので調べてみました.nath.styというパッケージを導入すると使えるようになるそうなのですが,プリアンプルに記述すると他のパッケージと競合してしまったので,別の方法を探していました.

    TeX StackExchangeの"Spacing between triple vertical lines"でよさげな解決法を見つけたので転記しておきます.

    プリアンプルに以下を記述します.
    \makeatletter
    \newcommand{\opnorm}{\@ifstar\@opnorms\@opnorm}
    \newcommand{\@opnorms}[1]{%
      \left|\mkern-1.5mu\left|\mkern-1.5mu\left|
       #1
      \right|\mkern-1.5mu\right|\mkern-1.5mu\right|
    }
    \newcommand{\@opnorm}[2][]{%
      \mathopen{#1|\mkern-1.5mu#1|\mkern-1.5mu#1|}
      #2
      \mathclose{#1|\mkern-1.5mu#1|\mkern-1.5mu#1|}
    }
    \makeatother
    
    \opnormという命令で,mathtoolsパッケージで定義されているのと同様の記述の仕方で,3本線のノルムを使用することが出来ます.
    \opnorm{a}        % normal size
    \opnorm[\big]{a}  % slightly larger
    \opnorm[\Bigg]{a} % largest
    \opnorm*{a}       % \left and \right
    
    出力結果は次の通りです.