Ubuntu16.04LTSにTeXLive2017を再インストール

とある理由で、再インストールすることに。以下、手順をメモ。

まずは、アンインストール。これが面倒。あちこちにあるtexlive関係のファイルと、無効になるシンボリックリンクなどを一掃する。やり方は検索すると出てくるので、ここは省略。

LINUXにインストールする方法は幾つかあるが、TeXLive本家の最新版からネットインストールする。install-tl-unx.tar.gz をダウンロードして、その階層で tar xvf install-tl-unx.tar.gz などとして解凍する。すると、install-tl-20180204 (数字は、そのときの日付になるのだろう、多分) というフォルダーができる。その中に入り、
sudo ./install-tl
として、ルート権限でインストールすると、/usr/local/texlive/ 以下にインストールされる。ルート権限なしで自分のホームにインストールすることも可能だが、環境変数などを指定することになる。ここでは、前と同じように、/usr/local/texlive とした。

30分ほどでインストール完了。実行ファイルは /usr/local/texlive/2017/bin/x86_64-linux にあるので、これをPATHに追加する。ホーム直下の .profile に
PATH=”/usr/local/texlive/2017/bin/x86_64-linux:$PATH”
を追加する。

これで終わりではなく、ダミーのパッケージを入れる。これは、Ubuntuのパッケージ管理プログラムによって、いらぬ変更をさせないために必要らしい。以前は、この作業をしていなかった。

引き続き、インストーラーがある階層で作業する。ここで、
sudo apt install equivs
wget http://www.tug.org/texlive/files/debian-equivs-2017-ex.txt
equivs-build debian-equivs-2017-ex.txt
sudo dpkg -i texlive-local_2017-1_all.deb
とするとダミーパッケージができるらしい。このあたりは、みようみまね。

[追記]
ちょっと困ったことが。試しに tlmgr を使ってみようと思ったのだが、sudo tlmgr update –list としたところ、command not found なるエラーが。sudoなしのtlmgrだと認識するのだが、管理者権限でtexlive入れたからなあ。検索したところ、同様の事例はけっこうあるようだ。

[追記2]
セキュリティーの関係で、sudo時はユーザーPATHは引き継がれないようだ。少なくとも Ubuntu 16.04 の場合は。パスを追加することも考えたが、/usr/local/texlive 以下のオーナーを自分に変更してしまうことにした。sudoでインストールしているから、現状はオーナー root, グループもrootとなっている。そこで、
sudo chown -R $USER:$USER /usr/local/texlive/
として、オーナー、グループともに、自分に変更。すると、書き込み可能となるので、普通に tlmger できる。とりあえず、これで行こうかと思う。

TextMate2メモ(4) LaTeX Bundleの変更(別バージョン)

TextMateのLaTeX bundleで,LaTeXの実行を指示している箇所が texmate.py にあるので,そこを直接修正することで uplatex での組版ができるようにした。具体的には,pdflatexが選択されているときは,これをptex2pdfで置き換え,また,latexが選択されているときは,これをuplatexで置き換えた。また,latexのあとは,dviをpdfに変換するのだが,dvi2psとps2pdfの組合せの代わりに,dvipdfmxを使うように変更した。具体的は変更は以下の通り。

編集するファイルは,
~/Library/Application Support/TextMate/Managed/Bundles/latex.tmbundle/Support/bin/texmate.py
補助的な関数の定義のあと,914行目からメインのルーティンが始まる。command の種類によって,様々な処理を行うようになっているが,メインは command が latex の場合。そこで,途中の
elif command == 'latex':
以下のブロック(1044行目あたり以降)を次のように書き換えた。

    elif command == 'latex':
        engine_options = construct_engine_options(typesetting_directives,
                                                  tm_engine_options, synctex)
        if engine == 'latex':
            engine = 'uplatex'
            engine_options = "-shell-escape -synctex=1 -interaction=nonstopmode"
        elif engine == 'pdflatex':
            engine = 'ptex2pdf'
            engine_options = "-u -l -ot \"-interaction=nonstopmode -synctex=1 -file-line-error -shell-escape\" "

        command = "{} {}".format(engine, engine_options)
        status = run_latex(command, filename, cache_filename, verbose)
        tex_status, fatal_error, number_errors, number_warnings = status
        number_runs = 1

        if engine == 'latex':
        #    call("dvips {0}.dvi -o '{0}.ps'".format(file_without_suffix),
        #         shell=True)
        #    call("ps2pdf '{}.ps'".format(file_without_suffix), shell=True)
            call("dvipdfmx {0}.dvi", shell=True)
        if tm_autoview and number_errors < 1 and not suppress_viewer:
            viewer_status = run_viewer(
                viewer, filepath, pdffile_path,
                number_errors > 1 or number_warnings > 0 and
                tm_preferences['latexKeepLogWin'],
                'pdfsync' in packages or synctex, line_number)

TextMate2メモ(3) LaTeX Bundleの変更(簡易版)

TextMateのLaTeX bundleは,platex, uplatexをサポートしていない。また,デフォルトはpdflatexとなっている。自分が使いたいのは,uplatexなので,最小限の手間でこれが使えるようにした。実際には,ptex2pdf を使うことにした。これが uplatex, dvipdfmx を順に呼び出してPDFを作るので,pdflatexと同じというわけだ。

~/Library/Application Support/TextMate/Managed/Bundles/latex.tmbundle/Support/lib/Python/tmprefs.py を編集する。36行目からの

        self.default_values = {
            'latexAutoView': True,
            'latexEngine': "pdflatex",
            'latexEngineOptions': "",
            'latexVerbose': False,
            'latexUselatexmk': True,
            'latexViewer': "TextMate",
            'latexKeepLogWin': True,
            'latexDebug': False,
        }

を次のように書き換えた。

        self.default_values = {
            'latexAutoView': True,
            'latexEngine': "ptex2pdf",
            'latexEngineOptions': '-u -l -ot "-synctex=1 -file-line-error -shell-escape"',
            'latexVerbose': True,
            'latexUselatexmk': False,
            'latexViewer': "TextMate",
            'latexKeepLogWin': True,
            'latexDebug': False,
        }

ポイントは,デフォルトのlatexEngineをptex2pdfにして,デフォルトのlatexEngineOptionsを-u -l -ot “-synctex=1 -file-line-error -shell-escape” にしたこと。これで,とりあえずコンパイルできる。ただし,コンソールを見ると,冒頭部分に,
Multiple filename arguments? OK, I’ll take the latter one.
と出力されるので,良きに計らってはくれているものの,パラメーターが正しく渡されていないようだ。

TextMate2メモ(1)

そういえば TextMate というプログラマー御用達のエディターがあったなあ,と検索。以前は日本語が使えなかったと思うが,最新のTextMate2 では普通に日本語が使えるらしい。LaTeX Bundleもあるが,デフォルトがpdflatexで,platex, uplatexは選べない。

ちょっと工夫すれば,uplatex でのコンパイルも出来るようだ。以下,メモ。

一番お手軽なのは,TeX文書の冒頭に,

%!TEX TS-program = ptex2pdf
%!TEX TS-options = -u -l

と,UNIXのshebang的な指示を加えること。ただし,これはエディターによって形式が異なり,TextMateのものは,TeXShopやSublime Textのものとは少し異なっているようだ。できれば,これじゃなく,LaTeX Bundleに手を加えてみたい。

Atomに移行中

LaTeX用のエディターは,ずっとTeXShopを使っていたのだが,Code foldingができない,アウトライン(sectionなどの構造表示)ができない,ファイルをたくさん開くと動作が重い,などなど,不満が出てきて,代替案を探していた。しばらくは Sublime Text 3 を使っていた。幾つかのPackageを入れることで,まずまず満足できる環境にはなっているのだが,先日Atomをインストールしたところ,ずっと簡単にLaTeX環境が作れて,おまけに,パッケージの設定も(Sublime Textが直接設定ファイルを修正するのと比べて)初心者でも安心して出来る形式になっている。余計な装飾やアイコンなどがないため,画面も広く使えるし,ファイルブラウザーの表示・非表示も簡単,アウトラインも出る,コード・フォールディングも出来る,と良いことずくめ。

ということで,Atomに移行しようかと思う。設定などのメモはまたいずれ。

自家用の簡易版wrapfigure

まだ欠点があるが,とりあえず自家用としては使えるものが出来たので,メモ。

\makeatletter
\newcount\@HangLines
\newdimen\@IndentWidth
\let\@CurrentPar=\par
\def\@hangcarrypar{% hanging indentationの間は,\parはこの\@hangcarryparに置き換えられる。
	\edef\next{\hangafter=\the\hangafter\hangindent=\the\hangindent}% 現在の値を後で使うため
	\@CurrentPar %% パラグラフを終了。現在,垂直モードのはず。
	\next %%新しいパラグラフで以前の\hangindent, \hangafterを復活させる。
	\edef\next{\prevgraf=\the\prevgraf}% これまでのパラグラフで組み立てた行数を後で参照するため
	\ifnum\prevgraf>\@HangLines %% すでに組み立て行数が指定の字下げ行数より大きい場合は,
		\hangafter=0\hangindent=0pt\prevgraf=0 %%字下げを終了させて,
		\let\par=\@CurrentPar %% \parを元に戻す。
	\else %% まだまだ字下げを続行する場合。
		\leavevmode %% これなしに垂直モードのまま\next だとずっと字下げが続いてダメだった。
		%% しかし,これがあるため,\parが連続したとき無視されずに改行されるという欠点あり。要改良
		\next %% これまで組み立てた行数を\prevgrafに代入する。
	\fi}
\def\MyWrapFig#1#2#3{% #1=Lines, #2=Width, #3=図版など
	\@HangLines=#1%
	\@IndentWidth=#2%
	\setbox0=\vbox{#3}%
	\dimen0=\hsize \advance\dimen0 -\@IndentWidth
	\par
	\vbox to 0pt{\moveright\dimen0\box0\vss}%
	\vskip -\parskip
	\vskip -\baselineskip
	\def\par{\@hangcarrypar}
	\prevgraf=0%
	\hangafter=-#1
	\hangindent=-#2\relax
}
\makeatother

LaTeXのwrapfigureと黒魔術

図版の配置には,wrapfig.styによるwrapfigure環境を使っているのだが,たまに上手く行かないことがある。一番困るのは,図版はとっくに終わって,テキストの回り込み(短くなる部分)も終わっているのに,次の段落で,またもテキストが短くなってしまう現象だ。

前回これが発生したときは,wrapfigure環境の直後が垂直モードで,おそらくはそれが原因。そして \leavevmode を入れることで解決した。しかし,今回はそれとは違う。

原因は分からないものの,wrapfigureが行っている \parshape 関係の処理を強制的にリセットすれば何とかなるはず。検索したところ,同じ症状の人がいるようで,それを参考に以下のコードを挿入。

\makeatletter
\@@par \ifnum\@@parshape=\z@ \let\WF@pspars\@empty \fi % reset `parshape'
\global\advance\c@WF@wrappedlines-\prevgraf \prevgraf\z@
\ifnum\c@WF@wrappedlines< \tw@ \WF@finale \fi
\makeatother

要するに,wrapfigureの内部マクロに直接アクセスしているわけで,いささか黒魔術的ではあるが,仕方ない。

Ghostscript 9.07をソースからビルド(Mac)

[修正版]

とある事情(Asymptote関係)で,Ghostscripの9.14以前のバージョンをインストールすることにした。Ghostscript/GhostPDL Old Releasesにいろいろあるが,./configure で文句を言われなかった 9.07 を入れることに。適当な所にダウンロードして解凍し,中に入って,./configure, make, make install で終了。詳しくは,

tar xvzf ghostscript-9.07.tar.gz
cd ghostscript-9.07
LDFLAGS="-L/usr/lib" ./configure --disable-compile-inits --prefix=/usr/local/gs907
make
make install

[修正]ここで,ポイントは --disable-compile-inits なるオプション。最初はこれを付けなかったのだが,どうもこれがないと,Resource以下が作られないようだ。 LDFLAGS="-L/usr/lib" はシステムのライブラリーを先に探せ,というもの。prefixがデフォルトの /usr/local 以外なので,付けてみた。MacPortsなどのライブラリーと混同させないためにはこれがあると良いという。オフィシャルのインストールガイドを見て,追加してみた。[/修正]

これで分かるように,/usr/local/gs907 以下にインストールした。このバージョンのgsを使うときは,/usr/local/gs907/bin にパスの優先権を与えるようにしなくてはならない。

実は,これだけではフォント関係のファイル群が足りない。それは別途用意する必要がある。ちょっとインチキなのだが,以前Homebrewで入れていた(今はもうリンクが切れている)9.07の残骸があったので,そこからフォント関係のResourceをコピーして代用することにした。
[修正]ここも直した。Resource以下があるので,TeXLive2016付属の cjk-gs-integrate スクリプトにより,フォント関係をインストールできる。具体的には,このgsにパスを通したあとで,

sudo cjk-gs-integrate --link-texmf --force

とすればよい。[/修正]

asymptote 2.16 + ghostscript 9.07 で,texcomman=”platex” として3次元データ込のPDFが作成されることを確認。これが目標だったのだ。TeXLive2016に移行したとき,Homebrewでgsを最新版にしたのだが,古いものがなくなってしまって,ちょっと困っていたのだった。これで以前の環境に戻れると思う。

TeXLive2016に移行完了

[備忘録]
TeXシステムを最新のTeXLive2016に移行した。一応前のシステムも残してあるが、新しい文書はTeXLive2016の方で書くことにした。以下、メモ。

  • TeXLive2016の実行ファイルのパスを /usr/texbin というシンボリック・リンクにして、これを使うことにした。起動時にパスを通すために、これを .profile に追加するのが普通だが、そうしなくても使えている(理由はあとで)ので、以前のシステムを使うためにも、さしあたってはパスは以前のまま。
  • TeXLive2016付属のasymptoteのバージョンは2.38なのだが、古いgsをサポートしていない。そこで、バージョン9.20のgsをHomebrewで入れて、こちらにパスを通すようにした。困ったことに、以前のシステムのasymptote 2.18はgs9.20では使えない。だから、以前のシステムでasymptoteを使うときは、古いgsにパスを通す必要がある。asymptoteだけは完全に新しい方に移行するというのが現実的かもしれない。
  • TeX用のエディターとして Sublime Text 3 を使い始めた。LaTeXToolsを入れ、自前のビルドシステムを準備した。自前のビルドの際に、/usr/texbin にパスを通してプログラムを呼び出すようにしているので、起動時にパスを通しておかなくても動くようにはなっている。
  • LaTeXToolsのビルドシステムを使えば、サブファイルの1行目に、
    %!TeX root = main_file.tex
    

    とメイン・ファイルを指定できるらしいが(ちなみに、これはTeXShopでも可能)、自前ビルドだと、これが使えない。ちょっとのことだが、けっこうイライラするので、なんとかしたい。

  • dvipdfmx まわりが随分と変わったらしく、以前
    \usepackage[dvipdfm]{graphicx,color}
    \usepackage{mediabb}
    

    と書いていた部分は、修正が必要。まず、mediabbは不要、というか使えなくなっているらしい。代わりにdvipdfmxが画像のサイズなどを自動的に調べてくれるようだ。また、graphicxのオプションでは、dvipdfmが使えない。dvipdfm.defがない、というエラーが出る。ドライバーの指定としては、dvipdfmx とすればよい。つまり、

    \usepackage[dvipdfmx]{graphicx,color}
    %\usepackage{mediabb} %% この行は削除する。
    

    と修正する。

TeXLive2016でトンボが切れる件(とりあえず解決)

順次TeXLive2016に移行中だが,トンボが切れてしまうことがあって,悩んでいた。ドキュメントクラスとして jsarticle の方を使えばよいのだが,jarticleを使うと,トンボを付けたとき,右と下が切れてしまうのだ。

\documentclass[b5paper,tombow]{jarticle}

とすると,これまでの tetex だと,a4サイズのPDFのほぼ中央にb5サイズの本体がくる形で,トンボもおおよそ左右上下に均等な感じで印刷されていた。ところが,TeXLive2016に移行して組版したところ,PDFがa4よりかなり小さくて,右と下が切れた感じなのだ。

TeXが生成するdviには,そもそも紙のサイズという概念がなく,通常はa4サイズで出力される,というような話を以前どこかで読んだ記憶があった。dviからpdfへ変換する段階で紙のサイズを指定することができる,という話も。そこで,紙のサイズを指定するために,これも以前行ったように \special{...} を使ってみた。

\documentclass[b5paper,tombow]{jarticle}
\special{papersize=210mm,297mm}

とすることで,トンボ付きa4サイズのPDFが出来た。ということで,とりあえず解決。

ところで,以前サイズ指定を行ったときは,

\documentclass[b5paper,tombow]{jarticle}
\AtBeginDvi{\special{papersize=210mm,297mm}}

のようにしていたと思うのだが,今回はこれではダメだった。何故なんだろう。