8ttyan’s blog

コンピュータ関係の小ネタ

urlbstコマンドの使い方

latexbibtexを使っていると,参考文献一覧にhyperlinkを付けたくなるが,BibTeXのエントリーのurlにurlを指定しても自動でリンクは貼ってくれない.リンクを貼る方法は3つほどあり,

  1. BibTeXファイルの文献種類を@miscにしてurl = {http://hogehoge.com/hige...}のように登録する.
  2. BibTeXファイルに直接hyperref.styの\hrefコマンドを記述する
  3. urlbstコマンドを用いて,bitexスタイルファイルを書き換える

1の方法だと,すべてmiscしなくてはいけなくなる上,urlがそのまま表示されてしまう.pdfをpc上で表示させるときは文献タイトル自体にリンクを貼った方が見栄えが良い.そこで,2の方法を使うのだが,これだと手間が増えてendnoteやMendeley Desktopなどの論文管理ソフトを使っていると困難になる.そこで,次に説明する3の方法が必要になる. bibtexを使うときは,\bibliographystyle{}コマンドを使って,unsrt,junsrt,jplainなどのスタイルファイルを指定しているが,このスタイルファイル自体を書き換えてしまうコマンドである. 元のファイルが消えてしまうと困るので以下のようにコマンドを打つ.

#!/bin/bash
sudo chmod a+w /usr/local/texlive/texmf-local/bibtex/bst/local/ #書き込み権限付与
urlbst --eprint --doi --inlinelinks --hyperref /usr/local/texlive/2014/texmf-dist/pbibtex/bst/jplain.bst /usr/local/texlive/texmf-local/bibtex/bst/local/jplain_url.bst
urlbst --eprint --doi --inlinelinks --hyperref /usr/local/texlive/2014/texmf-dist/pbibtex/bst/junsrt.bst /usr/local/texlive/texmf-local/bibtex/bst/local/junsrt_url.bst
sudo mktexlsr

第一引数が元のスタイルファイルで,第二引数が変換後のスタイルファイル.変換後のものはtexmf-local内につくる.変換後のファイル名は自由に設定できるが,今回は「junsrt_url.bst」などと元のファイル名に"_url"を追加したファイル名にした.latex内では

\bibliographystyle{junsrt_url}

などとするだけで,文献のタイトル部分にリンクが貼られる.

【初心者向け】パスの通し方

「パスを通す」とは、プログラムを簡単に実行するために、プログラムの置いてあるディレクトリを指定する作業である。
例えば、よく使う「cd」というコマンドは「/usr/bin/」というディレクトリに置いてあるので、

$/usr/bin/cd

と打てば「cd」コマンドは実行できる。しかし、毎回このようにフルパスで指定するのは面倒なので、「cd」と打つだけで実行できるようにパスが設定されている。このパスは

$echo $PATH

と打てば表示できる。これに例えば「/opt/local/bin」というパスを追加したければ、

$export PATH="/opt/local/bin:$PATH"

と打てば追加できる。本来の「パスを通す」という作業はこれで終わりだが、パスというのはターミナルを起動(正確にはbashというshellを起動)するたびに再読み込みされてしまうので、自分で追加したパスは起動のたびに設定しなければならない。それを解消するには、shellが起動するときに自動的に読み込むファイルに記載しておけばよい。そのファイルはユーザーのホームディレクトリにあり、「.profile」または「.bash_profile」という名前がついているので、

$cd ~
$ls
$nano .profile(または$nano .bash_profile)

としてこのファイルの一番下に

export PATH="/opt/local/bin:$PATH"

を追加し、「ctrl-o」「Return」で保存、「ctrl-x」でファイルを閉じればよい。
こうしてbashを再起動すると、.profile に書かれたコマンドが自動的に実行されて、自動的に「パスが通る」ようになる。
ちなみに、この「.profile」ファイルにはパスの設定に限らず、任意のコマンドを書いておけるので、いろいろ使えそう。

gnuplotで複数グラフを書くときのファイル名の省略方法

gnuplot

#data.dat
0.1  0.1  1.0
0.2  0.2  0.9
0.3  0.3  0.8
:

みたいに3列以上のファイルから1と2、1と3列目をセットにしてプロットする場合、普通は

plot "data.dat" u 1:2, "data.dat" u 1:3

とするが

plot "data.dat" u 1:2, "" u 1:3

のようにファイル名が省略できる。

bash上のエスケープ

プログラム上で制御文字として扱われる文字を出力するためには、それをエスケープする(制御文字として機能させない)ことが必要。
bashの場合のメモ。

#!/bin/bash
name="snoopy"
echo "My name is ${name}"  # ダブルクオーテーション(”)の中に書いた変数は変数の中身が表示される
echo 'My name is ${name}'   # シングルクオーテーション(’)の中に書いた変数は展開されないので、そのまま${name} と表示されてしまう。
echo "\$name は変数を意味する"      # ダブルクオーテーションの中であっても、バックスラッシュ(\)を前に付ければ$マークなどがそのまま出力される

実行結果

My name is snoopy
My name is ${name}
$name は変数を意味する

bash scriptのつまづきやすいポイント・コツ

bashシェルスクリプトを書くと、通常の言語と違う(?)部分があって困ったのでメモ。

まず、変数への代入はイコールの前後にスペースは空けてはいけない。

#!/bin/bash
hoge=273  #これはOK
hage = 273  #これはエラー

if文は実はtestコマンド(の省略形)を使っているので、通常の言語と異なった書き方。
詳しくは以下のサイトを参照。

たとえばこのように書く。if文の括弧[]と条件式の間にはスペースを入れないとエラーが起きるので注意。

#!/bin/bash

hoge="snoopy"

if [ ${hoge} = "snoopy" ]; then  #括弧[]と条件式の間にはスペースをあけないといけない!
  echo "真です"
else
  echo "偽です"
fi  #if文終了の合図

if [ ${hoge} -ne "snoopy" ]; then   #-neオプションはtestコマンドのノットイコールの意味
  echo "snoopyではない"
else
  echo "snoopyです"
fi

よく使うのは、各引数についてループさせ、それぞれファイルかどうか判定して処理をするようなやつ。

#hoge.sh
#!/bin/bash
for i in $@   #「$@」はこのscriptのすべての引数を配列として表す。各引数についてループ
do               # for文のループゾーンの開始点を明記
 if [ -f $i ]     # 引数 $i がファイルかどうか
 then
  echo "$i is a file."
  :
  処理
  :
 fi
done       #forループ終了

これをhoge.shとして保存したら、ターミナル上で例えば

$ ./hoge.sh *.txt

とすれば、なんとか.txt というファイルを引数として読み込む。

$ ./hoge.sh hoge*

とすれば、hogeで始まるファイルやフォルダを引数として指定。フォルダを指定してしまっても弾かれるワケ。

gnuplotでlatex数式を埋め込んできれいな図を作る方法

gnuplotからtikzとして出力してpdflatexで処理すると高画質なグラフが手に入る。もちろんlatexの美しい数式が使える。

set term tikz createstyle                      #gnuplot用のlatex styleファイルを同じフォルダに出力
set term tikz standalone size 5in,3in   #standalone指定でそのままpdflatexで処理できる
set output "hoge.tex"                          #拡張子はtexにする
set xlabel "$x$"                                   #ドルマークで囲めば数式として出力できる
set ylabel "$\\theta$"                          #バックスラッシュ( \ )はgnuplot上で意味を持つので、エスケープさせるために二つ書く

gnuplot上で動かすならこれで良いが、shellscriptからgnuplotを動かしてtikzに出すとき、バックスラッシュ " \ " を二重でエスケープしないといけない。
例)hoge.sh

#!/bin/bash
gnuplot <<EOF
set term tikz createstyle                    #gnuplot用のlatex styleファイルを同じフォルダに出力
set term tikz standalone size 5in,3in #standalone指定でそのままpdflatexで処理できる
set output "hoge.tex"                        #拡張子はtexにする
set xlabel "$x$"                                 #ドルマークで囲めば数式として出力できる
set ylabel "$\\\\theta$"                    #バックスラッシュ( \ )をshell script上でエスケープさせるには \\ と二つ入力すれば良いが、gnuplot上でも二つ書いてエスケープしないといけないので、"\"を1つ表示させるためには4つ書く必要がある
plot  sin(x) w lp                                #関数をプロット
EOF

いずれにせよ、こうすると一群のスタイルファイル
gnuplot-lua-tikz-common.tex
gnuplot-lua-tikz.sty
gnuplot-lua-tikz.tex
とグラフを記述した
hoge.tex
というファイルが出力されるので

$pdflatex hoge.tex

と処理すればpdfファイルが得られる。
ただし、pm3d mapなどを使うと異常に重くなるのでgnuplotから直接pngで出力するのが良さそう。
f:id:y8ttyan:20141122160527p:plain