ビルド2
wxWidgets2.9.4を MinGW on cygwin1.7.17でビルドしてみました。MSYSではありません。
configure、make
前回のようにソースの改竄もしないので簡単ですが、cygwin上でビルドするため、クロスビルド(クロスコンパイル)の指定、つまり、hostオプションの指定が必要です。
configureのヘルプより
System types: --build=BUILD configure for building on BUILD [guessed] 'BUILD'上でビルドのための設定を行う(configure) [既定:自動推定] --host=HOST cross-compile to build programs to run on HOST [BUILD] 'HOST'上で実行されるプログラムをビルドするための クロスコンパイルを行う [既定:'BUILD']
cygwin上でMinGW32用のプログラムをビルドするということは...
$ ../configure -build=i686-pc-cygwin -host=i686-pc-mingw32
前回の記事と同様にbuild-releaseフォルダを作って、そこでビルドします。今回のビルドは、MinGW用の32bit、リリース、DLL版となります。
複数のクロスコンパイル環境があると頭の中がぐちゃぐちゃになるので、この際、cygwinをクリーンインストールしてしまいました。
$ uname -a CYGWIN_NT-6.1-WOW64 etcpc 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.3/lto-wrapper.exe Target: i686-pc-cygwin コンフィグオプション: /gnu/gcc/releases/respins/4.5.3-3/gcc4-4... スレッドモデル: posix gcc version 4.5.3 (GCC) $ ls -F /usr bin/ i686-pc-mingw32/ lib/ sbin/ src/ i686-pc-cygwin/ include/ local/ share/ tmp/
setup.exeでgcc4とmingwをインストールすれば、/usrフォルダに i686-pc-cygwin、i686-pc-mingw32フォルダが作成されてます。
後は、configure、make、make install、その後、samplesフォルダに降りて、makeします。
configureオプションでmsw、openGLは指定していませんが、samples/openGLのcube、isosurf、penguinは動いています。
このライブラリはDLLとしてビルドしたので、環境変数PATHにつぎのものを加えます。
c:\cygwin\usr\i686-pc-mingw32\sys-root\mingw\bin; c:\cygwin\usr\local\lib; c:\cygwin\usr\local\bin; c:\cygwin\usr\sbin; c:\cygwin\bin;
無用な設定もあるやも知れませんが、少なくともwxWidgetsのサンプルがxxxxx.dllが無いという理由で起動しない場合は、これらのようなパスを環境変数PATHに加えて、windowsに伝えてください。PATHを通す以外にも、生成されたDLLをごっそりSystem32に移動してもいいです。PATHを通すのが僕の好みということに過ぎません。お好きな方法をWindowsが使用するDLL検索パスを見て選択して下さい。
HelloWorld
// -*- coding: utf-8-unix -*- // wxWidgets "Hello world" Program // For compilers that support precompilation, includes "wx/wx.h". #include <wx/wxprec.h> class MyApp: public wxApp { public: virtual bool OnInit(); }; class MyFrame: public wxFrame { public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); private: void OnHello(wxCommandEvent& event); void OnExit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); wxDECLARE_EVENT_TABLE(); }; enum{ ID_Hello = 1 }; wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Hello, MyFrame::OnHello) EVT_MENU(wxID_EXIT, MyFrame::OnExit) EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) wxEND_EVENT_TABLE() wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame *frame = new MyFrame( wxT("Hello World♪こんにちは〜こんにちは〜世界の窓から〜"), wxPoint(50, 50), wxSize(450, 340) ); frame->Show( true ); return true; } MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { wxMenu *menuFile = new wxMenu; menuFile->Append(ID_Hello, wxT("こんにちは(&H)...\tCtrl-H"), "Help string shown in status bar for this menu item"); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxMenu *menuHelp = new wxMenu; menuHelp->Append(wxID_ABOUT); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append( menuFile, wxT("ファイル(&F)") ); menuBar->Append( menuHelp, "&Help" ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( wxT("ようこそwxWidgetsへ!") ); } void MyFrame::OnExit(wxCommandEvent& event) { Close( true ); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox( wxT("これはwxWidgetsの「こんにちは世界よ!」サンプルです。"), "About Hello World", wxOK | wxICON_INFORMATION ); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Hello World!"); }
# -*- coding: utf-8-unix -*- CXX = $(shell wx-config --cxx) PROGRAM = HelloWorld OBJECTS = $(PROGRAM).o # implementation .SUFFIXES: .o .cpp .cpp.o : $(CXX) -c `wx-config --cxxflags` -DWX_PRECOMP -o $@ $< all: $(PROGRAM) $(PROGRAM): $(OBJECTS) $(CXX) -o $(PROGRAM) $(OBJECTS) `wx-config --libs` clean: rm -f *.o $(PROGRAM)
複数のhostが存在する場合は、つぎのようにhostを明示的に指定する必要があると思います(未確認)。
wx-config --host=i686-pc-ming32 --cxxflags wx-config --host=i686-pc-ming32 --libs
前回、プレコンパイルが効いてないなぁと思ってたのですが、-DWX_PRECOMP の指定が必要でした。wx/wxprec.h 内で条件判定ありです。DOS窓を開かないためのオプション -mwindows はwx-configが返してくれるようですね。
蛇足
これは、楽チンだ。やっぱり、寄らば大樹ということです。MinGW32 on Cygwin でいきます。
蛇足2
なぜ、(MSYSでなくて)cygwinなのか?これまで、深く考えたこともないし、相違を比較することもしていません。使用している主要なツールも、GUNPACK(emacs24)、TeXLive(LaTeX)、dviout(プレビューア)、PDF、visual studio・・・いずれもcygwinとは関係ないので必然性はないですが、あえてMSYSである必然性もないという程度で、現状維持とします。
いや、そもそもMicrosoft Visual Studioでも構わないはずなのに、なぜcygwin上でクロスコンパイルなのか?きっと、GNUの心根が好きだというまったく情緒的な理由です(財布にやさしいからという実利的な理由も考えられますが、それが本当だとしても、きっぱり否定します)。
ビルド
wxWidgets2.9.4をcygwin1.7.17でビルドしてみました。
MinGWではありません。(MinGW on Cygwinはこちらの記事です)
付属サンプルのめぼしいのを試してみると、動くのもあり、トラップするものもありで、正しいのかどうなのかまったくわかりませんので、記事の信頼性はvery-low very-very-low*1ということでお願いします。
この記事ではデバッグビルドの顛末が書かれていますが、リリースビルドもできます。cygwinにおける最短は、
$ ./configure --disable-shared $ make
ですが、これだとソースフォルダ内に.oが生成されるので、頭の中もフォルダ内もぐちゃぐちゃになります。install.txt で示される out-of-placeビルドの方法ならばソースフォルダとは別のフォルダにライブラリ、オブジェクトがビルドされます。install.txtを読むか、この記事のちょいと下のほうを見てからはじめると少しは幸せになります。
記事の内容は次の通り。
- 準備(ダウンロード元のURLなど)
- ソースコード改竄(patchも有ります)
- ライブラリのビルド(out-of-placeビルド方式です)
- サンプルのビルド
- HelloWorld(世界の国からこんにちは♪。HelloWorld.zip あります。)
準備
$ uname -a CYGWIN_NT-6.1-WOW64 etcpc 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin
$ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-pc-cygwin/4.5.3/lto-wrapper.exe Target: i686-pc-cygwin コンフィグオプション: /gnu/gcc/rel... スレッドモデル: posix gcc version 4.5.3 (GCC)
src/generic/dirctrlg.cppの改竄
ビルドエラーに対応して、3箇所の改竄をしました。この改竄の影響は・・・わかりません。
- 67〜69行:direct.h はcygwinでは使えないので削除します。
#if !defined(__WXWINCE__) // #include <direct.h> #endif
- 297〜299行:_chdrive はcygwinでは使えないので削除します。
//#elif defined(__GNUWIN32__) && \ // (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) // return _chdrive(drive);
- 340〜357行:_getdriveはcygwinでは使えないので削除します。
wxString dirNameLower(dirName.Lower()); //#if defined(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) success = wxDirExists(dirNameLower); /*#else #if defined(__OS2__) // Avoid changing to drive since no media may be inserted. if (dirNameLower[(size_t)0] == 'a' || dirNameLower[(size_t)0] == 'b') return success; #endif int currentDrive = _getdrive(); int thisDrive = (int) (dirNameLower[(size_t)0] - 'a' + 1) ; int err = setdrive( thisDrive ) ; setdrive( currentDrive ); if (err == -1) { success = false; } #endif*/
- diff -u で作成したpatchです。src/generic/cygwin.patch などと保存して、pacthを実行します。
$ patch -u <cygwin.patch
--- dirctrlg.original.cpp 2012-07-08 19:28:27.000000000 +0900 +++ dirctrlg.cpp 2013-01-12 02:34:36.578036700 +0900 @@ -65,7 +65,7 @@ // accordingly. #if !defined(__GNUWIN32__) || (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) #if !defined(__WXWINCE__) - #include <direct.h> +// #include <direct.h> #endif #include <stdlib.h> #include <ctype.h> @@ -294,9 +294,9 @@ { #ifdef __WXWINCE__ return 0; -#elif defined(__GNUWIN32__) && \ - (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) - return _chdrive(drive); + //#elif defined(__GNUWIN32__) && \ + // (defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) + // return _chdrive(drive); #else wxChar newdrive[4]; @@ -337,9 +337,9 @@ if (dirName.length() == 3 && dirName[(size_t)1] == wxT(':')) { wxString dirNameLower(dirName.Lower()); -#if defined(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) + //#if defined(__GNUWIN32__) && !(defined(__MINGW32_MAJOR_VERSION) && __MINGW32_MAJOR_VERSION >= 1) success = wxDirExists(dirNameLower); -#else + /*#else #if defined(__OS2__) // Avoid changing to drive since no media may be inserted. if (dirNameLower[(size_t)0] == 'a' || dirNameLower[(size_t)0] == 'b') @@ -354,7 +354,7 @@ { success = false; } -#endif + #endif*/ } #ifdef __WIN32__ (void) SetErrorMode(errorMode);
(やっと)ビルド
$ cd wxWidgets-2.9.4 $ mkdir build-debug $ cd build-debug $ ../configure --with-msw --enable-debug --enable-debug_gdb --disable-shared $ make
- tar.bz2を展開した wxWidgets-2.9.4フォルダに、build-debugフォルダを作成し、そこで、configure、makeします。.oや.aはこのフォルダ以下に作成されます(ソースと一緒なin-placeではなくて、out-of-place ビルドするということになります)。
- オプション
オプションの--enable_debugを付けると、--enable_debug_infoと--enable_debug_flagがconfigure内部で自動的に設定されます。
あと、--with-opengl はビルドに失敗しました。こちらに解決法らしきものがありますが、よく理解できませんでした。
サンプルのビルド
$ cd wxWidgets2.9.4/build-debug/samples $ make
サンプルのauidemoで試した限りでは、日本語の入力、表示はOKだし、半分ずつ削除されるとかもありません。サンプルのtextで試した限りでは、UTF-8でビルドされているようです。ファイルダイアログでの日本語ファイル名、フォルダ名もOKでした。いわゆるダメ文字の「ソースコード表示」とかOKでした。
HelloWorld
- ソース、Makefile、実行形式をzipしたものです。./HelloWorld.exe で実行します。
// -*- coding: utf-8-unix -*- // wxWidgets "Hello world" Program // For compilers that support precompilation, includes "wx/wx.h". #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif class MyApp: public wxApp { public: virtual bool OnInit(); }; class MyFrame: public wxFrame { public: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); private: void OnHello(wxCommandEvent& event); void OnExit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); wxDECLARE_EVENT_TABLE(); }; enum{ ID_Hello = 1 }; wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(ID_Hello, MyFrame::OnHello) EVT_MENU(wxID_EXIT, MyFrame::OnExit) EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) wxEND_EVENT_TABLE() wxIMPLEMENT_APP(MyApp); bool MyApp::OnInit() { MyFrame *frame = new MyFrame( wxT("Hello World♪こんにちは〜こんにちは〜世界の窓から〜"), wxPoint(50, 50), wxSize(450, 340) ); frame->Show( true ); return true; } MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) { wxMenu *menuFile = new wxMenu; menuFile->Append(ID_Hello, wxT("こんにちは(&H)...\tCtrl-H"), "Help string shown in status bar for this menu item"); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxMenu *menuHelp = new wxMenu; menuHelp->Append(wxID_ABOUT); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append( menuFile, wxT("ファイル(&F)") ); menuBar->Append( menuHelp, "&Help" ); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( wxT("ようこそwxWidgetsへ!") ); } void MyFrame::OnExit(wxCommandEvent& event) { Close( true ); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox( wxT("これはwxWidgetsの「こんにちは世界よ!」サンプルです。"), "About Hello World", wxOK | wxICON_INFORMATION ); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Hello World!"); }
# -*- coding: utf-8-unix -*- CXX = $(shell wx-config --cxx) PROGRAM = HelloWorld OBJECTS = $(PROGRAM).o # implementation .SUFFIXES: .o .cpp .cpp.o : $(CXX) -c `wx-config --cxxflags` -o $@ $< all: $(PROGRAM) $(PROGRAM): $(OBJECTS) $(CXX) -o $(PROGRAM) $(OBJECTS) `wx-config --libs` -mwindows clean: rm -f *.o $(PROGRAM)
- ちなみに、日本語リテラルを扱うために使っているwxT()は_T()と同じものです。
- ちなみに、HelloWorld.exeが依存するDLLは、つぎのとおりです。
$ objdump.exe -x HelloWorld.exe|grep DLL vma: Hint Time Forward DLL First DLL Name: cygwin1.dll DLL Name: cygz.dll DLL Name: cyggcc_s-1.dll DLL Name: cygstdc++-6.dll DLL Name: ADVAPI32.dll DLL Name: COMCTL32.DLL DLL Name: COMDLG32.DLL DLL Name: GDI32.dll DLL Name: KERNEL32.dll DLL Name: ole32.dll DLL Name: OLEAUT32.dll DLL Name: SHELL32.DLL DLL Name: USER32.dll DLL Name: WINSPOOL.DRV
蛇足
リリース、デバッグのそれぞれのビルドで生成されるライブラリ名が変わるということがinstall.txtに書かれていますが、当家では変わりませんでした。configureが生成したMakefileをみると、
#WXDEBUGFLAG = d
とデバッグ用Makefileでもコメントアウトされていました。これを活性化すると、'u' UNICODEに加えて、'd' DEBUG 識別も付くようにはなりますが、下位ディレクトリにもMakefileがあるので泥沼状態になります。configureで生成されたMakefileをいじるのは躊躇します。
この件は忘れることにします。
蛇足2
cygwinのフォルダ(/usr/local)へのインストールは、
$ make install
で行います。どのようなウィジェットがインストールされたかは、サンプルを動かせばわかりますが、「読みたい!」という場合は、「wxWidgets-2.9.4/include/wx/msw/setup.h」に書かれています。setup.hにはユーティリティクラスの説明もあるようです。
蛇足3
こんなことをしなくても、Lua スクリプトから使う wxLua というのもありますし、他にもさまざまな言語、スクリプトにポーティングされてますので、わざわざcygwinにこだわるのもおかしな話です、と自己否定ですね。
wxLuaでWindows(Unicode)バイナリ配布されてます。日本語の入力・表示も扱えます。Lua.exe(5.1)も同梱されているので、すぐに使えます。
では、なぜ、cygwinなのか?・・・今のところ明確な答えは持ち合わせていません。
*1:fd0さんからもらった情報を調べてみたら、記事の信頼性が著しく低いと判明したので、「下の下の下」に改めます
マウス スクロールできない
症状
Logicool Wireless Trackball M570 というトラックボールタイプのマウスをつい先日買いましたが、さっき突然、中央ボタンでのスクロールができなくなりました。
firefox、emacs、エクスプローラ、その他アプリ・・・つまり、システム全部でスクロールできません。キーボードからは矢印キー、PageUP/DOWNキーでスクロールはできます。
対策
Logcool謹製SetPointを終了させると、回復しました。その後、SetPointを常駐させても、正常にスクロールできました。
(1/19追記) なんと、たった今、再びスクロール不能。SetPoint再起動で復活。うーむ。
経緯
- まず、WirelessレシーバのUSBを抜き差ししてみましたが、回復しません。
- SetPointのスクロールの設定を色々変えましたが、回復しません。
- WindowsOSのハードウェアのマウスの設定でも色々変えましたが、回復しません。
- あぁ、再起動かと思いましたが、ここで、SetPointを終了させてみたら、回復しました。
- そこで、SetPointを立ち上げて、常駐させてみたところ・・・正常に動いてます。
なんだろう?
蛇足
当然、検索しました。「マウス スクロールできない」。結果は、マウスが壊れてるので買い換えろということでした。えーーーーーーーーーーー・・・・
蛇足3
「執着心」で検索すると、「捨てろ」とか付随してますが、捨てることはないと思ったりします。同じ脳や心の働きは、「不撓不屈」、「頑張り」、「never give up」ともなります。良いほうにでるか悪いほうに出るかの違いです。捨てるなんてもったいない。方向を変える方法を探せばいい・・・といっても、検索したって見つからないとは思うけど。
フォント設定
meadowからemacs24に乗り換えました。これを機にinit.elの手直しをしました。特にフォント周りです。
色々なサイトの設定方法を試行してみましたが、サイトSOTAの設定が僕の環境の場合、最も端的で効果的でした。
彼(か)のサイトはMac向けらしく、ヒラギノフォントなので、Win7の僕としては、Consolas(半角)+MeiryoKe(全角)の構成に変更しました。
[01/03追記] 結局メイリオ一発にしてしまいました。 (set-face-attribute 'default nil :family "MeiryoKe_Console" :height 105)
(set-face-attribute 'default nil :family "Consolas" :height 104) (set-fontset-font nil 'japanese-jisx0208 (font-spec :family "MeiryoKe_Console")) (setq face-font-rescale-alist '(("MeiryoKe_Console" . 1.08)))
半角フォント選定
数字の「0(ゼロ)」と英大文字の「O(オー)」、および、数字の「1(イチ)」、英小文字の「l(エル)」、記号「|(縦棒)」が判読しやすいものが選定の基準です。Consolas以外に検討したのは、Inconsolata、Migu 1M、IPAゴシックでした。Inconsolateはフォワァとしてる、Migu 1Mはチリチリしてる、IPAはチルダ、サーカムフレックスがバーになっているので、Consolasにしました。
全角フォント選定
固定幅であることが選定の基準です。IPAゴシックはちょっとがたつきがあり、Migu 1M はチリチリしてたので、MeiryoKe_Console にしましたが、環境や文字サイズ、倍率などにより良し悪しは変化します。
init.el抜粋
;; -*- coding: utf-8 -*- ;; server start for emacs-client ;(require 'server) (server-start) ;; 日本語入力 (setq default-input-method "W32-IME") (setq-default w32-ime-mode-line-state-indicator "[--]") (setq w32-ime-mode-line-state-indicator-list '("[--]" "[あ]" "[--]")) (w32-ime-initialize) (global-set-key [M-kanji] 'ignore) ;; 文字コード (set-language-environment 'utf-8) (prefer-coding-system 'utf-8) (set-default-coding-systems 'utf-8) (set-keyboard-coding-system 'utf-8) (setq default-file-name-coding-system 'shift_jis) ;dired文字化け対策 ;; フォント ;; abcdefghijklmnopqrstuvwxyz ;; ABCDEFGHIJKLMNOPQRSTUVWXYZ ;; `1234567890-=\[];',./ ;; ~!@#$%^&*()_+|{}:"<>? ;; ;; 壱弐参四五壱弐参四五壱弐参四五壱弐参四五壱弐参四五壱弐参四五 ;; 123456789012345678901234567890123456789012345678901234567890 ;; ABCdeABCde ;; ;; ┌─────────────────────────────┐ ;; │ 罫線 │ ;; └─────────────────────────────┘ ;; (set-face-attribute 'default nil :family "Consolas" :height 104) (set-fontset-font nil 'japanese-jisx0208 (font-spec :family "MeiryoKe_Console")) (setq face-font-rescale-alist '(("MeiryoKe_Console" . 1.08))) ;; ;; リストを評価する(Ctrl-j) ;; フォントファミリ (pp (font-family-list)) ;; 文字セット (pp (charset-list)) ;; フェース (pp (face-list)) ;; フレーム (setq default-frame-alist (append (list '(left . 990) '(top . 10) '(width . 80) '(height . 30) ) default-frame-alist))
スクラッチバッファ
にて、pp(プリティプリント)をCtrl+j することで、設定に必要な名前を得ることができます。
face
face名は今回は default、つまり全部を指定していますが、個々の名前は、次で得ることができます。
(pp (face-list))
もし、個々のfaceに異なるフォントを割り当てたならば、次のようなコードが有用です。
(setq face-font-rescale-alist '(("Migu 1M.*" . 1.1) ("MeiryoKe_Console.*" . 1.09)))
トラックボール壊れた
LuaTeX+SumatraPDF+小塚Pr6N
2013年11月24日修正
現状の lualatex(TexLive2013)で、旧記事の文書をタイプセットすると、1.6秒(フォント埋め込んでも3.2秒)でできます。luatexの整備は着々と進んでいるようです。ただ、AdobePDFならばちゃんと明朝で表示される地の文が、SumatraPDF(2.4および2.5.8493)ではゴチックで表示されます。日本語パッチ当てたSumatraPDFを使うか、またまたフォント埋め込みか?まぁ、普段使いのプレビューは、ゴチでもいいか、とか。
ちなみに、luatexは beta-0.76.0-2013061707 ですが、ltj-plain.sty、patches/lltjdefs.sty は Ryumin-Light に訂正したものを使っています。
新しいTeXLiveが2012年11月15日付けで、リリースされたので、LuaTeXを使ってみました。
タイプセットに時間がかかりますが*1、楽チンに使えるようになってますね。幸せです。
Adobe Reader ではPDFファイルがロックされてしまうので、プレビューアには、SumatraPDFを使いました。また、SumatraPDFの文字化け対策に小塚Pr6Nフォントの埋め込みを行いました。
環境
設定
TeXLiveのインストールには、install-tl.zipを使いました。ダウンロードして、展開後、install-tl-advanced.bat を実行しました。
SumatraPDFはSumatraPDF-2.1.1-install.exeを使い、既定の C:/Program Files(x86)/SumatraPDF フォルダにインストールしました。フォルダ名に「(」が使われているので、meadowの設定で若干のトラブルを抱えました。
Meadow(.emacs)のYaTeX用の設定をちょっと変更。
;(setq tex-command "platex -kanji=utf8 -src-specials") (setq tex-command "lualatex") ;(setq dvi2-command "C:/texlive/2011/tlpkg/dviout/dviout.exe") (setq dvi2-command "d:/home/bin/SumatraPDF.exe")
プレビューアコマンド(dvi2-command)の SumatraPDF.exeは、インストールフォルダの名前に「(」が使われていて、elispに拒否られたので、シンボリックリンクを作成してごまかしました。リンクは、Link Shell Extensionで作成しました。
SumatraPDFは日本語フォントをちゃんと扱ってくれなくて、うちの場合は本文にもゴチックが使われてしまいました(環境に拠っては文字化けです)。それで、PDFに日本語フォントを埋め込んで作成しました。埋め込んだのは小塚Pr6Nです。
小塚フォントは、ダウンロードしたFontPack11000_XtdAlf_Lang.msiを展開して、FontPack11000_XtdAlf_Langフォルダ内にある
-
-
- kozgopr6n_medium.otf
- kozminpr6n_regular.otf
-
をWindowsにインストールしました。
タイプセット
%% -*- coding: utf-8-unix -*- %\documentclass[11pt]{jsarticle} \documentclass[11pt]{ltjsarticle} \usepackage[kozuka6n]{luatexja-preset} \usepackage{xcolor} \usepackage{amsmath} \begin{document} \section{何回目かのタイプセット} 日本語もカラーも変わらず。設定も楽チンで幸せです。ちょっとタイプセットに 時間かかりすぎですけど(\pLaTeX:0.47sec、Lua\LaTeX:5.71sec、i7 2.93GHz)。 \begin{align} x^7+x^6+x^4+x+1\\ \fcolorbox{black}{yellow}{\textcolor{red}{\ensuremath{x^7+x^6+x^4+x+1}}} \end{align} \end{document} % Local Variables: % mode: yatex % TeX-master: t % End:
全面的に ltjsclasses.pdf を参考にしました。
Meadowへフォーカス
症状
meadowでyatexを使っています。プレビューにdviout使っています。Ctrl+c t j でタイプセットすると、dviout にキーボードのフォーカスを奪われてしまうので、ちょっとうざい。
対策
- 次の内容のファイル「ActivateMeadow.wsf」をどこかにおきます。
<package> <job id="js"> <script language="JScript"> var WshShell = WScript.CreateObject("WScript.Shell"); WshShell.AppActivate("Meadow"); </script> </job> </package>
- デスクトップにショートカットを作ります。(名前は適当にたとえば「Act+A」とか)
- [プロパティ] [ショートカット] [ショートカットキー]にプロンプト置いて、「A」と押します(大文字小文字とか関係ないようです)。
- 速やかに[OK]してプロパティを閉じます。
これで、「Alt+Ctl+A」にてmeadowにフォーカスが移ります。
蛇足
- 本質的ではない変態的な解決策ですが、キーボードから手を離さなくて済むので、まぁ我慢です。
- 「J」とかがいいかも、「Ctl+c t j」=>「Alt+Ctl+j」で戻れるから。
- 「Shift+Alt+・・・」とか、「Ctrl+Shift+Alt+・・・」も出来そう・・・。
蛇足2
- 「Ctrl+Alt+J」だと、「左小指、左親指、右中指」。
- 「Ctrl+Shift+J」だと、「左小指、左薬指、右中指」。
軍配は、2のShiftに傾きつつある。
蛇足3
- 「Ctrl+Shift+b」なのか?
タイプセット直後に、バッファを切り替えるために「Ctrl+x Ctrl+b」をする習性があるので、意外とbがスターダム化しつつある。
いっそのこと、ショートカットを2種類「J」と「B」で待ち受けることにしてみました。