2012年1月12日木曜日

TeXで添字を揃える

一般相対論なんかのために

\newcommand\ind[3]{{\hspace{0pt}\scriptsize
\renewcommand\arraystretch{0.7} \arraycolsep=0pt ¥begin{array}{#1} #2 \\#3  \end{array}}}


※)MathJaxを避けるためにbegin{array}...のまえの円マークが全角になっています。

2011年7月1日金曜日

scheme(gauche) でquicksort

haskellではquicksortがやたらエレガントに書ける。
([1]を参考にしました)


quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = qsort smaller ++ [x] ++ qsort larger
  where
    smaller = [ a | a <- xs, a <= x]
    larger  = [ b | b <- xs, b > x ]

これの発想をちょっと真似たらschemeでもなかなかうまくかけた。(気がする)

(use srfi-11)

(define (lefter&righter ord a lst)
  (let loop ((rmn lst) (lefter '()) (righter '()))
    (cond ((null? rmn) (values lefter righter))
 ((eq? (car rmn) a) (loop (cdr rmn) lefter righter))
 ((ord (car rmn) a) (loop (cdr rmn) (cons (car rmn) lefter) righter))
 (else (loop (cdr rmn) lefter (cons (car rmn) righter))))))

(define (quicksort ord lst)
  (if (null? lst) lst
      (let-values (((lefter righter) (lefter&righter ord (car lst) (cdr lst))))
(append (quicksort ord lefter) `(,(car lst)) (quicksort ord righter)))))

初めにHaskell版のwhere以下に相当する関数を作っている。
(これ自体きっと有用だろう。)
あとはHaskell版とほとんどおなじだ。

新しい点としては順序ordを指定できること。
これで文字列間の順序なんかも定め整列させることができる。

あとこのプログラムを作っている過程で多値に目覚めてしまった。
別になくてもいいけどあるととても楽!



[1] プログラミングHaskell Graham Hutton 著 山本和彦 訳

2011年5月12日木曜日

正方形のpdfファイル

なぜかプレゼンテーションを正方形でやりたくなった。
情報まとめ

step1 psファイルを作成する
step2 正方形にする
step3 pdfにする

step1 
TeXを使用していたのでここはdvipsで問題ない。

step2 
できあがったpsファイルをテキストエディタで開く。
冒頭の

%!PS-Adobe-2.0

を

%!PS-Adobe-2.0 EPSF-2.0

に変更。(バージョンは適当に)
%%DocumentPaperSizes をa4からsquareに変更。
BoundingBoxを正方形にしないと上が適応されない模様。

Step3
オプション
ps2pdf14 -dEPSCrop foo.ps
によって正方形のPDFファイルができるが、BoundingBoxがうまく設定されていない。
しかしPDFのそれを変更する方法が分からなかったので、Step2でできたPSファイルを一ページずつPDFに変換し結合するという方法をとった。これはシェルスクリプトでできる。
以下のようなかんじ

#!/bin/bash

for i in `seq 1 2`
do
    psselect -p $i $1.ps $1_00$i.ps
    ps2pdf14 -dEPSCrop $1_00$i.ps
done
pdftk $1_[0-9][0-9][0-9].pdf cat output $1.pdf
rm $1_*ps
rm $1_*pdf

これで美しい正方形が!
これからTeXのレイアウトなどを調整せねばならぬが、 それはおいおい

参照文献
http://www11.atwiki.jp/physnote/pages/24.html#id_08937a2a
に大変助けられました。

2011年2月17日木曜日

asirで作業内容を記録する

linuxなら

asir | tee filename

で起動し、

ctrl("echo",1);

で入力内容も出力するようにしてやれば一連の作業内容をfilenameに記録することができる。

2010年7月27日火曜日

Lisp

Lispの勉強を始める。細かくはscheme by gauche。

湯浅太一 著 『Scheme入門』 岩波書店

を差し当りの参考に。しかしこの本の前半部については、「魔法言語 リリカル☆Lisp」の方が分かりやすかったように思う。これを一通り読めたらSCIPに挑戦してみたい。

2010年2月27日土曜日

多次元配列を関数に渡す

メモリは一次元なので、多次元配列をそのまま格納することはできない。
サイズの分かっている配列ならば、以下のようにできる。

int func(int (*array)[]) ;
int main()
{
    int array[2][3] ;

    ...

    func(array) ;

    ...

}

int func(int (*array)[])
{
    ...
}

main関数内でサイズを決定するような場合は、一旦一次元化するしかなさそうだ。


int func(int *array, int N, int M) ;
int main()
{
    int i,j ;

    int N = 2 ;
    int M = 3 ;

    int array[N][M] ;

    ...

    int align_array[N*M] ;

    for(i=0; i
        for(j=0; j
            align_array[N*i +j] =array[i][j] ;

    func(array) ;

    for(i=0; i
        for(j=0; j
            array[i][j] =align_array[N*i +j] ;

    ...

    }

int func(int *array, int N, int M)
{
    int array[N][M] ;

    for(i=0; i
        for(j=0; j
            array[i][j] =align_array[N*i +j] ;
    ...

    for(i=0; i
        for(j=0; j
            align_array[N*i +j] =array[i][j] ;

    ...

}

2010年2月21日日曜日

Cスタイル

昨年の半ばまでC++の命令を用いてスクリプトを書いていたが、その流れはC言語スタイル、しかも洗練されてないごちゃごちゃスタイル…

というわけで「Cらしい」記述を目指す。

TeXも然り