8ttyan’s blog

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

LaTeXでlabelを自動判別してrefを簡単にする方法

\usepackage{hyperref}して,\ref{hoge}の代わりに\autoref{hoge}を使うと,labelが式なのか,図なのか,sectionなのかなどを自動的に判別して図1(1)式みたいに自動的に図や式といった文字を出力してくれる. ただし,defaultでは日本語に対応していないようなので,プリアンブルに以下のように記述しておくと良い.

\def\equationautorefname~#1\null{\textrm{~(#1)式\;}\null}
\def\figureautorefname~#1\null{ 図~#1\null}
\def\tableautorefname~#1\null{ 表~#1\null}
\def\sectionautorefname~#1\null{第~#1\null}
\def\subsectionautorefname~#1\null{~#1\null}
\def\subsubsectionautorefname~#1\null{~#1\null}
\def\paragraphautorefname~#1\null{第~#1パラグラフ\null}
\def\subparagraphautorefname~#1\null{第~#1小パラグラフ\null}
\def\pageautorefname~#1\null{~#1ページ \null}
\def\appendixautorefname~#1\null{~#1 \null}

アクティブなネットワークインターフェースのIPアドレスを拾う方法

ifアドレスを拾うコマンドとして$ifconfigがあるが,情報が大量に表示されて見にくい.しかも使っていない(アクティブでない)IPアドレスも表示されてしまう. この場合は以下のようにする.

$ ifconfig `ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'` | grep 'inet ' | awk '{print $2}'

海外のサイトから引用してきた方法なので,もっと良い方法があるかもしれない.

command line - How to use ifconfig to show active interface only - Unix & Linux Stack Exchange

アクティブなネットワークインターフェースのipアドレスを拾う方法

2015/01/11 11:04

pcregrepコマンドはportsな人は以下でインストールできる.

$ sudo port install pcre

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で始まるファイルやフォルダを引数として指定。フォルダを指定してしまっても弾かれるワケ。