(latex)新しいパッケージを入れただけでコンパイルできなくなる問題

■概要:新しいパッケージを入れただけでコンパイルできなくなったら一度関連ファイルを削除してみよう.

■編集しているPDFにハイパーリンクを追加しようと思い,プリアンブルに \usepackage{hyperref} を追加してコンパイルしたところ:
Paragraph ended before \Hy@setref@link was complete.

というメッセージが出て止まってしまった.関連するファイル,つまり hoge.aux, hoge.idx, hoge.out, hoge.log を一度全部削除してからコンパイルしたら通った.これらの関連ファイルはTeXworksの「ファイル」メニューから削除できる.

広告

latexのソースからMeCabを用いて名詞だけ抜き出す

■記事の概要:latexのソースから形態素解析器を用いて名詞だけ抜き出したリストを作る.
■環境:MinGW または MSYS2 (Cygwin でも多分大丈夫だろうな~と思うが試していない)
■主な道具:MeCab, python3, make

■動機と背景:latexで作成しているPDFファイルのページ数が増えてきたので,索引を付けようと考えた.(索引はlatex の\indexという命令で作れるが,この記事ではこれ以上触れない).最初は索引の項目を手で付けていたが,思いついたものを十個ぐらい挙げたら飽きてしまった.そこで,《latexソースファイルの中から名詞だけ抜き出す》ことを考えた.

■環境整備
1.MinGW または MSYS2 については環境整備が済んでいるものとする.
2.MeCabのインストール:Windows用に配布されているバイナリを使う.公式からリンクされているダウンロードページ(http://taku910.github.io/mecab/#download)からBinary package for MS-Windowsという項目の直下の mecab-0.996.exe をダウンロードし,インストールした.インストール時にエンコーディングを指定するように言われる.今回の目的はlatexのソース処理なので utf-8 を選ぶ.(デフォルトだとShift-JPだったように記憶している).
3.Pythonのインストール:Windows用に配布されているバイナリを使う.公式ページ(https://www.python.org/)からDownload/latestに飛び,そこから「Windows x86-64 executable installer」と題されたファイルをダウンロードし,インストールした.この記事が書かれた時点での最新版は3.6.4であった.
4.パスを通す.MecabとPythonがMinGWシェルから見えるようにパスを通す必要がある.(MinGW なら
C:\MinGW\msys\1.0\home\YourUserName, MSYS2 なら C:\msys64\home\YourUserName などに置いてある).bashrc の下の方に次のような行を加える:

export MECABPATH=/c/MeCab
export PATH=$PATH:$MECABPATH/bin

export PYTHONPATH=/c/Python3.6.4
export PATH=$PATH:$PYTHONPATH
export PYTHONIOENCODING=UTF-8

※《/c/MeCab》や《/c/Python3.6.4》は各自のインストールの実態に合わせて適宜変更してほしい.
※最後の《export PYTHONIOENCODING=UTF-8》という行はパスを通しているのではなく,ユニコード文字(utf-8)をpython3で扱うときに必須らしい設定である.

■MeCab用のユーザー辞書作成
MeCab には「微分」や「積分」のような一般的な用語は(Windowsバイナリに同梱の)辞書ファイルに登録されている.しかし,それほど一般的でない用語は登録されておらず,バラバラの言葉や文字として認識されてしまう.そこでユーザ辞書を作成する.ユーザ辞書の元になるデータは次のような形式のcsvファイルである:

無限小,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED
無限大,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED
無限小量,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED
無限大量,,,10,名詞,一般,*,*,*,*,個別名,アアアア,REGISTERED

「アアアア」などとなっている箇所は本来きちんとした読みを登録するのだが面倒であり,今回の業務と無関係なのでこのようにしてある.(今回は説明を省略するが,一行に一つ単語を書いたファイルからこのようなファイルを自動生成している.)「REGISTERED」は後で解析結果を加工するためのヒントとするための追加タグである.

■Makefileの作成
次のようなMakefileを用意する.

help:
	@grep -E '^[0-9a-zA-Z_-]+[[:blank:]]*:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[1;32m%-30s\033[0m %s\n", $$1, $$2}'

dict : mecab.csv ## add user dictionary for mecab by mecab.csv
	mecab-dict-index -d$(MECABPATH)/dic/ipadic -u ./mecab.dic -f utf8 -t utf8 mecab.csv

mecab : hoge.tex ## analyze hoge.tex by mecab
	$(eval MECAB_OUT := $(strip $(basename .tex $ $(UNIQ)
	python extractNoun.py  $(UNIQ) > $(RESULT)
	rm  $(MECAB_OUT) $(UNIQ)

make dict としてやると mecab.csv が処理され mecab.dic というMeCab用ユーザー辞書が作成される.(helpターゲットのルールについては以前の記事を参考にしてほしい).

make mecab としてやるとまずターゲットの hoge.tex が MeCab で処理され,hoge-out.txt が生成される.このファイルはhoge.texのすべての内容を品詞分解して一行に一つずつ並べたものになっているので重複が多い.そこでhoge-out.txt sort し uniq して重複を除去して hoge-out-u.txtを生成する.(前段の sed については以前の記事を参考にされたい.)今回は「名詞」とタグ付けされたものだけ欲しいので,hoge-out-u.txt を自作のpythonスクリプト extractNoun.py で処理して最終結果の hoge-nouns.txt を得る.

★Makeルールの中で変数を定義する方法については『makefile 動的に変数に代入 共通して使う』を参考にさせて頂いた.

■pythonスクリプト extractNoun.py

# -*- coding: utf-8 -*-
import sys
import re #正規表現
import codecs
import copy

reNegIgnoreFlag = re.compile('REGISTERED')
reNeg = re.compile('接頭詞')
rePos = re.compile('(.+?)名詞')
reNum = re.compile('(\d+)')
reSymbols = re.compile('[!\$%\#&\(\){}\+,\-@\.\\\\=\"\'\*:;\?–\[\]|_`\^,]+')

def main():
    f = open(sys.argv[1], 'r', encoding="utf-8_sig")
    input = f.readlines()

    for line in input:
        myFilter(line)

def myFilter(line):
    pos = rePos.search(line)
    neg1 = reNeg.search(line)
    neg2 = reNegIgnoreFlag.search(line)

    if pos and (not neg1) and (not neg2):
        result = pos.group(1).strip()
        isnumber = reNum.search(result)
        containsSymbols = reSymbols.search(result)
        if (not isnumber) and (not containsSymbols):
            sys.stdout.write(result)
            sys.stdout.write('\n')

if __name__ == '__main__' : main()

解説:関数 main() では,一番目の引数 sys.argv[1] として与えられたファイル名を持つファイルを開き,readlines で行の集まりに分解し,各行を関数 myFilter() で処理している.
関数 myFilter() では,事前にコンパイルされた5つの正規表現 reNegIgnoreFlag,reNeg,rePos,reNum,reSymbols を使って「欲しそうなものを抜き出し,要らないものを弾く」ことをやっている.それぞれの正規表現の目的は次の通り:

・reNegIgnoreFlag:MeCabのユーザー辞書に登録済みの単語を検出するため.(MeCabのユーザー辞書のcsvファイルは索引づくりのヒントファイルを兼ねており,そこにまだ登録されていない単語を探すのが今回の目的なので).
・reNeg:「名詞」タグが付いているもののうち,さらに「接頭詞」というタグが付いたものを排除するため.このタグがつくものは「不」「無」「第」「最」などの一文字単語(?)であり,今回の目的にはノイズなので弾く.
・rePos:「名詞」タグを検出するため.
・reNum:年号などの数字列を弾くため.
・reSymbols:latexソースを自然言語解析器にかけた結果として大量の無意味記号列が(MeCabによって,仕方なく)「名詞」に分類されてしまうためそれらを弾くため.

(latex)mdframed 環境の外に脚注を置く方法(tablefootnote)

mdframed 環境中で\footnoteを使うと,mdframed 環境の「内側に」脚注が作られてしまう.これを回避するためには次のようにすればよい:

% !TEX TS-program = platex
% !TEX encoding = UTF-8 Unicode
\documentclass[16pt]{jsarticle}
\usepackage{minitoc}
\usepackage[dvipdfmx]{graphicx}
\usepackage{textgreek}
\usepackage{tikz}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{tablefootnote}

\makeatletter
\AfterEndEnvironment{mdframed}{%
\tfn@tablefootnoteprintout%
\gdef\tfn@fnt{0}%
}
\makeatother

\newcommand{\textgreek}[1]{\begingroup\fontencoding{LGR}\selectfont#1\endgroup}

\title{金について}
\date{}
\begin{document}
\maketitle

金\footnote{ギリシャ語では{\textgreek{qrus\'os}}と呼びます}は(1)希少な鉱物資源であり(2)加工が容易であり、特に伸展性に富む(3)美しい;といった性質により、世界中で珍重されています。

\begin{mdframed}
銀\tablefootnote{ギリシャ語では{\textgreek{ashm\'enio}}と呼びます}は大和言葉では「しろがね」と呼ばれていました。室温における可視光線の反射率は、金属中で最大の98\%です。
\end{mdframed}
\end{document}

つまり上のようにプリアンブルを整備した上で\tablefootnoteを使えば良い.

(latex) epigraph と boxnote

よく忘れて困るので自分用メモ.

・章の最初に気の利いた引用を置いてカッコつけるやつをエピグラフ(epigraph)と言う.latex ではそのものズバリの epigraph.sty を使う.
・ノートパッドをちぎったような罫線は boxnote 環境で作る.ascmac.sty を使う.
epi

pdf : epigraph_boxnote

% !TEX TS-program = platex
% !TEX encoding = UTF-8 Unicode
\documentclass{jsarticle}
\usepackage{minitoc}
\usepackage{textgreek}
\usepackage{ascmac} %for boxnote
\usepackage{epigraph}
\usepackage[utf8x]{inputenc}

\setlength\epigraphwidth{.8\textwidth}

\newcommand{\textgreek}[1]{\begingroup\fontencoding{LGR}\selectfont#1\endgroup}
\title{金について}
\date{}
\begin{document}
\maketitle

\epigraph{<span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>
All that glisters is not gold—\\
Often have you heard that told.\\
Many a man his life hath sold\\
But my outside to behold.}{William Shakespeare, \textit{The Merchant of Venice}}

\epigraph{
Fort von hier sei sie entf\"uhrt!\\
Bis Abend, achtet's wohl,\\
pflegen wir sie als Pfand:\\
wir kehren wieder; doch kommen wir,\\
und bereit liegt nicht als L\"osung\\
das Rheingold licht und rot —}{Richard Wagner, \textit{Das Rheingold}}

\section{金の基本的性質}
金(ギリシャ語では {\textchi}{\textrho}{\textupsilon}{\textsigma}\textgreek{ό}{\textvarsigma} と呼びます)は(1)希少な鉱物資源であり(2)加工が容易であり、特に伸展性に富む(3)美しい;といった性質により、世界中で珍重されています。

原子番号は79であり、貴金属としては最も大きいです。 金は単体では金色と呼ばれる光沢のある黄色い金属ですが、非常に細かい粒子状(金コロイド)にすると黒やルビー色に見える場合があり、時には紫色になります。これらの色は金のプラズモン周波数によるもので、主に黄色と赤を反射し青を吸収します。このため、薄い金箔を光にかざすと、反射と吸収の谷間にあたる緑色に見えるのです。

\begin{boxnote}
金が持つ独特の金属色は日本語では「金色」と呼ばれます。英語でもずばり``gold'' です。しかしながら、冒頭に引用したワーグナー『ラインの黄金』では「輝く赤い」と形容されています。このように,金が常に「金色」と形容されるわけではないことには注意が必要です。
\end{boxnote}

\end{document}

latex でギリシャ語の入力(ver2)

■前回の記事では、\textomikron に\’ でアクサングラーヴを付けようとして上手く行かなかったが、LGR を上手く使えば、\’o に対するラップで行けるらしい。

% !TEX TS-program = platex
% !TEX encoding = UTF-8 Unicode
\documentclass{jsarticle}
\usepackage{verbatim}
\usepackage{minitoc}
\usepackage{textgreek}
\usepackage[utf8x]{inputenc}
\newcommand{\textgreek}[1]{\begingroup\fontencoding{LGR}\selectfont#1\endgroup}
\newcommand{\showvb}[1]{{#1}$\,\mapsto\,$\textgreek{#1}}
\title{金について}
\date{}
\begin{document}
\maketitle
金(ギリシャ語では{\textgreek{qrus\'os}}と呼びます)は(1)希少な鉱物資源であり(2)加工が容易であり、特に伸展性に富む(3)美しい;といった性質により、世界中で珍重されています。

\section{対応}

\showvb{a},\showvb{b},\showvb{c},\showvb{d},\showvb{e},\showvb{f},\showvb{g},\showvb{h},\showvb{i},\showvb{j},\showvb{k},\showvb{l},\showvb{m},\showvb{n},\showvb{o},\showvb{p},\showvb{q},\showvb{r},\showvb{s},\showvb{t},\showvb{u},\showvb{v},\showvb{w},\showvb{x},\showvb{y},\showvb{z}
\end{document}

■アルファベットの v だけは対応するギリシャ文字がないことに気づいた。

■追記(2017/07/11):田中美知太郎&松平千秋『ギリシア語入門』を読んでいたらシグマの小文字には二種類の字形(σ, ς )がありςは語尾にのみ使い,その他の場合にはσを用いると書いてあった.上の例ではソースに{\textgreek{qrus\'os}}と書いてあり語中と語尾の二箇所にsが出現しているが,ギリシャ文字に置き換えられる際に(σ, ς )の使い分けが正しくされている.便利だ.

latexのギリシャ語テキスト(しかもアクセント付き)の扱い

■(追記)こっちの記事のやり方のほうが良いと思う。

■latex の入力テキストとして、現在では当たり前のように utf-8 を使える。しかし、入力テキストにutf-8を使えるということと、latexの出力にそれを上手く反映させることはまた別の問題。
実際、アクセントのついたギリシャ語単語の表示なんかはまだ面倒、らしい。

■textgreek パッケージにより、\texalpha, \texbeta, \texgamma, …, \textchi などで個々の文字を入力することができるが、たとえばアクサングラーヴを\textomikron に施そうとしたら妙な方向にずれてしまってうまく行かない。

■仕方ないので、webページからその文字を直接取ってきて使った。というわけで、こんな感じのチグハグな処理をしている:

% !TEX TS-program = platex
% !TEX encoding = UTF-8 Unicode
\documentclass{jsarticle} 
\usepackage{minitoc}
\usepackage{textgreek}
\usepackage[utf8x]{inputenc}
\newcommand{\textgreek}[1]{\begingroup\fontencoding{LGR}\selectfont#1\endgroup}
\title{金について}
\date{}
\begin{document}
\maketitle
金(ギリシャ語では {\textchi}{\textrho}{\textupsilon}{\textsigma}\textgreek{ό}{\textvarsigma} と呼びます)は(1)希少な鉱物資源であり(2)加工が容易であり、特に伸展性に富む(3)美しい;といった性質により、世界中で珍重されています。
\end{document}

■結果がこうなれば成功:

■もっと簡単な方法があるのではないか感がある。

! No room for a new \dimen . 問題とその解決法(latex)

以前別のコンピュータで正常にコンパイル出来ていた latex ファイルが「! No room for a new \dimen .」というエラーメッセージを出してしまい、コンパイル出来なかった。
このメッセージでググったら、stackexchangeに対処方法が載っていた。:https://tex.stackexchange.com/questions/38607/no-room-for-a-new-dimen

パッケージが多すぎる場合にこの問題が起きるらしい。この場合、\documentclassの直後に
\usepackage{etex}
を入れれば良いそうだ。

Windowsからevinceを使う

■evinceとは
ubuntuなどをつかってるときのデフォルトのPDFビューワです.

■evinceをWindowsで使うメリット
アドビのPDFビューワと異なり,ファイルをロックしません.TeXWorksのような統合環境ではなくコマンドラインからlatexをコンパイルしているときに便利です.

■インストール方法
$ pacman -Ss evince
とやれば幾つか候補がでてくるはずです.

■使い方
$ evince hoge.pdf&
としてやり,hoge.texを色々編集してコンパイル.いちいちhoge.pdfを閉じる必要はありません.