stack build でエラーが出る

Haskell のパッケージ管理システム便利版の stack というものをいじっていてビルドしようとした際に出たエラーの対処法です。

cabal の他に新しくできた stack というものは、パッケージ依存性の問題(cabal hell)を解決するようにできているそうです。便利。

haskell.e-bigmoon.com

(↑stack の使い方、なぜstackを使うべきかなどが詳細に書かれていますので、 stack の説明は上記のページにお任せすることにします)

stack build できない

stack では、YAML形式の設定ファイルを読み込んでビルドしていくのですが、それを行おうとすると構文解析に失敗します。

Could not parse '(略)/stack.yaml':
Aeson exception:
Error in $['extra-deps'][0]: failed to parse field 'extra-deps': expected PackageIdentifier, encountered Object
See http://docs.haskellstack.org/en/stable/yaml_configuration/

エラーによれば、extra-deps の一つ目で詰まったようです。私のファイルでは

extra-deps:
  - git: [リポジトリのURL]
    commit: [特定のコミット]

という部分の - git: と書いているところが怒られていて、ここにはパッケージの名前が入るべきだと言われていますが、ネットで調べた限りはこれは一応書き方としては間違っていないようですね…

stack のバージョンをあげる

原因は stack のバージョンがあまりにも古いことにあったようです。調べたところ私の stack はなんと version 1.3.2 (2016年12月) でした。 version 1.5.1 よりも古いと上記のエラーが出てしまうみたいです。

$ stack upgrade
Current Stack version: 1.3.2, available download version: 1.9.1
Newer version detected, downloading
Querying for archive location for platform: osx-x86_64-static
Querying for archive location for platform: osx-x86_64
Downloading from: https://github.com/commercialhaskell/stack/releases/download/v1.9.1/stack-1.9.1-osx-x86_64.tar.gz
Download complete, testing executable
Version 1.9.1, Git revision f9d0042c141660e1d38f797e1d426be4a99b2a3c (6168 commits) x86_64 hpack-0.31.0
New stack executable available at (ホームディレクトリ)/.local/bin/stack

新しい stack がダウンロードできたので、/usr/local/bin の stack のリンクを貼り替えます。 リンク先のパスを知るには readlink コマンドが使えます。

$ readlink stack
/Library/Haskell/ghc-8.0.2-x86_64/bin/stack

正しくリンクを貼り替えられたようです。この後、stack build もうまくいきました。

$ stack --version
Version 1.9.1, Git revision f9d0042c141660e1d38f797e1d426be4a99b2a3c (6168 commits) x86_64 hpack-0.31.0

tlmgr: Remote repository is newer than local に対処する

TeX のバージョンアップを要求される

TeX のパッケージマネージャーである tlmgr のバージョンが 2017 から 2018 に上がったために古いものはサポートされていないようです。

$ sudo tlmgr update --self
tlmgr: Remote repository is newer than local (2017 < 2018)
Cross release updates are only supported with
  update-tlmgr-latest(.sh/.exe) --update
Please see https://tug.org/texlive/upgrade.html for details.

そこで、以下のいずれかの選択肢があるのですが…

  • tlmgr そのものを 2017 から 2018 にアップグレードする
  • 2017 のまま使い続ける

セットアップがめんどくさいという非常に後ろ向きな理由ですが 2017 のリポジトリに固定して使い続けてみます。

リポジトリを固定する解決策

以下の方法にしたがってリポジトリを固定し、 TeX Live 2017 のまま使い続けることに。

tex.stackexchange.com

$ sudo tlmgr option repository ftp://tug.org/historic/systems/texlive/2017/tlnet-final
Password:
tlmgr: setting default package repository to ftp://tug.org/historic/systems/texlive/2017/tlnet-final
$ tlmgr --version
tlmgr revision 46207 (2018-01-04 19:34:36 +0100)
tlmgr using installation: /usr/local/texlive/2017basic
TeX Live (http://tug.org/texlive) version 2017

init.el で cask のエラーがでるので旧バージョンに戻す

Emacs の設定ファイルである init.el の読み込みに失敗するようになってしまいました。

Warning (initialization): An error occurred while loading ‘(略)/.emacs.d/init.el’:

error: Given parent class package-recipe is not a class

To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file.  Start Emacs with
the ‘--debug-init’ option to view a complete error backtrace.

原因は cask のアップデートらしい

init.el の中で原因を探したところ、cask という Emacs のパッケージマネージャーのアップデートによるものだったようです。

Cask — Cask 0.8.4 (cask の公式ドキュメント)

cask の設定ファイルは /usr/local/share/emacs/site-lisp/cask/cask.el にあり、その中の defclass の使い方に関連するところでエラーが出ているようです。 …というところまではわかったので(そして Emacs Lisp に詳しくないので…)、とりあえず急場しのぎ的ですが homebrew で cask のバージョンを1つ前に戻します。

homebrew で cask のバージョンを戻す

ローカルにある旧バージョンを消してしまったので()、homebrew の Formula で Git を1つ巻き戻してインストールし直します。 再びここを参照していろいろやってみます。

確かに、つい最近アップデートがあったようです。cask の ログを辿りたいので Formula の中の cask.rb を見てみます。

$ pwd
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
$ git log cask.rb
commit 9e8d64eb8fa735973ba58469072d72ad52bead1e
Author: Sam Brightman <sambrightman@users.noreply.github.com>
Date:   Fri May 11 03:10:45 2018 +0100

    cask 0.8.4 (#27715)

commit 1a9b379d15865c23176862e25d1d9b954656b76d
Author: ilovezfs <ilovezfs@icloud.com>
Date:   Wed Feb 21 00:02:46 2018 -0800

    cask 0.8.3 (#24378)

巻き戻します。

$ git checkout 1a9b379d15865c23176862e25d1d9b954656b76d cask.rb
$ brew unlink cask
Unlinking /usr/local/Cellar/cask/0.8.4... 2 symlinks removed
$ HOMEBREW_NO_AUTO_UPDATE=1 brew install cask
==> Downloading https://github.com/cask/cask/archive/v0.8.3.tar.gz
==> Downloading from https://codeload.github.com/cask/cask/tar.gz/v0.8.3
######################################################################## 100.0%
==> Caveats
Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/cask
==> Summary
🍺  /usr/local/Cellar/cask/0.8.3: 14 files, 167.0KB, built in 4 seconds
$ cask --version
0.8.3
$ git reset --hard
HEAD is now at bddf42a93 wrk-trello: update url

とりあえずはこれでバージョンも1つ前に戻り、うまく動くようになりました。

Coq のバージョンアップに対応する

Coq のバージョンが上がってしまい (Homebrew で 何も考えずに upgrade をかけてしまった) 、いざ Coq を書こうとしてRequire Import [ライブラリの名前] という行を読み込もうとしたら、

Error:
File /Users/(略).vo has bad
magic number 8700 (expected 8800). It is corrupted or was compiled with
another version of Coq.

というエラーが出てしまったのでどうにかしましょうね、という話です。

環境

  • macOS HighSierra 10.13.4
  • Emacs + Proof General
  • Coq version 8.7.2 → 8.8.0 (Homebrew)

proofgeneral.github.io

解決策① Coq を旧バージョンに戻す

Homebrew で Coq を入れているので、バージョンを戻せばなんとかなります。新しいバージョンを入れたばかりなら旧バージョンもローカルに残っていると思うので、とりあえず確認してみます。

$ brew info coq
coq: stable 8.8.0 (bottled), HEAD
Proof assistant for higher-order logic
https://coq.inria.fr/
/usr/local/Cellar/coq/8.7.2 (4,312 files, 217.9MB)
  Poured from bottle on 2018-02-19 at 13:33:15
/usr/local/Cellar/coq/8.8.0 (4,398 files, 220.6MB) *
  Poured from bottle on 2018-05-03 at 10:34:53
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/coq.rb
(…以下略)

8.7.2 と 8.8.0 の2バージョンあるのがわかります。また、現在使われているバージョンである 8.8.0 の方に*印が付いています。

すでに 8.8.0 にしてしまったものを 8.7.2 に戻すには、次のようにします。

$ brew switch coq 8.7.2
Cleaning /usr/local/Cellar/coq/8.8.0
Cleaning /usr/local/Cellar/coq/8.7.2
27 links created for /usr/local/Cellar/coq/8.7.2


下のサイトを参考にさせていただきました: qiita.com

解決策② 新バージョンでライブラリを make し直す

新バージョンで使っていくためには、(ライブラリがうまく対応していればという条件付きですが) 再度コンパイルし直せば大丈夫のようです。

ライブラリのあるディレクトリ(= Makefile が置いてあるディレクトリ) に移動して、

$ make clean

とすれば今までコンパイルされていたもの (主に拡張子が .vo のファイル) が削除されます。そして、新しいバージョンの Coq (今回なら 8.8.0) で

$ make

とします。これで新しいバージョンでのコンパイルがうまくいくはずです。

参考にさせていただきました: http://coq-club.inria.narkive.com/aFqstVbp/ynot

Emacs org-mode : 行の折り返し & 見出し折りたたみ

Emacs の org-mode は最近使い始めたのですが本当に便利ですね。数式を TeX で書けたり、エクスポート先がいろいろあったりするのが嬉しいところです。

行の折り返しの ON/OFF

折り返しの ON/OFF を切り替えたいときは次のようにします。

M-x toggle-truncate-lines

org-mode ではデフォルトでは行を画面の端で折り返さないようになっています。

下のミニバッファにTruncate long lines enabled と出たときは、長い文章は折り返さずに画面をはみ出します。一方、Truncate long lines disabled と出たら、長い文章は折り返されます。

参考にさせていただきました: emacs.rubikitch.com

見出しの折りたたみ

org-mode の便利な点の1つが、見出しで折り畳めるというところです。

文章全体の折りたたみ

C-u C-i

このコマンドを何度も押すと
OVERVIEWCONTENTSSHOW ALLOVERVIEW → …
というように切り替わります。OVERVIEW が大見出しのみ表示、CONTENTS が大見出し・小見出しの表示、 SHOW ALL が本文も含めた全体を表示、となっています。

カーソル位置の見出しの折りたたみ

C-i

現在のカーソル位置の見出しを折りたたみます。何度も同じコマンドを繰り返すことで、
FOLDEDCHILDRENSUBTREEFOLDED → …
と切り替わります。FOLDED は現在の見出し以下を全て折りたたみ、CHILDREN は自分以下の小見出しの表示、SUBTREE は現在の見出しを本文まで全て展開します。

参考にさせていただきました: emacs.rubikitch.com

macOS のクリーンインストール

macOS High Sierra のバックアップをとって macOS を再インストールしようとしたら

The recovery server could not be contacted.

と出たのですが、下の手順を踏んだら解決しました。(クリックするとウェブページに飛びます。)

gist.github.com

ツールバーにあるUtilityオプションからTerminalを選んで起動し、パソコンを Wi-Fi に繋いで、コマンドを実行しましょう。どうやら Apple のサーバーと時刻合わせをしているだけのようです。

LaTeX の日本語フォント切り替え

LaTeX、フォント切り替えが簡単にできたら最高ですよね。
日本語組版用のデフォルトはヒラギノに設定しておいて、游明朝や游ゴシックに pxchfon というパッケージで簡単に切り替えていくための備忘録。

前提:環境

このページを編集している現在の環境は、 BasicTeX 2017 @macOS HighSierra です。Sierra と HighSierra のTeX環境はだいぶ違うのでお気をつけください。そして Sierra から安易に HighSierra に乗り換えると LaTeX の設定をいろいろやり直さないといけなくなるのでご注意ください(自戒)。

HighSierra の設定については以前の投稿に書いてあります。 saphir-jaune.hatenablog.com

pxchfonとは

CTAN: Package pxchfon とは、日本語フォントを設定するためのパッケージ。
ウェブサイトに日本語のマニュアル ( http://mirror.hmc.edu/ctan/language/japanese/pxchfon/pxchfon.pdf )があるのでとってもありがたいです。
TeX Live から配信されているので、簡単にインストールできます。

$ sudo tlmgr install pxchfon

私が主に使っているのは、マニュアル5章の「プリセット指定」のあたりです。

このパッケージの元々の意図は、標準のフォントを普段使っているものと全く別の書体に変えることであったが、例えば「普段使う設定が複数ありそれを簡単に切り替えたい」という場合にも有用である。そこで、pTEX において広く行われている設定をパッケージ内に組み込んで、パッケージオプションでそれを呼び出すという機能を追加した。

だそうです。 5.2節の「多ウェイト用の設定」でフォント/OSごとに具体的に書いてあります。

TeX で使う日本語フォントのリンクがある場所

上述の"以前の投稿"の最後の方にちょろっとデフォルトフォントの設定方法をメモってあるのですが、そこでcjk-gs-integrateを使っています。その関係で、日本語フォント用のシンボリックリンクをまとめて保管する場所は、私の場合、

/usr/local/texlive/2017basic/texmf-local/fonts/opentype/cjk-gs-integrate

になっています。

シンボリックリンク云々

$ ln -s [実体ファイルの在処] [そのリンクを置く場所]
  • シンボリックリンクの参照先を調べるには ls -l コマンドで一発です。矢印->の先が実体ファイルです。試しにやって見るとこんな感じです。
$ ls -l
total 0
drwxr-xr-x 35 root wheel 1120  2 25 22:24 .
(略)
lrwxr-xr-x  1 root wheel   62 11 30 17:54 HiraginoSans-W0.ttc -> '/System/Library/Fonts/ヒラギノ角ゴシック W0.ttc'
lrwxr-xr-x  1 root wheel   62 11 30 17:54 HiraginoSans-W1.ttc -> '/System/Library/Fonts/ヒラギノ角ゴシック W1.ttc'
lrwxr-xr-x  1 root wheel   62 11 30 17:54 HiraginoSans-W2.ttc -> '/System/Library/Fonts/ヒラギノ角ゴシック W2.ttc'

もしくは Emacsディレクトリ情報をそのまま開いてもいいですが。それはそれで面倒ですね。

ヒラギノ

上述の"以前の投稿"の最後の方を参照されたし。

とりあえず動いている游ファミリーの設定用文言はこちら。これをプリアンブルに書けば使えます。

\usepackage[noalphabet,unicode]{pxchfon}
\setminchofont{YuMincho.ttc} % 游明朝体 ミディアム
\setgothicfont{YuGo-Medium.otf} % 游ゴシック体 ミディアム
\setboldgothicfont{YuGo-Bold.otf} % 游ゴシック体 ボールド 

游ゴシック

Sierra から乗り換えても 游ゴシックの名前は変わらなかったようで、cjk-gs-integrateで設定したときにとくにいじらなくてもうまく行った記憶があります。

(自分用メモとして一応ls -lの結果を載せておきます)

YuGo-Bold.otf -> /System/Library/Assets/com_apple_MobileAsset_Font4/[ハッシュ値的なもの].asset/AssetData/YuGothic-Bold.otf
YuGo-Medium.otf -> /System/Library/Assets/com_apple_MobileAsset_Font4/[ハッシュ値的なもの].asset/AssetData/YuGothic-Medium.otf

游明朝

以前YuMin-Mediumなどという名前で通っていましたが HighSierra では絶滅してリンクが切れてしまいました。のちのち似たようなことが起きたときのために何をしたかメモしておきます。

  • 游明朝らしきファイルを検索する
    游ゴシックが /System/Library/Assets にあることがわかったので、游明朝もその周辺に引っ越したのではないかと勝手に推測して検索してみますが…ただ、名前がYuMincho.ttcに変更されている上に、1つしかヒットしません。
$ find /System/Library/Assets -name "YuMin*"
Library/Assets/com_apple_MobileAsset_Font4/[ハッシュ値的なもの].asset/AssetData/YuMincho.ttc
  • FontBookで見てみる
    とりあえずFontBook (macOS標準搭載のアプリ) で開いて見てみます。どうやら、デミボールドや"游明朝体 + 36ポかな" などがひとまとめになって入っていたようです。

    f:id:saphir_jaune:20180226001632p:plain
    FontBook で YuMincho.ttc の中身を調べた結果

  • 游明朝ミディアムの設定をする
    明朝体用の設定を\setminchofont{YuMincho.ttc}としたところミディアムはうまく表示されるようになりました。

  • 游明朝ボールドの設定…?
    ボールド体も同じYuMincho.ttcを使うように設定すれば良いのではと思って試してみましたがまだうまくいっていません。

unicode オプション

游ファミリー用の設定用文言の1行目を

\usepackage[noalphabet]{pxchfon}

と書くと、

Character collection mismatched: 
Font: Adobe-Identity-0 
CMap: Adobe-Japan1-1 

dvipdfmx:fatal: Inconsistent CMap specified for this font.

というエラーが出てくるので、オプションにunicodeを入れてあげることで解決しました。

ここを参照させていただきました…!ありがとうございます。 d.hatena.ne.jp