S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 |
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
[2007-02-16-6]に記したやつだが、コメントアウトしすぎて年の前にもカンマが登場してしまった。以下のようにするとうまくいってるようだ(ちょい不安)
FUNCTION {format.date} { year "year" bibinfo.check duplicate$ empty$ { "empty year in " cite$ * "; set to ????" * warning$ pop$ "????" } 'skip$ if$ % extra.label * before.all 'output.state := " (" swap$ * ")" * }
Visual Studio のビルドイベントであるディレクトリへのコピーを指定していたが、もしそのディレクトリが無かったらコマンドがエラーになるのでビルドに失敗することに気付いた(当り前だが)。
そこで以下のようなコマンドを追加した。「fugaディレクトリが無ければ作成」の意。mkdirは既に存在するディレクトリを指定するとエラーを返すみたいだ。
dir fuga || mkdir fuga
(dir fuga || mkdir fuga) && echo OK
年の部分が(1999a)のようにアルファベットがつくのがうっとうしかったが、以下のように2行コメントアウトするとこれが消えると岡野真人君に教えてもらった。
FUNCTION {format.date} { year "year" bibinfo.check duplicate$ empty$ { "empty year in " cite$ * "; set to ????" * warning$ pop$ "????" } 'skip$ if$ % extra.label * % before.all 'output.state := " (" swap$ * ")" * }
題名の通り。さわりだけメモ。
import time time.localtime() # OK localtime() # error: not definedだが
from time import * localtime() # OKである。つまり後者のがスコープ範囲がでかい。なぜそうなっているのかは、全く理解していない。
import time tm = time.localtime() time.sleep(1) print time.strftime('%y%m%d_%H%M%S') # 070216_021308 (current time) print time.strftime('%y%m%d_%H%M%S', tm) # 070216_021307 (previously stored time)
題名の通り。こうするとリンクファイルの位置によらずリンクが生きるようだ
ln -s `pwd`/myfile_real myfile_link
Emacsでキルやコピーした文字列はキルリング(kill-ringというリスト)に格納される。ここに自分で文字列を設定したい場合はconsなどを駆使するのではなく、kill-newという関数を用いると良い。
(kill-new "hello")あんまり「それっぽいくない」関数名である。
矩形の切取り(kill)はあるが、コピーは無い。read-onlyなバッファから矩形を持ってきたい場合などに欲しいなあと思ったので作ってみた。
(defun copy-rectangle () (interactive) (setq killed-rectangle (extract-rectangle (region-beginning) (region-end))) ) (global-set-key "\C-xrw" 'copy-rectangle)
M-x aproposとすれば、与えた正規表現にマッチする関数を列挙できる。これが無ければEmacsをいじるのは苦行
レジスタ関連の関数で、レジスタ変数はどうやって指定するのかわからなかったが、調べたところレジスタを表す1文字の前にクエスチョンをつけるようだ。以下みたいに。
(defun my-copy-to-register () (interactive) (copy-to-register ?a (region-beginning) (region-end)))
region-beginningとregion-endはリージョンの始点と終点を表す。以下は指定したリージョンを消す関数。
(defun my-delete-region () (interactive) (delete-region (region-beginning) (region-end)))
python-modeはなかなか便利。http://aki.issp.u-tokyo.ac.jp/itoh/PukiWiki/index.php?python
M-x py-shellでpythonコンソールが現れる。普通のシェルでpythonを起動するとキーバインドの点で不満が大きいが、Emacs上ならそんな問題はない。色々と便利機能があるみたいだが、py-shellに限れば
M-n comint-next-input M-p comint-previous-inputでヒストリが辿れればまあ満足。
[2007-1-26-1]で記したように、手持ちのノートPC(ThinkPad T42)の液晶がブッ壊れた。うっすら画面表示が見えるので、原因はケーブルでなくバックライト周りの不具合だろう。
で、インバータが原因かなと思った。もともとついてるインバータカードは26P8464なる型番だが、これは27K9972と名前が変わったそうだ。IBMに聞いたらば、液晶パネルは5万以上するがインバータは2500円程度のことで、まずは修理を試みる価値がある。秋葉原へ行ってみたが、若松通商、CoCoNet液晶工房、その他ジャンク屋を回ったが、目当ての型番のものはなかった。ちょっと新しすぎたか。というわけでIBM部品センターに連絡してインバータを手配してもらい、換装してみた。
・・・が、症状は変わらず!原因はインバータではなかった。
よって、バックライトそのものが切れたのだと判断した。要は蛍光灯(CCFL: Cold Cathode Fluorescent Lamp、冷陰極管)なので、切れるのは不思議ではない。「DynaBookのバックライト交換」というページや「液晶のバックライト交換、成功例とバックライトの寸法について」というページを見るとこれを換装してキッチリ液晶モニタを復活させている。駄目元で、私もこれに挑戦しようと思った。
まずはThinkPadをバラして液晶パネルをむきだしにすることから初めたが、分解はやたらと面倒だった。保守マニュアルに従えば難しいわけではないが、ほとんどの部品を外す必要があるので「元に戻せるのだろうか」というドキドキ感と戦う必要があった。で液晶パネルに辿りついたが、パネルはSamsung製LTN141P4-L02なるものだった。このパネル用のバックライトは290mm長、2mm径のものだそうだ。CoCoNet液晶工房の在庫にこれを発見したので、買って(1500円)換装を試みる。
長い道程を経て取り出したバックライトはこんな外観。
コの字型の金属の中にスッポリ入ってた。
正しくは「コ」の字でなく、一辺が長いコの字である。長い辺がパネルの裏に来る配置である。白い円筒状のものは、パネルが倒れないように支えで用いたスプレーのり。
金属型とパネルのガワ(プラスチック)は両面テープでガッチリくっついていた。画像中、金属型が汚れているように見えるのは両面テープの跡。
むきだしのバックライトはこんな感じ。買ってきたバックライトも一緒に写っている。細い!すぐに割ってしまいそうであった。(実際、2回割った)
絶縁のためのゴムが被せられていた。ゴムを取った状態の長さは294mmであった。ギリギリの所にハンダ付けがしてある。
買ってきたバックライトはガラス管の部分だけで292mmあったため、長さ(短かさ)に余裕はない。ギリギリのハンダ付けを行ったが、それでも294mmより長くなってしまった。店で実測させてもらったが、全長には2mm以下程度のロット差があり、かつ短かくすることは不可能(長くすることは針金の配線などで容易)であるから、あらかじめ2mm程度短かめのものを買うのがいいだろう。
半田付けの後に、バックライトを金属の型に格納する。これが結構面倒で、割る恐怖と闘いながら結構グニグニして入れたため、型が歪んだ。これは、換装後に明るさのムラとなって現れた。
とにかく、換装に成功し、液晶も無事写るようになったので万万歳である。時間はかかったが、パネル代は浮いたし、何よりハンダゴテを握ってコンピュータを修理できたことで自信と満足感を得た。しかし、分解は面倒だったし、バックライトは割れやすくて交換が難しく、その上最取り付けと組み立てはさらに面倒で、「これからはバックライト交換し放題だぜ」とは思わなかった。メーカーや在野の修理センターでは2万円程度でバックライト交換サービスなどがあるが、(私がやったような稚拙なものではない)技術料込みでこの値段は「スゴイ!お得!」と感じた。理解はどうでもいいので、ただ直したいという人は間違いなく修理を依頼するのが良い。個人的には自分でやってよかったと思った。
オマケ。むきだしの液晶パネルはこんな外観を持っている。
液晶はガラス基板(だと思う)にくっついてるが、こんな風にパカッとなる(白いシールは剥がした)
液晶の下には拡散板らしきペラペラしたシートが2枚ある。脇のコの字型ピンを外すとペラっとなる。この下には2mm程度の厚みのアクリル板らしきものがあった。
バーコードリーダやバーコード作成ソフトが手の届く値段にあった。
ラベル屋さん <= HOMEはフリーソフトみたい(いいのか?)
バーコードリーダーを使ってみよう <= 1万強
QRコードも作れるみたいだ。個人の情報整理にあたって出番はあるのだろうか?
以下は「TEX: 部分的に行間を変える方法 @sarunoie」の内容の引用です:
\newenvironment{minilinespace}{ \baselineskip = 1mm } \begin{minilinespace} hoge \end{minilinespace}
WikipediaのHTMLを、chalowの表用にpythonで整形するスクリプトを書いた。大したコードじゃないが不慣れから結構時間を喰った。何回かこういうことをこなしていけばスラスラ書けるようになるのかな。
import sys def split_elements(str, tag): tag_start = '<%s>' % (tag) tag_end = '</%s>' % (tag) if -1==str.find(tag_start): return [] startpos = str.find(tag_start) + len(tag_start) str = str[startpos:] # discard the "header" records = [] for record in str.split(tag_start): endpos = record.find(tag_end) if -1!=endpos: # non-closed tag will be ignored record = record[:endpos].strip() # end-tag and newlines are not needed records.append(record) return records def format_printable(num): str = open('ascii_printable%d' % (num), 'r').read() str = str.replace(' ', ' ') str = str.replace('&', '&') str = str.replace('<', '<') str = str.replace('>', '>') records = split_elements(str, 'tr') for record in records: datas = split_elements(record, 'td') if 0==len(datas): # ignore <th> record continue for data in datas: print '||%s' % (data), print def format_nonprintable(): tdtag = '<td style="font-family: \'lucida sans unicode\',\'arial unicode ms\';">' str = open('ascii_nonprintable', 'r').read() str = str.replace(tdtag, '<td>') str = str.replace(' ', ' ') records = split_elements(str, 'tr') for record in records: datas = split_elements(record, 'td') if 0==len(datas): # ignore <th> record continue del datas[4] # figure for data in datas: print '||%s' % (data), print format_nonprintable() print format_printable(1) print format_printable(2) print format_printable(3)
ASCIIはデータについて考える上で欠かせない知識だ。Wikipediaに素晴らしい記事があった。以下はほぼ同一の内容を改めて記したものである(Wikipediaはサクサク表示できない場合もあるので)。
理解のためのヒント:
・大文字のASCII値に32を加える(6ビット目を1にセット)と小文字に変換出来る。
・数字に48を足したものがそのASCII値である。逆に、ASCII値の上位4ビットを無視する(48を引く)と対応する数字になる。
・制御文字は、ASCII値に64を足したもの(7ビット目を1にセット)で表す慣習がある。例えばCRなら、13+64=77のMを用いて"^M"、LFなら10+64=74のJを用いて"^J"とする。ハット"^"はCtrlキーを表す。もともとCtrlキーは7ビット目を無効にする役割を担っていたそうな。
制御文字:
2進 | 10進 | 16進 | 略語 | 名前/意味 |
0000 0000 | 0 | 00 | NUL | 空文字 |
0000 0001 | 1 | 01 | SOH | ヘッダ開始 |
0000 0010 | 2 | 02 | STX | テキスト開始 |
0000 0011 | 3 | 03 | ETX | テキスト終了 |
0000 0100 | 4 | 04 | EOT | 転送終了 |
0000 0101 | 5 | 05 | ENQ | 問い合わせ |
0000 0110 | 6 | 06 | ACK | 肯定応答 |
0000 0111 | 7 | 07 | BEL | ベル |
0000 1000 | 8 | 08 | BS | 1文字後退 |
0000 1001 | 9 | 09 | HT | 水平タブ |
0000 1010 | 10 | 0A | LF | 改行 |
0000 1011 | 11 | 0B | VT | 垂直タブ |
0000 1100 | 12 | 0C | FF | 改ページ |
0000 1101 | 13 | 0D | CR | 復帰 |
0000 1110 | 14 | 0E | SO | シフトアウト |
0000 1111 | 15 | 0F | SI | シフトイン |
0001 0000 | 16 | 10 | DLE | データリンク拡張 |
0001 0001 | 17 | 11 | DC1 | 装置制御1,XON |
0001 0010 | 18 | 12 | DC2 | 装置制御2 |
0001 0011 | 19 | 13 | DC3 | 装置制御3,XOFF |
0001 0100 | 20 | 14 | DC4 | 装置制御4 |
0001 0101 | 21 | 15 | NAK | 否定応答 |
0001 0110 | 22 | 16 | SYN | 同期信号 |
0001 0111 | 23 | 17 | ETB | ブロック転送終了 |
0001 1000 | 24 | 18 | CAN | キャンセル |
0001 1001 | 25 | 19 | EM | 媒体終端 |
0001 1010 | 26 | 1A | SUB | 置換 |
0001 1011 | 27 | 1B | ESC | エスケープ |
0001 1100 | 28 | 1C | FS | ファイルセパレータ |
0001 1101 | 29 | 1D | GS | グループセパレータ |
0001 1110 | 30 | 1E | RS | レコードセパレータ |
0001 1111 | 31 | 1F | US | ユニットセパレータ |
0111 1111 | 127 | 7F | DEL | 削除 |
2進 | 10進 | 16進 | 文字 |
0010 0000 | 32 | 20 | 空白 |
0010 0001 | 33 | 21 | ! |
0010 0010 | 34 | 22 | " |
0010 0011 | 35 | 23 | # |
0010 0100 | 36 | 24 | $ |
0010 0101 | 37 | 25 | % |
0010 0110 | 38 | 26 | & |
0010 0111 | 39 | 27 | ' |
0010 1000 | 40 | 28 | ( |
0010 1001 | 41 | 29 | ) |
0010 1010 | 42 | 2A | * |
0010 1011 | 43 | 2B | + |
0010 1100 | 44 | 2C | , |
0010 1101 | 45 | 2D | - |
0010 1110 | 46 | 2E | . |
0010 1111 | 47 | 2F | / |
0011 0000 | 48 | 30 | 0 |
0011 0001 | 49 | 31 | 1 |
0011 0010 | 50 | 32 | 2 |
0011 0011 | 51 | 33 | 3 |
0011 0100 | 52 | 34 | 4 |
0011 0101 | 53 | 35 | 5 |
0011 0110 | 54 | 36 | 6 |
0011 0111 | 55 | 37 | 7 |
0011 1000 | 56 | 38 | 8 |
0011 1001 | 57 | 39 | 9 |
0011 1010 | 58 | 3A | : |
0011 1011 | 59 | 3B | ; |
0011 1100 | 60 | 3C | < |
0011 1101 | 61 | 3D | = |
0011 1110 | 62 | 3E | > |
0011 1111 | 63 | 3F | ? |
0100 0000 | 64 | 40 | @ |
0100 0001 | 65 | 41 | A |
0100 0010 | 66 | 42 | B |
0100 0011 | 67 | 43 | C |
0100 0100 | 68 | 44 | D |
0100 0101 | 69 | 45 | E |
0100 0110 | 70 | 46 | F |
0100 0111 | 71 | 47 | G |
0100 1000 | 72 | 48 | H |
0100 1001 | 73 | 49 | I |
0100 1010 | 74 | 4A | J |
0100 1011 | 75 | 4B | K |
0100 1100 | 76 | 4C | L |
0100 1101 | 77 | 4D | M |
0100 1110 | 78 | 4E | N |
0100 1111 | 79 | 4F | O |
0101 0000 | 80 | 50 | P |
0101 0001 | 81 | 51 | Q |
0101 0010 | 82 | 52 | R |
0101 0011 | 83 | 53 | S |
0101 0100 | 84 | 54 | T |
0101 0101 | 85 | 55 | U |
0101 0110 | 86 | 56 | V |
0101 0111 | 87 | 57 | W |
0101 1000 | 88 | 58 | X |
0101 1001 | 89 | 59 | Y |
0101 1010 | 90 | 5A | Z |
0101 1011 | 91 | 5B | [ |
0101 1100 | 92 | 5C | \ |
0101 1101 | 93 | 5D | ] |
0101 1110 | 94 | 5E | ^ |
0101 1111 | 95 | 5F | _ |
0110 0000 | 96 | 60 | ` |
0110 0001 | 97 | 61 | a |
0110 0010 | 98 | 62 | b |
0110 0011 | 99 | 63 | c |
0110 0100 | 100 | 64 | d |
0110 0101 | 101 | 65 | e |
0110 0110 | 102 | 66 | f |
0110 0111 | 103 | 67 | g |
0110 1000 | 104 | 68 | h |
0110 1001 | 105 | 69 | i |
0110 1010 | 106 | 6A | j |
0110 1011 | 107 | 6B | k |
0110 1100 | 108 | 6C | l |
0110 1101 | 109 | 6D | m |
0110 1110 | 110 | 6E | n |
0110 1111 | 111 | 6F | o |
0111 0000 | 112 | 70 | p |
0111 0001 | 113 | 71 | q |
0111 0010 | 114 | 72 | r |
0111 0011 | 115 | 73 | s |
0111 0100 | 116 | 74 | t |
0111 0101 | 117 | 75 | u |
0111 0110 | 118 | 76 | v |
0111 0111 | 119 | 77 | w |
0111 1000 | 120 | 78 | x |
0111 1001 | 121 | 79 | y |
0111 1010 | 122 | 7A | z |
0111 1011 | 123 | 7B | { |
0111 1100 | 124 | 7C | | |
0111 1101 | 125 | 7D | } |
0111 1110 | 126 | 7E | ~ |
これはタイトルのまんま
ちょっとしたテキスト整形をpythonでやろうとしたが、ファイル入力あるいは標準入力のコードがとっさに全く思いつかず、ああまだ全然慣れてないのだなと思った。以下にメモる。
import sys f = open('test.txt', 'r') # file #f = sys.stdin # standard input for line in f: # f.readlines() will do the same print line, # comma is to suppress newline characters
[2006-11-24-5]も参照。
シングルクォートの中の文字列でシングルクォートを表現することは無理らしい。今までシングルクォーテーションばかり使ってきたが、ダブルクォーテーションを中心に使う方が良いのか。参考:私のLinux活用記録-21
$ echo 'hello' hello $ echo 'he'llo' > (Ctrl+cを押した) $ echo 'he\'llo' > (Ctrl+cを押した) $ echo "he'llo" he'llo
「NTEmacs22 CVS + IME.patch のバイナリ」 から頂いたNTEmacs22(GNU Emacs 22.0.93.1 (i386-mingw-nt5.1.2600))にYaTeX1.73を導入し、TeXファイルのオープンとタイプセットが無事に行えることを確認した。
[2006-11-21-6]に、emacs22とyatexの組み合わせがうまくいかなかったとメモしていたが、これが何故解消されたかはわからない。まあemacsもyatexもバージョンが上がっているので、何かと改善された点があるのだろう。
当時のメモに「根が深そうだ」とか偉そうなことを書いてしまったが、emacsやyatexのバージョンも、エラーが出るタイミングなども記述し忘れ(当然覚えていない)たため、後の原因究明にちっとも役に立っていない。記録する能力というのは重要だなあと改めて認識した。
画像ファイルを画像データたらしめているのは、ファイル名ではなく画像そのものである。つまり、画像に対していちいちファイル名を用意してそれを基に管理するのは面倒でナンセンスだと考える。(「横着プログラミング 第1回: Unixのメモ技術」を読んでこの考えに至った)
TeXによる文章で図を挿入する際には画像をファイル名で指定する。で、それに対してラベル文字列\label{...}を付し、これが後の参照に使われる(「図\ref{...}」が「図2.4」とかになる)。つまり画像(図)を管理するため2種類もの文字列が使われていることになるのだが、これは2重に面倒である。「ファイル名をラベル文字列とする」とルールを定めれば1重の面倒に改善されるが、それでもファイル名管理の煩わしさは残る。不精な私にとっては、アタマに思い描く画像とファイル名の対応をいちいち把握しておくことはとても面倒だ。
私はTeXの文章作成時には、YaTeXという便利なTeX文書作成補助パッケージを愛用している。これに参照コマンド\refの入力支援機能が備わっているが、そこではラベル文字列の代わりにキャプション文字列で図を管理する。通常キャプション文字列はファイル名などと同じになり得ないので、画像(図)を指定するための文字列を新たに増やしてしまっていることに相当する。これは別にyatexの設計が悪いわけではなく、平テキストで画像入り文章を扱っている以上仕方のないことなのだが、やっぱりこのテの把握と管理は面倒である。
画像のインライン表示によって、この面倒さを解決できないかなあと考えている。emacsは21から画像の表示がサポートされたようなので、例えばTeXのソース編集中に\includegraphics{...}付近に実際の画像の縮小版を表示させることも可能だと思う(画像表示の機構は知らないので、具体的な技術的課題なんかはわからん)。で、その図を\ref{...}する際にも、文書中の画像(図)をサムネイル表示させた上で参照先を選ばせるようにすれば、ラベル文字列との対応でいちいち悩む必要は無い。この時ラベル文字列はただの内部変数の様な役割なので、他と干渉さえしなければ何でもよいはず(ファイル名とか)。\ref{...}付近にも適宜画像を表示させれば、執筆中の文書の見通しも良くなりそうだ。
TeXとは関係ないが、メモツールhowmでも似た事情がある。ちょっとした画像をメモ代わりに残したくなることはあるが、いちいちそれっぽいファイル名を考えて後日アクセスできるようにするのが億劫で、結局残さないなんて本末転倒なこともある。日付+時間とかで必ずuniqueになるファイル名を適当に自動でつけ、メモ中にインライン表示できるようにすれば、気兼ねなく「メモ画像」を扱えるのではと思う。
とりあえず今日は思ったことをメモするだけ。実装したいが、どのくらいの手間暇がいるのだろうか?以下に画像表示のelisp例が記述されていた。
・横着プログラミング 第1回: Unixのメモ技術
・Poohのページ
付加的な価値に目もくれず、本来の機能をひたすら突き詰めた道具が好き。
例えば机なら
・大きい
・頑丈
が私の求める条件で、他の機能は不要だ。
「ある意味ハードだろ(パソコンデスク編) Part4」スレの皆様の議論が大変参考になった。
例えば、こんなやつ。
http://item.rakuten.co.jp/gekiyasukaguya/widedesk_180/
http://garage.plus.co.jp/catalogue8-pdf/pdf/P095-096.pdf
http://garage.plus.co.jp/catalogue8-pdf/pdf/P103-104.pdf
コンピュータへの理解を深めるにはファイルのバイナリ(hex)表示が必須だが、Emacsのhexl-modeはこれを行ってくれる。アドレス関連の操作としては以下のキーバインドが設定されていた。
M-j hexl-goto-address M-g hexl-goto-hex-addressで、キーバインドは設定されていないが、現在のアドレスを知るための関数としてhexl-current-addressなるものがある。以下のようにしてキーバインドを割り付けた。
(define-key hexl-mode-map "\M-c" 'hexl-current-address)
[2007-02-02-01]の続き。
ちょっと試してみたが、PDF形式のデータをクリップボードに用意するのは難しそうだ。
一方でCOMインターフェースからはあっさりできてしまったので、そのVBScriptソースをメモする。嬉しいやら悲しいやら。
Dim appRef, docRef, txt ' 旧バージョンのIllustratorがある場合、以下のように末尾に数字を加えて ' バージョンを指定する。10が1、CSが2、CS2が3 ' "Visual Basic Scripting Reference" (CS2) p.61見よ Set appREf = CreateObject("Illustrator.Application.2") Set docRef = appRef.ActiveDocument 'Set docRef = appRef.Documents.Add ' 新規作成の場合はこちら Set txt = docRef.TextFrames.Add txt.Position = Array(200, 200) txt.Contents = "Itoh et al., Appl. Phys. Lett. 83, 2043 (2003)" ' フォントを見つける Dim fontR, fontB, fontRname, fontBname fontR = Null fontB = Null fontRname = "KozGoStd-Regular" ' 小塚ゴシックStd (R) fontBname = "KozGoStd-Heavy" ' 小塚ゴシックStd (H) 'fontRname = "ArialMT" ' Arial (Regular) 'fontBname = "Arial-BoldMT" ' Arial (Bold) For Each fontToTest In appRef.TextFonts If(fontToTest.Name = fontRname) Then Set fontR = fontToTest ElseIf(fontToTest.Name = fontBname) Then Set fontB = fontToTest End If If(IsNull(fontR) Or IsNull(fontB)) Then ' 何もしない(ループ続行) Else Exit For ' フォント見つかったのでもうループは不要 End If Next If(IsNull(fontB) Or IsNull(fontR)) Then msgbox "fonts not found" WScript.Quit ' 見つからなかったらやめる End If txt.TextRange.CharacterAttributes.TextFont = fontR txt.TextRange.CharacterAttributes.Size = 19 ' 太字にする箇所は別途調べておくなり、それ用のルーチンを用意するなりしておく txt.Characters(32).CharacterAttributes.TextFont = fontB txt.Characters(33).CharacterAttributes.TextFont = fontB
Dim app, objRE Set app = CreateObject("Illustrator.Application.2") Set objRE = new RegExp objRE.IgnoreCase = True objRE.pattern = "kozgostd" For Each font In app.TextFonts If objRE.Test(font.Name) Then msgbox font.Name End If Next
私はプレゼン用スライドなど諸書類はIllustratorで準備することが多い。
で、仕事柄以下の様な形式の論文参照テキストオブジェクトを頻繁に用いる。
Itoh et al., Appl. Phys. Lett. 83, 2043 (2003)
この文字列自体は別途作成した論文整理ソフトから容易にクリップボードにコピーしIllustratorにペーストできる。ペースト自体はすぐ終わるが、上で「83」となっているvolume番号は太字で表記したいので、ペーストの度に手作業でここを太字に直す作業が発生する。これが意外と面倒なので、何とかして一発で太字入りテキストオブジェクトを作成したいと思った。
こういうことはJavascript(参考:【Illustrator CS自動化作戦】)とかCOMインターフェースとかIllustrator SDKを用いるのが正攻法で、手間も小さいだろう。でもクリップボードに(ただの文字列ではなく)Illustratorが解釈できるデータを用意し、それをペーストするというアプローチも面白そうだなと思った。開発は面倒そうだが概念的には明瞭で既存のペーストコマンドから実現できるし、またIllustratorに頼らずIllustratorのオブジェクトが作れれば、今後何かと便利かもしれない。
古くはAICBという形式が使われていたようだが、現在はPDF形式がメインのようである。というわけでPDF形式が良さそうだが、勉強すべき事項は多く、しばらくはトライ&エラーの体当たりな開発が必要そうだ。そこでとりあえず、PDF形式でのペーストを行うためだけのプログラムを書いた。これはクリップボードにコピーしたテキスト形式のデータを、PDF形式として無理矢理解釈しているだけである。これを用いて、メモ帳相手にひたすら手書きPDFを作成しながらIllustratorペーストした際にどのようになるかを調べれば、だんだん形式への理解も深まるのではと思う。たぶん。
#include <windows.h> #include <tchar.h> static HGLOBAL PrepareClipboardTextData(char* buf){ HGLOBAL hMem = GlobalAlloc(GHND | GMEM_SHARE, lstrlenA(buf)); if(!hMem) return NULL; char* buf2 = (char*)GlobalLock(hMem); lstrcpyA(buf2, buf); GlobalUnlock(hMem); return hMem; } UINT ConvertClipboardTextIntoPDF(){ try{ if(!OpenClipboard(NULL)) return 1; const UINT cf_pdf = RegisterClipboardFormat(TEXT("Portable Document Format")); if(cf_pdf == 0) throw 2; char* buf = (char*)GetClipboardData(CF_TEXT); if(!buf) throw 3; HGLOBAL hMem = PrepareClipboardTextData(buf); if(!hMem) throw 4; if(!SetClipboardData(cf_pdf, hMem)) throw 5; } catch(UINT i) { CloseClipboard(); return i; } CloseClipboard(); return 0; } int WINAPI _tWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */, LPSTR /* lpCmdLine */, int /* nCmdShow */){ const UINT err = ConvertClipboardTextIntoPDF(); if(err){ MessageBox(NULL, TEXT("failed"), TEXT("hiConvertClipboardTextIntoPDF"), MB_ICONEXCLAMATION); } return 0; }
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2010-03-08 22:21