42311


先日Qtの日本営業店に尋ねましたら、  
Qt等では、縦書きの実装などはかなり難しい（できない？）  
と言われました。

一太郎とか、Wordソフトとかって何のプログラミング言語で  
かかれているのでしょうか？という質問を検索すると、  
やはり企業秘密みたいで、C++とか、そこらへん？みたいな  
ようです。例えばQtはC++なので、ならばQtでもできるはず  
ですが、私もできそうな気がしません。（→この質問は  
確かに変でした。）

自分で拡張していくしかないのか、先日からお尋ねしている  
サブクラス化が成功すれば、それなりに融通の利くレイアウトを  
実装できるのか、正直わかりません。ただこの辺のドキュメントは  
無いと言っていいくらい少なく、正直絶望的です。  
この際にお聞きしたいのですが、こういう質問はいいのかわからない  
のですが、テキストエディタ作成に強いプログラミング言語って  
ご存知ですか？

**追記**  
詳しい解説有難うございます。[[組版文字について:QTextEdit関連](https://ja.stackoverflow.com/questions/37110/%E7%B5%84%E7%89%88%E6%96%87%E5%AD%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6qtextedit%E9%96%A2%E9%80%A3\]%E3%81%8B%E3%82%89%E7%B5%84%E7%89%88%E5%87%A6%E7%90%86%E3%81%AB%E8%88%88%E5%91%B3%E3%82%92%E6%8C%81%E3%81%A1%E5%A7%8B%E3%82%81)、ルビの表記、組立文字等は何とか`Qt`でも実装出来ました。こういうテキスト処理系の話は`Qt`から始めたため、`Qt`の中だけでもがいてきた感じです。今回は、`Qt`以外の方向へ眼を向けようとしたための質問でした。sayuriさんのご指摘の通り、組版処理の要件という無料公開の文書をネットで見て、その厳密さに驚いたことがありますが、Qtで何か方法はないかと手探りしてきました。自分はPythonに手を付ける前にPyQtの本を買ってしまったというぐらいの経歴を持っていて、（しかも英語のMarkSummerfield氏のやつです。）GUIというのも知りませんでした。そこからPythonスタートブックから地道にやってきたのですが、正直PyQtって何？という始まりでつまずいている可能性のある存在でした。まだQtでも触った事のないメソッドやクラスもあるため、組み合わせ次第ではできる可能性もあるのではないかという希望を持ちつつ色々やってきました。今の自分のスキルでは皆さんのご助力とともに、ルビや組立文字等、「組版が少しでも増やせた。」というところでも満足するものだと思うんですが、上でも述べたように、Qtでは縦書やらは難しいということだったので、（こう、Qt側から、初めてそれは無理です。と言われた感じなので、）じゃあ別の？という程度の切り替えを意識した質問でした。意図がわかりにくかったようで申し訳ありません。確かにエディタではなくて、ワードプロセッサの方が私の意図通りです。抽象的にテキストを扱うソフトっていうのかどういうべきなのかはわかりませんが、Qtを始めるまえは縦書に難があるとかいう限界自体を知らずに突き進んできたため、こんな質問になりました。Qt以外のライブラリだったらできるか？という感じです。少なくともテキスト処理系に強いプログラミング言語は？ライブラリは？という質問にすべきだったかどうかわかりませんが、とりあえずこの質問はいけないようだったので消そうかなと考えています。  
皆さんの意見を自分なりに考えてみると、つまり、Qtは既にC++で書かれたライブラリなので、Qtで無理なら、C++でQtに変わる別のライブラリを構成し、リファレンス公開するレベルにならないといけないということですね。Qtを使ってどうこう言ってるんじゃなくて、Qtを作れるレベルには最低限なってないとだめだと。  
Lispですというお答えもいただきましたが、私が一番欲しい解答はこのようなものでした。でも何となくわかったことですが、言語自体を自分で作り、ライブラリを自分で生み出し、ほかの人が作ったライブラリに頼らずに、一から自分で作りなさいと、そういうことなのでしょうか。出来上がった結果としてのライブラリに頼ってたら、確かに根っこは変えられないですね。確かにこういう構造関係を知らないようではそんな事やったこともないため、スキル不足は否めません。  
ひょっとすると、Qtで公開されているライブラリのように、誰かが作ってくれたライブラリの中で、テキスト処理系に強いライブラリはありますか？と尋ねるべきだったでしょうか。ほんとこの辺の知識が曖昧なまま進んできたもので、お騒がせして申し訳ありませんでした。  
（クローズされるか、この質問は近日中に消そうと思います。）


CC BY-SA 3.0
2018-03-10T15:29:59.190
42300
2018-03-13T02:14:03.437
2018-03-13T01:31:29.567
4236
24284
question
qt
テキストエディタ作成に強いプログラミング言語は？


質問文ではテキストエディタとされていますが、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)には

> **テキストエディタ** （英語: text
> editor）とはコンピュータで文字情報（テキスト）のみのファイル、すなわちテキストファイルを作成、編集、保存するためのソフトウェア（プログラム）である。

と説明されています。

他方「縦書きの実装」「一太郎とか、Wordソフトとか」とも言及されています。そもそも作成したいのはテキストエディタではなく[ワードプロセッサ](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%83%97%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88)ではありませんか？

>
> ワープロソフトは、手書きやタイプライタと異なり、文書をコンピュータ上で作成してデータの形で保存するため、後からの修正や再利用、電子メールなどでの添付、文書内の文字検索などが容易であり、印刷せずに画面で表示すればペーパーレス化も可能である。また、文字の装飾や文字間隔の調整、図表の挿入などの編集機能を備えている。主流といわれるワープロソフトには、DTPで使用できるほどの高度な編集機能や、グループで使う事を考慮した世代管理機能や校正機能を持つものもある。

作ろうとしているアプリケーションのゴールを正しく認識しないことには、完成することはないと思います。

* * *

>
> 一太郎とか、Wordソフトとかって何のプログラミング言語でかかれているのでしょうか？という質問を検索すると、やはり企業秘密みたいで、C++とか、そこらへん？みたいなようです。例えばQtはC++なので、ならばQtでもできるはずですが、私もできそうな気がしません。

縦書き等、文字の厳密なレイアウトを実現するのであれば、フォントの解析はもちろんのこと、画面描画も1dotずつ全て制御する必要があることはわかるはずです。アプリケーションを作成するにはQtを利用していてはだめで、Qtのようなライブラリを作成できるスキルが求められるのではありませんか？

なおWordに関しては実装について説明されており、DirectXやOpenGLなどを使用してグラフィックスカードを直接制御しています。[マイクロソフトは、C++でいかにしてMicrosoft
Officeのクロスプラットフォームを実現したのか](http://www.publickey1.jp/blog/14/cmicrosoft_office.html)

* * *

> テキスト処理系に強いプログラミング言語は？ライブラリは？

縦書きなどテキスト処理を行うとなるとsoramimiさんが具体的な例を挙げてくださいましたが、実はただ単に並べればよいというわけではなく、例えば`「`（鍵括弧）は90°回転が必要ですし、[連綿体（合字）](http://www.morisawa.co.jp/support/faq/3693)はどうするのという問題も出てくるため「フォントの解析はもちろんのこと」と指摘しました。

結局、１文字ずつレイアウトすることになると思いますが、効率よく行う必要があります。

他の方から適切な言語・ライブラリが提示されない場合、最終的にはOfficeなどが採用しているようにDirectXやOpenGLなどを使用してグラフィックスカードを直接制御することになります。その場合、DirectXであれば[HLSL;
High Level Shading
Language](https://ja.wikipedia.org/wiki/High_Level_Shading_Language)、OpenGLであれば[GLSL;
OpenGL Shading
Language](https://ja.wikipedia.org/wiki/GLSL)といった言語で記述することになります。


CC BY-SA 3.0
2018-03-11T02:16:05.987
42311
2018-03-13T02:14:03.437
2018-03-13T02:14:03.437
4236
4236
42300
answer


C++とQtで縦書きワープロを作るという方針で検討してみます。

まず、現時点において、Qtはテキストの縦書き描画をサポートしていなかったはずです。  
サポートされていないなら自前でやる必要があります。

まずは基本のテキスト描画から。これは横書きです。

[code]

    void MyWidget::paintEvent(QPaintEvent *event)
    {
        QPainter pr(this);
        QString text = "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a"; // あいうえお
        pr.drawText(5, 15, text);
    }
    
[/code]

テキスト描画の進行方向を縦にするには、QTransformクラスを使います。

[code]

    void MyWidget::paintEvent(QPaintEvent *event)
    {
        QTransform tr;
        tr.translate(5, 5);
        tr.rotate(90);
        QPainter pr(this);
        pr.setTransform(tr);
        QString text = "\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a"; // あいうえお
        pr.drawText(0, 0, text);
    }
    
[/code]

rotateを指定して90度回転して描画しています。しかしこれでは、文字まで横倒しになってしまうので使えません。

QTransformはあきらめて、1文字ずつ描画してみます。

[code]

    void MyWidget::paintEvent(QPaintEvent *event)
    {
        QPainter pr(this);
        QFontMetrics fm = pr.fontMetrics(); // フォント情報を取得
        int line_height = fm.height(); // 文字の高さ
        int x = 5;
        int y = 5;
        y += line_height;
        pr.drawText(x, y, "\xe3\x81\x82"); // あ
        y += line_height;
        pr.drawText(x, y, "\xe3\x81\x84"); // い
        y += line_height;
        pr.drawText(x, y, "\xe3\x81\x86"); // う
        y += line_height;
        pr.drawText(x, y, "\xe3\x81\x88"); // え
        y += line_height;
        pr.drawText(x, y, "\xe3\x81\x8a"); // お
    }
    
[/code]

縦書き成功です。

ここから検討しなければいけないことがたくさんあります。

文字毎に幅が異なる可能性があります。多くのフォントでは、全角文字に限れば全て同じ幅かもしれませんし、文字毎に微調整が施されていて、文字幅が全部異なるかもしれません。

日本語の文と欧文が混在する場合どうするか。半角文字を描画する場合、水平方向に中央寄せして縦書きにするのか、英文として読めるように、横書きを回転した（上に挙げた2番目の例の）様にに描画したいのか、文字毎に座標と回転を自分で計算して描画することになるでしょう。日欧混在テキストの描画では、カーニングや合字をどう処理するかなど、悩ましい課題がたくさん出てきます。

長いテキストをひとつの関数で一度で描画するなら高速ですが、一文字一文字描画すると、パフォーマンスの低下が懸念されます。実際に作ってみないとわかりませんが、遅すぎて実用にならないとなったときに、バックグラウンドで遅延描画するとか、レンダリングのキャッシュを実装するとか、かなり面倒くさいことを行う必要が出てくるかもしれません。

＜追記＞  
日本語入力の対応も結構面倒です。IMEはQtでサポートされていますが、その扱いは自前実装になります。IME入力を受け付けたいウィジェットに対して`setAttribute`を呼んでIMEを有効にし、`inputMethodQuery`と`inputMethodEvent`をオーバーライドして、変換候補ウィンドウの表示位置を設定したり、変換文字列を取得したりする必要があります。イベントで渡される文字列には、preedit（変換中文字列）とcommit(確定文字列)があります。on-
the-spot方式（ワープロソフトの編集中文書内で変換中文字列をインライン的に描画する）か、over-the-
spot方式（ポップアップウィンドウを作ってその中で変換中文字列を描画する）か、アプリケーションの要件に応じて、どちらを採用するか決めます。いずれにしても、一連のIME対応を自分で実装する必要があります。変換中文字列を縦書きで表示するアプリを私は見たことがありませんが、もし実現できれば、結構レアなアプリということになるので、意外と需要があるかもしれません。  
＜／追記＞

やってできなくはないはずですが、相当の覚悟がないと、途中で挫折すること必至です。

p.s.  
記事タイトルは、「縦書きワープロアプリの実装に適した言語や手法は何か？」といったものがいいと思います。記事を削除したりクローズする必要はないと考えます。


CC BY-SA 3.0
2018-03-11T08:17:39.563
42320
2018-03-12T03:24:05.283
2018-03-12T03:24:05.283
3337
3337
42300
answer


最適かどうかは怪しいですが、一番簡単なのはブラウザ環境のJavaScriptかもしれません。とりあえず、下記のコードスニペットで最小限の縦書き編集はできますので、あとは色々と機能を付ければそれらしくなります。

[code]

    document.querySelector('div').focus();
[/code]

[code]

    div {
      writing-mode: vertical-rl;
    }
[/code]

[code]

    <div contenteditable=true>縦書き</div>
[/code]


CC BY-SA 3.0
2018-03-12T03:33:45.740
42335
2018-03-12T03:33:45.740
3475
42300
answer