暇な理系大学生の備忘録

ちょっとしたことをつらつらと

初心者による初心者のためのLaTeX【超基礎編】

こんにちは

タイトルにもあるようにLaTeX初心者の僕が初心者に向けてその基本的な使い方、

正確にはその書き方を紹介していこうと思います。

 

そもそもLaTeXとはざっくり言うと、(うまく使うと)すごくいい感じにPDFが書けるもの、ですね(たぶん)

いや、Wordでいいじゃないかと言われればそれはそう、ですがWordは決して安いといえるソフトではないですし、windows、一応macで販売されていますがlinux版は販売されていません。対して、TeXは無料でwindowsmaclinuxいずれのOSでも提供されています。また、MS Officeはバージョンが変わるごとにUIがコロコロ変わったり機能もコロコロ変わったりすしますよね。ググって試そうと思った機能が旧verのもので新verでは変わってた...なんてこともあったりなかったり...

 

Wordもおそらくきちんと使い方をマスターしてきちんと使えば綺麗な文書を書くことができるとは思いますが、TeXの方がそこまで勉強せずとも比較的綺麗な文章を書くことができると思います。

特に数式などはかなり整ったものが書けますし、図表の配置、文章の章や節の割り振りなどもWordではびみょーにずれたり思い通りにいきにくかったりなどありますが、TeXではかなり楽に扱うことができます。

あとTeXはかなり歴史が長く、数え切れないのではないかというほどの拡張機能(パッケージ)があります。これも利点と言えるでしょう。また、学会によっては論文用のテンプレートをTeX形式で配布しているところもあります。

 

で、インストール方法ですが、OSや方法、まとまったパッケージでインストールするのか個々インストールするのかなどによってかなり異なってくるので個別に紹介することは避けますが、だいたいTeX Liveインストールしとけばいいと思います。

インストールするとエディター(windowsならTeX Works、macならTeX Shop)が一緒にインストールされるので、それを使えば問題ないかと。

また、インストールするソフト、バージョンなどによってはエディターのタイプセット設定をいじる必要があるかもしれません。

windows(TeX Works)

下記ページに従って設定しました。

TeXworks/設定 - TeX Wiki

mac(TeX Shop)

特に何か設定した記憶はないですが、インストールしたバージョンが現在の最新版とは異なるのでデフォルトの設定が同じかはわからないので「mac 使うエディター名 日本語」とかそんな感じで検索していただければわかると思います。

 

で、インストールおよび設定ができたら以下のコードを書いてコンパイル(タイプセットというボタンかも)をしてみましょう。

 

¥documentclass[a4j]{jsarticle}
¥usepackage[dvipdfmx]{graphicx}
¥title{タイトル}
¥author{筆者A¥thanks{あ大学}¥and 筆者B¥thanks{い大学}}
¥date{2100/4/1}
¥begin{document}
¥maketitle
¥end{document}

1行目は文章を作る際の基本的な宣言と思ってください。

2行目は使用するパッケージ(機能)の呼び出しです。今後、使いたい機能に応じて下に書き足していきます。

3〜5行目はこの文章のタイトル、筆者名、文章の執筆日の宣言になります。これをかかなかったり、¥title{}のようにかけば空白になります。ただ、なにもせずただ空白にすると、白いだけの空間が残るので適当にいじって上に詰めてやる必要があります(また後々の記事で紹介)。author内のthanks{}で注釈をページ下に付けてやることができます。論文とかだとその人の所属機関やemailアドレスがよく書かれてますね。

6〜8行目が本文になります。LaTeXにおいてオブジェクトは基本的に¥begin{hoge}ではじまり¥end{hoge}で終わる塊であることを覚えておいてください。文章中に¥begin~が12個あるのに¥end~が10個しかないなんてことはまずありません。大抵コンパイル時にエラーをはきます。

でこの本文(document)内に書かれたものが実際にコンパイルすると文章として出力されます。

¥maketitleは3〜5行目で宣言したタイトル、筆者名、執筆日が出力されます。この3つを一切表示しない場合は¥maketitle自体書かなければOKです。この場合のみ空白は作られずページ一番上からこれ以後の文章がスタートします。

 

きちんとインストールと設定が行われていれば以下のようなpdfが出力されるはずです。

f:id:hima_b:20180417215951p:plain

 

今後、不定期にはなりますが思い出した時にでも

章節等の分け方、目次や参考文献の出力、読み込んだ図の出力、表の出力、数式の基本的な書き方、行列、ベクトル等の書き方、などレポートを書く際に最低限必要な機能に絞って説明していきたいと思います。

 

 

gnuplotの使い方【フォントの種類、サイズの指定、矢印、コメントの挿入】

長いこと更新してませんでしたが、今回はフォントの種類、そのサイズの指定、

また、グラフ上に矢印の挿入、コメントの挿入について紹介したいと思います。

 

今回紹介する機能を使うと以下のようなグラフが書けるようになります。

f:id:hima_b:20171130215940p:plain

 

フォントの指定は

 

font "Arial,14"

というような書き方をします。

Arialはフォントの名前です。これはMacに入っているフォントですが、別に他の任意のフォントを使用してもらって大丈夫です。

 

強いて言うなら、英語専用のフォントを選んだのに日本語を表示しようとすると文字化けします。

また、環境依存文字などにも注意が必要ですね。

後ろの14という数字はフォントサイズです。

 

実際に使うのであればこのような感じになります。 

set xlabel font "Arial,18"
set ylabel font "Arial,25"
set tics font "Arial,14"
set key font "Arial,14"

上2つは軸ラベルのフォント、3つ目はメモリのフォント、4つ目は凡例のフォントの指定になります。 

 

 

次にコメント(任意のラベル)と矢印の挿入になります。

 

set label 1 'ラベル1' at 2,8 center font "Arial,20"

 

labelの後ろの数字はラベル番号です。適当に被らないように振っていけばいいです。

atの後ろはx座標,y座標で、centerはその座標を中心にラベルを表示するという指示です。centerがなければその座標の右側にラベル表示です。

 

これに関連して、矢印の書き方も紹介します。

set style arrow 1 heads size graph 0.02,20 filled
set style arrow 2 head size graph 0.08,20
set arrow 1 from 2.1,4.8 to 3,2.2 arrowstyle 1
set arrow 2 from 6,4 to 5.2,1.2 arrowstyle 2

 上記のようなset style arrow ~とset arrow ~がワンセットで使うと思ってください。

どういう矢印かを定義、定義した矢印を呼び出して表示

という意味合いになってます。

 

set arrow style の数 = set arrow の数

もしくは

set arrow style の数 < set arrow の数

になると思ってくださって構いません。

もちろんarrow styleいっぱい書いて使わない場合は別ですが。

 

headsだと両方に矢尻があり、headだと片方になります。

その後ろは size graph 矢尻の長さ, 矢尻の太さ になってます。

filledがあると塗りつぶされて、ないと骨みたいな矢印を書くことができます。

 

set style arrow 番号で定義した矢印はarrowstyle 番号 に割り当てられます。

set arrow 番号では実際にグラフ上にプロットする矢印の番号になります。

from 始点のx座標, 始点のy座標 to 終点のx座標, 終点のy座標 という書式になっていて、最後のarrowstyle 番号で最初に定義した矢印の定義を呼び出します。

 

以上のコマンドを組み合わせれば最初にお見せしたグラフのようなフォントの調整、ラベル、矢印の掲載ができるようになります。

 

では。

gnuplotの使い方【小目盛、対数目盛、凡例の細かな調整、for文、ギリシャ文字】

日々レポートと格闘していると、そういやあのコマンド紹介してない、これもあったか、これは知らんかった、便利だ

というようなことが多々あります。

その中のいくつかを紹介したいと思います。

 

今回は

小目盛の設定

対数目盛の設定

凡例の調整

for文

ギリシャ文字の表示

を紹介しようかと

 

まずは小目盛りの設定

目盛の設定は前に

set xtics 3

set ytics 5

 

みたいなのがあるのを紹介したと思いますがこれは大目盛といって、下に数字が表示されますよね。

ただ、やっぱりもっと細かく目盛りがほしいなぁ、でも全部に数字はいらんなぁ、ということもあると思いますのでそこでこれを使います。

set mxtics 10

 

です。mが付きました、それだけです(笑) 意味としてはx軸の大目盛一つの間を何等分するかです。

例:x軸大目盛間隔5、小目盛り5つ(間隔1)

f:id:hima_b:20170628201159p:plain

 

この程度の差ですけどね(笑)

 

 

次は対数軸の設定

これはいわゆる片対数、両対数グラフを書きたいときのコマンドです。

set logscale x

 

 xがyならy軸が対数になります。

f:id:hima_b:20170628201532p:plain

これは両方ともy軸は対数で、x軸が左は線形、右が対数です。

表示する関数やデータが指数関数的に変化するものだったりするときによく使います。

 

 

次は凡例の調整を。

set key box title 'test' at 0.5,0.5 vertical

 

この一文の説明としては、

boxで凡例の周りを囲む。

title 'test'で凡例群に名前を表示する(使ったことはない笑)

at x,yでグラフ上のx、y座標に凡例を移動

これは全体を1x1とした座標系です。また座標でなくてもtop,bottom,left,rightでそれぞれの方向の端まで移動できます。またbelowでx軸の下に平積みで表示できます。

後ろのverticalは凡例が複数の時に縦積み、horizonalで横積みできます。

例:さっきのコマンドを実行

f:id:hima_b:20170628203603p:plain

 

 実はkeyコマンドはこれ以上にいろいろ機能ありますが、ここら辺知ってればいいかなと。もしかしたら、もしかしなくても、keyなんてデフォルトでもいいかもしれませんが...

 

お次にfor文

一応gnuplotにもforとかif、whileは存在します。その中でも使うんじゃないかなと思ったのがfor文だったので紹介を。

plot for [i = 1:3] x**i title sprintf("f(x) = x^%d",i)

 

 iが1~3の間でそれ以下の処理を繰り返すというものです。

x**iはx,x^2,x^3となって、それ以後のtitle自体は以前紹介はしましたが、sprintfは初めてのはず?

このsprintfの書式はC言語のprintfとたぶん一緒です。sprintfの出力がtitle ' 'における' 'の部分に置き換わります。つまりi=0のときtitle 'f(x) = x^1'と書くのと同じになります。

さっきの凡例調整のグラフ自体はこのfor文で書いてます。

 

応用として

plot 'no1.csv' using 1:2

 にfor文を使ってみると

plot for [i = 1:3] sprintf("no%d.csv",i) using 1:2

 

 という風な感じになります。

 これを実行するとno1.csv、no2.csv、no3.csvが一気に表示できます。

(カンマ区切りの文言とか要りますがここでは割愛)

ばーっと一気に何かするときに便利です。

 

 

最後にギリシャ文字の表示について。

理系だとギリシャ文字を書くことは多いですよね、ΩとかθとかΓとか...

今まで紹介してなかったのが申し訳ないです(笑)

 

set ylabel '{/Symbol G}

 かくとGに対応するギリシャ文字Γが表示できます。

小文字だと表示されるギリシャ文字も小文字です。

 

あと追加でpwdというコマンドを。

pwdと実行するとカレントディレクトリが表示されます。csvとかpltファイルはここに入れるようにしてください。画像をエクスポートする際も一回ここに保存ずるのがよいかと。

 

 

今回はこの辺で... では

 

乱数生成法について

こないだちょっとCでプログラムを書いているときに乱数生成について少し調べたりしたのでメモ書きを...

 

基本的には大体のプログラミング言語には乱数生成の関数が標準ライブラリに組み込まれています。

たとえばC言語ならrand()関数。

 

しかし、ちょっとした理由からrand()関数が使用できない制約の上で乱数を使用する必要がある状況に出くわしました。

 

そうなると自分で乱数生成関数を用意しなければなりませんが、

僕は別段そういった方面の数学的知識はありませんので乱数生成アルゴリズムについて調べました。

 

見つけた中で簡単に実装できるものが2つ見つかりました。

 

1.線形合同法

2.XorShift法

 

です。

 

C言語のrand関数は1の線形合同法を利用したもの(だったはず)です。

実際の実装方法はたしかwikiに載っていたものを使いました。

 



unsigned long sen_gou(){

static unsigned long x = 10;

unsigned long a = 1103515245, c = 12345, m = xx(2, 31);

x = (a*x + c) % m;

return x;

}

xx関数は第一引数を第二引数乗するべき乗関数です。

本来ならpow関数(?)だったかmath.hあたりをインクルードすれば使えた気もしますが、math.hも使えない制約があったので作りました(記述するのは省略)。

 

sen_gouが線形合同法による乱数生成関数です。

これで吐き出された数字をModしてやれば任意の範囲での乱数が得られます。

%6+1して1~6で、 % 10+1して1~10の範囲で乱数を求め、また総計算回数の大小おけるそれぞれの値の出現数を可視化してみました。

横軸がそれぞれ生成した値、縦軸がその値の出現数です。

f:id:hima_b:20170524150715p:plainf:id:hima_b:20170524150740p:plain

 

もう一つのXorShift法の実装コードも確かwikiにのっていたはずです。

 



unsigned long xor128(){

	static unsigned long x = 123456789, y = 362436069, z = 521288629, w = 88675123;

	unsigned long t;

	t = (x ^ (x << 11)); x = y; y = z; z = w; return(w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)));

}

 で、これも先ほど同様に実行回数と出現数の可視化をしました。

f:id:hima_b:20170524151630p:plain

f:id:hima_b:20170524151701p:plain

 

今回は乱数の生成結果をModして任意の範囲で取り出したので、元の生成結果の傾向がどうとかは判断できませんでしたが、(そこを論じれるほど理解していないので)、まぁこれでrand関数なしでも乱数が生成できることはわかりましたね。

 

もし、時間変数やタイマーを用いれる環境であれば、その値を用いて2種類の生成法を不規則に呼び出してやれば面白いかもしれません。

 

x,yは任意の値として

timer%x > yなら

a = sen_gou();

そうでないなら

a = xor128();

のような感じで。

 

ほかにもいろいろな乱数生成法はありますし、それに関する論文を書かれている方も多くいらっしゃるので、興味がある方は読んでみるのもいいかもしれません。

 

では。

 

 

 

 

gnuplotの使い方【複数のグラフを並べる】

今回はy、もしくはx軸を共有したグラフの書き方を記したいと思います。

 

具体的にはこんな感じ

f:id:hima_b:20170506213825p:plain

複数の出力、測定結果を比較する際、

ディジタル波形などの比較などの際には有効に活用できると思います。

 

まずはスクリプト全文を載せます。

gnuplotスクリプトとは?という方は前回記事を見てください。

 

hima-b.hatenablog.jp

 


set multiplot layout 4,1
set datafile separator ","

set lmargin 0
set rmargin 0
set tmargin 0
set bmargin 0

set ytics 1
set xtics nomirror
set ytics nomirror

set xr[0:3e-4]
set yr[-0.2:1.2]

set size 0.8,0.20
set origin 0.1, 0.70
unset xlabel
unset ylabel
unset xtics
plot 'data.csv' using 1:2 with line linecolor -1 title 'ClockPulse'

set size 0.8,0.20
set origin 0.1, 0.50
unset xlabel
unset ylabel
unset xtics
plot 'data.csv' using 1:3 with line linecolor -1 title 'X0'

set size 0.8,0.20
set origin 0.1, 0.30
unset xlabel
unset ylabel
unset xtics
set ylabel '[V]'
plot 'data.csv' using 1:4 with line linecolor -1 title 'X1'

set size 0.8,0.20
set origin 0.1, 0.10
set xlabel 'time [s]'
unset ylabel
set xtics
set xtics nomirror
plot 'data.csv' using 1:5 with line linecolor -1 title 'X2'

unset multiplot
    

 まず最初、multiplotは縦に4つ、横に1つ表示する宣言になります。

それのペア的存在として最後にはunset multiplotと書きます。

その次のset ○margin 0というのはleft,right,top,bottomそれぞれの余白(グラフの枠の外)の幅の指定です。

すべて0にしておくとそれ以降のグラフが書きやすいので今回は0にしています。

 

ticsや描画範囲については過去の記事を。

 

set sizeはそのグラフ"1つ当たりの"大きさの指定です。"グラフ全体の"横と縦を1、1としたときの比率で指定します。

set originはその"グラフ1つの左下の座標"の場所を指定します。基準は"グラフ全体の"左下の座標を0,0としています。

 

あとは一つ一つグラフの設定を書いていけばok

一番下のx軸だけ表示して、それ以外は非表示にしています。

(x軸は共通なので)

もし共通幅のx軸でなくてもこのようなレイアウトでグラフを作成することはできます。

上のグラフは大きさ比率0.5、下のグラフの大きさ比率0.8のようなイレギュラーなグラフを作ることも可能ではあります。大きさや座標が指定できるので割と何でもできると思います。

一つのキャンパスに複数の絵を飾る感覚ですね。

 

例えば応用すればこういうのもできます。

f:id:hima_b:20170506221026p:plain

log(x)+1のグラフをxが1~10の範囲は線形表示、それ以降は対数表示というようなグラフも書けます。使い道があるかはわかりませんが...

 

今回はここらへんで。

 

 

gnuplotの使い方【スクリプトファイルの使用、目盛の設定】

レポートを書いてる中で少し使い方を記しておきたいことが出てきたので書きたいと思います。

 

今回の内容はgnuplotスクリプト、pltファイルの書き方です。

 

書き方と言っても簡単で、内容としては今までのコマンドとさほど変わりません。

何が良いかというとスクリプトファイルに実行したいコマンドをすべて書いておいて、それを一括で実行できる点にあります。

 

特に次の記事で書こうと思っている複数のグラフを一つの描画に収める作業をする際には10や20のコマンドを書くことになるので重宝します。

 

そのスクリプトの書き方は適当なテキストエディター、メモ帳なりEmEditorを開いて実行したいコマンドを順にgnuplotに直で書いてるときと同じように記述します。

 

 こんな感じ

f:id:hima_b:20170506192252p:plain

data.csvっていうのはこんなの

f:id:hima_b:20170506192320p:plain

 

これをgnuplotのbinファイルにほりこんでやって

gnuplot

load "sc.plt"

 

と実行してやればok

f:id:hima_b:20170506192654p:plain

sc.pltの部分は各々作成したスクリプト名に変更してください。

 

今回しれっと書いた

set xtics nomirror
set ytics nomirror

 はx軸やy軸の目盛を上や右に写さないコマンドです。

ちなみに軸の目盛事体を消す場合は

unset xtics

目盛幅を任意の数にするときは(例えば3なら)

set xtics 3

 という風に書きます。

 

では次の記事では複数のグラフを(x軸またはy軸を共有して)同時に出力する方法を書きたいと思っています。

 

では。

gnuplotの使い方【色の変更、ラベル、凡例の編集】

 

前記事で書いたようにこの記事では理系のレポートにできるだけ適した

フォーマットにグラフを近づけるようにするコマンドをいくつか紹介したいと思います。

 

まず1つ目、グラフの線をカラーではなく黒にする。

レポート用に使用するグラフにカラフルなものはあまり好まれません。

なのでこのコマンド

plot 'data.csv' using 1:2 with line linecolor -1

 以前紹介したCSVファイルを1列目と2列目を使用し、線で結んで表示

するコマンドに付け加えたlinecolor -1が今回のコマンドです。

 

その名の通り線の色を指定しています。数字の部分は色が割り当てられています。

(黒が-1なのでそれ以外の色の数字は覚えていませんが試してみてください)

 

2つ目、軸ラベルの編集

こんな感じ

set xlabel 'x'
set ylabel 'x^2'
replot

 ''の中身がラベル名になりますが、ここでポイント。

^の後ろに文字を書くと上付き文字

_の後ろに文字を書くと下付き文字にできるので

指数や添え字を書くときに使ってみてください。

例 : ㎡を書くときはm^2

 

3つ目、凡例の編集

凡例はデフォルトだとplot以降のコマンド(data.csv using 1:3)みたいなのが

表示されますがこれを任意の名前にするには

plot 'data.csv' using 1:3 with line linecolor -1 title 'f(x)'

 といった風に書きます。長くなりましたね(笑)

 

title 'f(x)'の部分で凡例名を指定しています。''の中がその凡例名ですね。

 

また、凡例を表示する必要がないときは

unset key

 で消せます。

 

以上のようなコマンドを用いると

f:id:hima_b:20170420212611p:plain

こんな感じのグラフが描けます。

それっぽくなったでしょ?(笑)

 

あとはレポート上に張り付けるだけ。(もちろんこれを張った下には図の名称を書きましょうね)

 

今回紹介した以外にもgnuplotにはいろいろな機能があります。

(正直なところここで述べたことなんて米粒程度にも満たない)

 

ので、知りたい人は調べてみてください。

 

長々と数記事にわたりましたが以上です。

(またそのうちほかの機能について書くこともあるかも?)

 

では。