ラベル コンパイル の投稿を表示しています。 すべての投稿を表示
ラベル コンパイル の投稿を表示しています。 すべての投稿を表示

2016年8月23日火曜日

風のごとくコンパイルする

風キッズの皆さんお久しぶりです。
今回は風のようにコンパイルする方法を紹介します。
基本的には以前の記事と同じ内容になりますが多少改良を加えてみました。
ここでは/usr/local/binにパスが通っているものとします。

$ sudo vi /usr/local/bin/compile

でコマンドを作成し、以下をコピペしてください。

#!/bin/sh
# Compile C file.
set -Cue

if [ $# == 0 ]
then
    echo "No argument."
    exit 1
fi

if [ -f $1.c ]
then
    gcc -o $1 $1.c -lm -lfftw3 -x c -g -Wall -Wextra ${@:2}
else
    echo "No such a C file."
    exit 1
fi

実行権限を与えます。
$ sudo chmod +x /usr/local/bin/compile

これでどこでもhoge.cを
$ compile hoge -option1 -option2
でコンパイルできます。

ある順番以降の任意の個数の引数を後ろにつける方法はこちらの記事を参考にしました。
また、gccの警告オプションについての説明はこちらの記事なんかがいいんじゃないかと思います。

2016年8月1日月曜日

AtomエディタでさいつよのLaTeX環境を構築する

アトム、してますか?
AtomとはGithubが開発した近年注目のエディタであり、ITやWebの界隈の若い人たちには広まってきていますが、アカデミックな世界ではまだEmacsやVim、Visual Studioを使用する傾向が根強く、LaTeXに関する情報もあまり充実しているとは言えません。
そこで今回は、研究室内で数少ないAtom派の筆者がLatex環境の構築について解説したいと思います。

まずは入れるべきパッケージを紹介します。

① latex

AtomからLaTeXファイルを直接コンパイルするパッケージ。
筆者の環境である(u)pTeXエンジンでLatexmkを使う前提で話を進めます。
まずは設定から「TeX Path」を設定し(El Capitan であれば /Linrary/Tex/texbin になるはず)、「Builder」を「latexmk」、「Engine」を「pdflatex」とします。
「Custom Engine」に「latexmk -pdf」と入力します。
出力形式は「pdf」、「Open Result after Successful Build」、「Open Result in BackGround」と「Always Open Result in Atom」にチェック
次にホームディレクトリに .latexmkrc ファイルを作成し、以下のコードを貼り付けます。

#!/usr/bin/env perl

# Commands
$latex            = 'platex -synctex=1 -halt-on-error';
$latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex %O %B';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';

# Max number of typeset
$max_repeat       = 5;

# Make pdf via dvi
$pdf_mode   = 3;

# Preview application
# $pdf_previewer    = "open -a /Applications/Atom.app";

# Overwrite setting
$pvc_view_file_via_temporary = 0;

これが何をしているのかの解説はこちらこちらなどに任せます。
各自で適宜修正してください。
これで Ctrl + Option + b と押すだけでコンパイルとpdfの更新ができます。
保存するたびに自動でコンパイルしたい場合には「Build on Save」を、ソースジャンプをしたい場合には「Enable SyncTeX」をチェックしてください。



②language-latex

LaTeXの文法に合わせてカラーをつけてくれるパッケージ。
タブ幅や折り返し幅も設定できます。



③latexer

文法や参照の自動補完をしてくれるパッケージ。
BibTeXのcitationなどに非常に便利。


④pdf-view

Atom内でpdfファイルを開くパッケージ。
ズームや上下移動もキーボードからできます(誰かvimのキーバインドで移動する方法があれば教えてください…)。
「SyncTex Reverse sync behavior」は「Click」または「Double Click」にしておきましょう。


これで準備は整いました。
あとは編集して保存するたびに自動でpdfが更新され、クリックでソースにジャンプすることができます。
これでもうSkimもSumatraも不要です。
必要なのはただ1つ、Secom Atomだけです。

※ 2016/10/29 追記





2016年3月14日月曜日

LaTeXからPDF変換時の用紙サイズ

前回のフォントの記事に加えて、LaTeXから最終的な.pdfのファイルにした場合に、用紙サイズがおかしい時の対処方法もメモしておきます。



2016年3月9日水曜日

LaTeXで太文字がうまく出ないときの対処方法


2月3月は卒業論文・修士論文など論文の時期ですね。

LaTeXで投稿論文や学位論文を執筆して、platexなんかを使って.dviファイルへとコンパイルしたあと、最終的に.pdfファイルに変換した結果、太字がうまく出ない(下左図)なんてことはありませんか?



2013年6月17日月曜日

引数が可変個のgccのコマンド簡略化

こちらの記事でも紹介されているように、よく使うコマンドは簡単なコマンドで置き換えてしまうと楽です。
でも僕の場合、頻繁にg++でコンパイルするのですがプログラムによって
g++ main.cpp -g -Wall -o main -lmylib
でコンパイルできることもあれば
g++ main.cpp -g -Wall -o main -lmylib -litpp -ljpeg -ltiff -lgsl
などと多数の外部ライブラリを用いることもあります。
ダイナミックライブラリなら全て後者でやっても問題無いのかもしれませんが、何か腑に落ちません。

なので可変個数の引数を取れるようにしたコンパイルコマンドの簡略化をシェルスクリプトで試みました。
以下がソースです。
# 引数1個めと2個めは入力ファイル、出力ファイル
function cc(){
    arg=("$@")
    command="gcc -O3 -g -Wall ${arg[1]} -o ${arg[2]} -lmylib"

    if [ $# -gt 2 ]; then
        for i in `seq 3 $#`
        do
            command="${command} ${arg[$i]}"
        done
    fi
    
    echo $command
    eval $command
}
ここでは-lmylibは必ず使うという前提でやってます。
あんま需要無いかもしれませんがよろしくです。

2012年4月27日金曜日

.texのコンパイルと.bibの使い方

texは論文等を書く研究者にとって,美しい文章を作るために必要不可欠なソフトである.
現在我らがochiailabではTeXShopの利用を推奨している.コンパイルするには.texファイルをアイコンにドラッグし,タイプセットを押すだけという大変シンプルなものである.しかしながら,実は設定がうまく行ってなかったりすると,文字コードや関連付けの事情によりエラーを起こしてしまい,「わけわからん!!」と憤慨することとなる.

このようなことに対応するために,.texファイルをiTerm上のコマンドを打ち込むことでコンパイルする方法を紹介したいと思う.同時に,.bibファイルを作ることで,参考文献の簡単な参照の仕方も説明する.これを使うことにより,いちいち論文ごとに参考文献を最適に並べ替えたり,使用していない文献をコメントアウトしたりすることが必要なくなるので,是非活用してもらいたい.

まず,普段通り.texファイル( test.tex )とそれをコンパイルするのに必要な.cls( ieicej.cls )ファイルなどを同じフォルダに用意する(ここでは test folder に入れることとする).また,.bibファイルを使うために今回は"IEEEtran.bst"も用意しよう.
ここで,test.texとieicej.clsの文字コードが "utf-8" となっているか確認する.emacsを使っている人は,そのファイルを開き,

C-x RET f (Controlとxを同時押しー>リターンー>f)

と打ち込むと文字コード入力待機状態となるので,

utf-8 RET

と打ち込もう.こうすることで文字コードを"utf-8"に変えることができる.

つぎに,.bib(test.bib)ファイルを作ろう.ファイルの中身はこんな感じ.


@article{Thomas,
author = {C. M. Thomas and M. Y. Weidner and S. H. Durrani},
title = {{Digital Amplitude-Phase Keying with MAry Alphabets}},
journal = {IEEE Transactions on Communications},
volume = {22},
year = {1974},
pages = {168--180},
issue = {2},
doi = {10.1109/TCOM.1974.1092165},
masid = {1458543}
}

「……なんだこれ」と感じるかもしれないが,これはひとつの文献に関する情報をまとめたもので,このまとまりを自分が参照したい文献についてそれぞれ作って.bibファイルに書き込んでいく.「こんなのだるいわー」というそんなあなたも大丈夫.これはネット上で自動生成することができる.

そのやりかたの一つとして,"Microsoft Academic Search"という検索エンジンで,その文献を検索する方法がある.今回は『Digital Amplitude-Phase Keying with MAry Alphabets』を検索してみよう.するといくつか候補が出てきて,今回は一番上に目的の文献が出てきた.このページに飛んでみると,

こんなページが出現する.ここで文献名の横にある『Export』をクリックしてみてほしい.そうすると,

こんな感じで,先ほど.bibファイルに書き込んでいた情報が現れる.これをCopy&Pasteするといい.ここで,書き込んだあとに,\cite{Thomas}でこの文献を参照できるように,ラベル付けをする必要がある.これは.bibファイルの例で示したように一行目の赤色の部分に"Thomas,"と書き込むだけでよい.

こうすることによって,.bibファイルを作る.そのあと,.texファイルにこれを参照するための文章を書き込む.


\bibliographystyle{IEEEtran}
\bibliography{test}

この文章はいつも参考文献を書いている一番最後の部分に書き込めばいい."test"とかいてある部分は,参照する.bibファイルの名前を入れればいい.あとはいつものように\cite{***}によって,文献を参照するだけである.

ここまでできたら,コンパイルをはじめる.まずCurrent directoryをtestにし,そこから以下のコマンドを入力していく.

test > platex test.tex
test > bibtex test
test > platex test.tex
test > dvipdfm test.dvi
test > dvipdfm test.dvi

これで自動で順番を並び替えて参照されているtest.pdfができているはずだ.
これを活用してみんなで論文をどんどん書いていこう!







2012年1月30日月曜日

bashを利用した簡単コンパイル

ヘッダやライブラリを使ってプログラムを書いていると,
徐々にgccのコマンドが伸びてきて打つのが大変になってきます.
たとえば僕の例だとプログラムフォルダの上に utility/ というフォルダを
作ってそこにヘッダファイルを入れているので,
$ gcc -O3 -o main main.c ../utility/hoge.c ../utility/hugya.c -lfftw3 -g
みたいな感じでいちいち打っていました.長くてめんどくさいですね.
こんなとき,makefileを使うのがひとつの手段としてありますが,他にスクリプトを利用する方法があるので参考程度にご紹介します.
まず適当にc.shという名前のファイルを作ってヘッダと同じフォルダに入れておきます.

#!/bin/sh
gcc -O3 -o $1 $1.c ../utility/hoge.c ../utility/hugya.c -lfftw3 -g

gccの行は自分がいつもコンパイルする時のスタイルで書きます.
$1c.shの引数をあらわしていて,
この場合ターミナル上でプログラムフォルダから,
$ ../utility/c.sh main
みたいな感じで書くとmain.cがコンパイルされて同名のプログラムができます.

これでもまだちょっとコマンドがめんどくさいので,
ここからさらに短くするためにbashの設定ファイルをいじります.
ochiailabの人は,~/emacslib/ の中に dotbashrc ってファイルがあると思うので,
それをemacsかなんかで開いて以下を追記します.

alias c="../utility/c.s"

これはエイリアスといって,ターミナルで入力される文字列(ここでは c )に
"" の中の文字列をあてがっててくれる便利なものです.
これで,ターミナル上でコンパイルしたいプログラムのあるフォルダに移動して,
$ c main
と打ち込むと,これだけでコンパイルできるようになります.

これは自分の今の方法ですが,最近ヘッダがでかくなってきたせいで,
コンパイルに時間がかかるので,分割コンパイルと併用してこうと考えています.

あと,スクリプトを工夫することでmakeっぽく使うことも出来るはずなので,
試してみてできたら書きます.

※蛇足
emacslibにはemacsやターミナル等の設定ファイルが入っているので,
Sugarsyncなんかで同期しとくとどこのPCでも同じ環境が使えて便利です.
このとき異なるPCでコンパイルしようとすると,
ファイル権限の関係で permission denied. と言われることがありますが,
$ chmod a+x c.sh
とすると使えます.


自作ライブラリの管理

前回のネタで紹介した自作のライブラリをMakefileによって管理する方法を思いついたのでメモしておく。

その前に、前回のコンパイル方法をもう一度載せる。
$ gcc -shared mylib.c -o libmylib.so


実はこれ以外にももう一つコンパイル方法がある。

$ gcc mylib.c -c  
$ gcc -shared mylib.o -o libmylib.so   
このようにオブジェクトファイルを介してでもコンパイルは成功する。

なので、例えばmylib1.c, mylib2.c, mylib3.cと複数のソースファイルを作ったときは、libmylib1.so, libmylib2.so, libmylib3.soと別々にライブラリファイルを作ってもいいけど、
$ gcc -shared mylib1.o mylib2.o mylib3.o -o libmylib.so
で一括して1つのライブラリファイルとして管理することもできる。
 
さらに、次のように書いたMakefileを自作ライブラリのフォルダに入れておく。
CC=gcc
CFLAGS=-g -Wall
OBJS=mylib1.o mylib2.o mylib3.o

all: libmylib.so

libmylib.so: $(OBJS)
    $(CC) -shared -o libmylib.so $(OBJS)
 
mylib1.o: mylib1.h mylib1.c
    $(CC) $(CFLAGS) -c mylib1.c
 
mylib2.o: mylib2.h mylib2.c
    $(CC) $(CFLAGS) -c mylib2.c
 
mylib3.o: mylib3.h mylib3.c
    $(CC) $(CFLAGS) -c mylib3.c

clean:
    rm $(OBJS) libmylib.so 

これで、もしソースファイルに更新があった場合はmakeするだけでライブラリを更新してくれる。
前回で僕がヘッダファイルもライブラリファイルもめんどくさいから一緒のフォルダで管理していると書いたのは、別にするとMakefileの記述が面倒になるからなのである。

これは最近思いついた方法やけど便利。

2012年1月28日土曜日

自作のライブラリ

自分が作ったオリジナルの関数やクラスは一つのフォルダで管理して、どんなソースコードやプログラムからでも呼び出せるようにしておくと楽。
ここではMacでの共有ライブラリの設定方法を載せる。

まずライブラリを一括して管理しておくフォルダをホームフォルダ直下にある「library」として、そのフォルダへのパスの設定を行う。
以下を自分のホームフォルダにある「.bash_profile」というファイルに書きこむ。
export C_INCLUDE_PATH=~/library/:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=~/library/:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=~/library/:$LIBRARY_PATH
export DYLD_LIBRARY_PATH=~/library/:$DYLD_LIBRARY_PATH
 
最初の2行により、gccやg++が指定されたインクルードファイルをこのフォルダから探してきてくれる。
次の2行も同様にコンパイラがライブラリを探すフォルダを指定している。
「library」からさらに「include」と「lib」というフォルダを作ったりしてヘッダファイルとライブラリファイルを別で管理してもいいと思うけど、僕はめんどくさいので今んとこ同じフォルダにしている。

次に実際にgccやg++によってライブラリファイルを作る。
ここではmylib()という関数が含まれたmylib.cとヘッダファイルmylib.hをライブラリ化するものとする。
以下のようにコンパイルを行う。
$ gcc -shared mylib.c -o libmylib.so
成功すればlibmylib.soが出来上がる。
ここで、"lib"という頭文字は必ず付けなければいけないらしい。
これがライブラリファイルであり、これとヘッダファイルを先ほどの「library」フォルダに置いておく。
これだけでライブラリとして使える。

使用方法は、ソースコード内で以下のようにする。

#include <mylib.h>
...
int main()
{
   mylib();
}

mylib.hのインクルードは<>でくくればOK。
これをコンパイルするのは以下のようにする。
$ gcc main.c -o main -lmylib
-lのあとにライブラリ名を入れたオプションを付ける。
これで正常にコンパイルが通るはず。

以上が共有ライブラリのおおまかな設定方法である。
注意事項として、もしかしたら古いMac版のgccやg++だと-sharedというオプションに対応していない可能性がある。
その場合は-bundleを使うみないな情報をネットで見たけど確認は出来てない。

Makefileを使ってもっと便利にライブラリの管理ができる方法を今考えているので、そのうち載せたいと思う。



2012年1月27日金曜日

Makefile

たくさんのソースファイルを分割コンパイルする際に、フォルダごとにMakefileというファイルを作ると便利。
Macでコンパイラとしてgccを使う場合のテンプレートは以下。

CC=gcc
CFLAGS=-g -Wall
OBJS=library1.o library2.o library3.o main.o

all: main

main: $(OBJS)
    $(CC) $(CFLAGS) -o main $(OBJS)

main.o: main.c library1.h library2.h library3.h
    $(CC) $(CFLAGS) -c main.c

clean:
    rm main main.o library1.o library2.o library3.o

CCはコンパイルコマンド、CFLAGSはコンパイル引数、OBJSはリンクさせる全てのオブジェクトファイル。
作業フォルダにMakefileを置いてコマンドラインで 
$ make
とするだけで、更新されたファイルを自動で判別してコンパイルしてくれる。
これを応用したものを自分のライブラリに置いておくと、各ライブラリを更新した際の作業が減るが、僕はまだやったことありません。 誰かやってみて欲しい。
あと、terminalのbashファイルに色々書いて、コンパイルコマンドを省略するやり方も誰か書いてほしい。

分割コンパイル

その名の通り、1つのプログラムを作るために複数のソースファイルを用いて分割してコンパイルする。

main関数が含まれるソースファイルmain.cのコンパイル
$ gcc main.c -c
これによってmain.cのオブジェクトファイル(Macだとmain.o)が生成される。

自作のライブラリ関数が含まれるソースファイルlibrary.cのコンパイル
$ gcc library.c -c
これで同様にlibrary.cのオブジェクトファイルが生成される。

 あとは、これらのオブジェクトファイルを一つのプログラムにする。
$ gcc main.o library.o -o main


分割コンパイルの利点はソースコードが汎用的になるということ以外もある。
複数人でプログラムを作成する際に、オブジェクトファイルとその中の関数の仕様が書かれたヘッダファイルのみを共有することによって、自分が書いた関数の定義部分をいじられなくて済む。

コンパイルの際に細かい警告まで出力

コンパイル引数として-Wallを付けると、細かい警告まで出力してくれるようになる。


$ gcc main.c -o main -Wall