ビルド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-cygwini686-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を読むか、この記事のちょいと下のほうを見てからはじめると少しは幸せになります。
記事の内容は次の通り。

  1. 準備(ダウンロード元のURLなど)
  2. ソースコード改竄(patchも有ります)
  3. ライブラリのビルド(out-of-placeビルド方式です)
  4. サンプルのビルド
  5. 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 ビルドするということになります)。
  • オプション
    • --with-msw : Microsoft WindowsGUIツールにする。付けなくても既定でOnだと思います。
    • --enable-debug:デバッグ用コードを活性化します。
    • --enable-debug_gdbGDBデバッグ版でビルド。
    • --disable-shared:DLLにしない。これを付けないとビルドに失敗しました。

オプションの--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 で実行します。

HelloWorld.zip

// -*- 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にこだわるのもおかしな話です、と自己否定ですね。

wxLuaWindows(Unicode)バイナリ配布されてます。日本語の入力・表示も扱えます。Lua.exe(5.1)も同梱されているので、すぐに使えます。
では、なぜ、cygwinなのか?・・・今のところ明確な答えは持ち合わせていません。

*1:fd0さんからもらった情報を調べてみたら、記事の信頼性が著しく低いと判明したので、「下の下の下」に改めます

マウス スクロールできない

症状

Logicool Wireless Trackball M570 というトラックボールタイプのマウスをつい先日買いましたが、さっき突然、中央ボタンでのスクロールができなくなりました。

firefoxemacsエクスプローラ、その他アプリ・・・つまり、システム全部でスクロールできません。キーボードからは矢印キー、PageUP/DOWNキーでスクロールはできます。

対策

Logcool謹製SetPointを終了させると、回復しました。その後、SetPointを常駐させても、正常にスクロールできました。
(1/19追記) なんと、たった今、再びスクロール不能。SetPoint再起動で復活。うーむ。

経緯

  • まず、WirelessレシーバのUSBを抜き差ししてみましたが、回復しません。
  • SetPointのスクロールの設定を色々変えましたが、回復しません。
  • WindowsOSのハードウェアのマウスの設定でも色々変えましたが、回復しません。
  • あぁ、再起動かと思いましたが、ここで、SetPointを終了させてみたら、回復しました。
  • そこで、SetPointを立ち上げて、常駐させてみたところ・・・正常に動いてます。

なんだろう?

蛇足

当然、検索しました。「マウス スクロールできない」。結果は、マウスが壊れてるので買い換えろということでした。えーーーーーーーーーーー・・・・

蛇足2

今は青目でなくて、赤目です。壊れたTM-250の目を移植しました。

before after

特に意味はありません。しいて言うならば子供っぽい執着心でしょうか。

蛇足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 することで、設定に必要な名前を得ることができます。

fontfamily

WindowsOSにインストールされたフォントファミリがemacs起動時に与えられます。

(pp (font-family-list))
charset

文字集合のリストは、次で得られます。

(pp (charset-list))
face

face名は今回は default、つまり全部を指定していますが、個々の名前は、次で得ることができます。

(pp (face-list))

もし、個々のfaceに異なるフォントを割り当てたならば、次のようなコードが有用です。

(setq face-font-rescale-alist
      '(("Migu 1M.*" . 1.1)
	("MeiryoKe_Console.*" . 1.09)))

トラックボール壊れた



壊れたのは、ロジテックのトラックマン TM-250。
買いましたのは、ロジテックのトラックマン M-570。ワイヤレス!です。






その前は、マイクロソフトトラックボールオプチカル。








近い将来にはトラックボールは市場から消えてしまうのでしょうか。
「買い溜めしておこうかしら」とこの前壊れた時に考えましたけど、結局買い溜めしませんでした。今度も、「買い溜めしよう」と思いましたが、今月は散財したので、結局1個しか買えませんでした。

そうそう、meadowから、emacs24(GUNPACK)に鞍替えしました。

meadowさん、ありがとう、そしてさよなら。

症状を書いてませんでした。

  • ボタンを押せない、ことがある。
  • ウィンドウを移動している時にウィンドウを落としちゃう、ことがある。

左クリックが駄目になったようです。

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 を参考にしました。

luaTeXは大変魅力的です...でも、タイプセットが遅いので、これからも、pLaTeXdviout で行きます。

*1:同一ソースに対して、pLaTeX:0.78秒、LuaLaTeX:7.0秒(小塚フォント埋め込み無し:3.6秒)。SumatraPDFを使うつもりなので、フォント埋め込みが僕にとっての実用的な処理時間です。となると、pLaTeXに対して10倍遅いということになってしまいます。

Meadowへフォーカス

症状

meadowyatexを使っています。プレビューにdviout使っています。Ctrl+c t j でタイプセットすると、dviout にキーボードのフォーカスを奪われてしまうので、ちょっとうざい。

対策

<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

  1. 「Ctrl+Alt+J」だと、「左小指、左親指、右中指」。
  2. 「Ctrl+Shift+J」だと、「左小指、左薬指、右中指」。

軍配は、2のShiftに傾きつつある。

蛇足3

  • 「Ctrl+Shift+b」なのか?

タイプセット直後に、バッファを切り替えるために「Ctrl+x Ctrl+b」をする習性があるので、意外とbがスターダム化しつつある。
いっそのこと、ショートカットを2種類「J」と「B」で待ち受けることにしてみました。