2022年12月04日

【薙刀式】MicroSoft Word縦書きの深刻なバグ3選

Wordはアメリカ人のつくったものだが、
日本人が縦書き用にアレンジしたものには、
深刻なバグが3つある。

これのせいで僕はすでに、
Wordを縦書きで使うことはなるべく避けている。

その3つを、再現可能な形にまとめた。


バージョンはWindows10 Word2013 on Surface 3。
最新の版では改善されているかもしれないが、
Win11にアプデしていないので不明。
Mac版でも起こるかも不明。
どなたか検証を。

【バグ1 ページダウン/アップが直観と異なる現象】
【バグ2 ページ間のカーソル移動がうまくいかない】
【バグ3 バグ1と2の組み合わせで、ページ間移動がおかしくなる】


【バグ1 ページダウン/アップが直観と異なる現象】

(手順)
1 新規ファイルを作成する。
2 縦書き表示にする。(ページレイアウト/文字列の方向/縦書き)
3 1ページ目を「ああああああ」で埋めて、
  2ページ目を「いいいいいい」で埋める。
  3ページ目はなしとする。
4 1ページ目先頭にキャレットを移動、表示倍率を100%に設定する。
5 ページダウンを押す。
 (期待される挙動)2ページ目の先頭の「い」にキャレットが移動し、
          そこへスクロールする。
 (実際起こること)半画面ほどスクロールして、
          1ページ目1行目の真ん中あたりにキャレットが移動する。


(何が起こっているか?)
1 ページダウンを押すと、2ページ目全体が画面に入る分だけ、
 下スクロールする。
 このとき、ディスプレイがジャストサイズでないかぎり、
 1ページ目の下のほうがまだ画面に入っている。

2 この「今見えている画面上」での先頭位置に、
 キャレットが移動すると思われる。

3 つまり、ページダウンは、実際の原稿の「ページ」単位ではなく、
 「画面表示単位」での移動ではないだろうか?

(ページアップはどうか?)
1 2ページ目先頭の「い」にキャレットを置く。
 この時、表示上、1ページ目の下が少し見えている。
 たとえば「ああああ」と4文字見えていたとする。
2 ここでページアップを押すと、予想どおり、
 上スクロールして、1ページ目先頭にキャレットはいかず、
 1ページ目1行目の4文字目に移動する。
 つまり、ページアップダウンは、「ページ単位の移動」ではなく、
 「今見えている表示上の位置への移動」だと考えられる。

これって使えるの?
「ページ単位の移動や選択」ができないと意味なくない?


(検証)横書きではどうか?

1 横書きで同様のファイルを作成する。
2 1ページ目先頭にキャレットを置く。
  表示倍率100%だと、僕のディスプレイでは、
 1ページ目全体が入りきらない。

3 ページダウンを押す。
 「今見えている全画面の1画面分スクロールして、
 その先頭位置にキャレットが移動」する。
 つまり、1ページ目の途中の行の先頭にキャレットが移動して、
 2ページ目が少し見えている状態になる。
4 もう一度ページダウンを押す。
  2ページ目先頭にキャレットが移動する。
  スクロールは2ページ目先頭が画面上の一番上になる。

(検証)
1 表示倍率を小さくして、2ページ画面に入るようにする。
2 1ページ目先頭にキャレットを移動。
3 ページダウンすると、2ページ目先頭に移動した。
4 ページアップすると、1ページ目先頭に移動した。

このことから、
複数ページが画面上に全て収まっているときは、
ページアップダウンは、ページ単位のキャレット移動を行い、
収まりきれていない場合は、
「一画面分縦スクロールして、相対的に同じ位置にキャレットを移動する」
という機能だと考えられる。

横書きのときは、
文字の進む方向が横、
ページの進む方向は縦なので、
うまく機能している。

ところが、
縦書きの時は、
文字の進む方向が縦で、
ページの進む方向も縦なので、
スクロール方向が文字方向移動になることが、
根本的な原因だと考えられる。
 

日本の伝統的な縦書きでは、
「巻物」のように、スクロールする方向は、下ではなく左のはずだから、
これに準じれば、このアルゴリズムでも問題なかったと考えられる。
ちなみにスクロールとはそのまま「巻物」のこと。

この縦書きのページアップダウンバグは、
2種類のフィックスの仕方がある。

1 縦書きのときは、横スクロールバージョンに作り直すこと。
2 1画面分スクロールするのではなく、
  1ページ分スクロールしてキャレットを移動させること。

なぜ2にならないのか?
理解に苦しむ。



【バグ2 ページ間のカーソル移動がうまくいかない】

同様のアルゴリズムのバグが、ページ間移動で起こる。

1 同様の縦書きファイルを用意する。
2 3ページ目をつくる。たとえば「う」で埋めるとする。
3 表示倍率は100%と変わらず。

4 2ページ目の最終行先頭にキャレットを移動する。
5 左カーソルで次の行へ移動する。

(期待される結果)
 3ページ目の先頭行先頭にキャレットが移動。
(起こること)
 3ページ目の先頭行途中にキャレットが移動。

(検証)
2ページ目の全部が画面内に入っていると、
期待される結果になる。
しかし2ページ目の下が表示上入っていない状態でこれをやると、
3ページ目先頭数文字目にキャレットが移動する。

(バグの原因)
一つ目のバグと同じことが起こっていると思われる。
スクロールが縦で、「見えてる一画面分」だからだろう。

これを避けるには、複数ページが見えている状態ならばOKだが、
縦書き原稿を2ページ画面内に入れるって、
級数小さすぎて現実的ではない。
つまり、
「ページ間のキャレット移動」で、
必ずこのバグに出会うことになる。

は?なめてんの?


(横書きだとどうか?)

次ページが下にそのまま見えているので普通に次行に行ける。
上も同様。

つまり、次ページがカーソル方向に隣接していることで、
このバグは起こらない。
やはり縦書きでは、左に次のページが見えていれば問題ないのでは?
下に見えているからややこしくなっているのでは?



【バグ3 バグ1と2の組み合わせで、ページ間移動がおかしくなる】

同様の縦書きファイルをつくる。
1 2ページ目先頭行先頭にキャレットを移動。
2 上を押して、キャレットを移動。

(期待されること)
 1ページ目の最終行最終文字の後にキャレットが移動。
(起こること)
 1ページ目の最終行手前から数行前にキャレットが移動。
 ここまでは、ページダウンと同じバグだと思われる。ここからが本番。

(継続して起こるバグ)
このバグが起きているときに、下を押して次の文字へ移動しようとする、
つまり「前文字でバグったのだから、次文字へいけばもとに戻るだろう」と思って、
カーソル下を押すと、
表示ページが3ページ目に移動して、キャレットがいなくなる。
(キャレットのいるページが表示されない)

このときカーソルキーでキャレットを動かすと、
2ページ目が表示されるが、期待した位置にキャレットがいないことが多い。
(どこにいるかは、スクロール量で決まるような気がする)



以上、縦書きと縦スクロールの組み合わせが起こしていると思われるバグでした。

このせいで、縦書きの執筆はまじでページをまたいでやりにくくなっている。
防ぐ方法は、全画面1ページになる倍率を見出すことだろうが、
それが100%じゃないんだよね。ディスプレイによって%が異なると思われる。

少なくとも、執筆しているときに、
100%の文字の級数は小さすぎる。
もっと大きくして書きたい。
そのときに毎回ページアップダウンや、
カーソルでページを移動することが、
うまくいかないことにイライラさせられるのは、
エディタとしては欠陥で、深刻だ。

プログラミングの世界では、
データが壊れたり、煙が出たりするのを深刻というのだろうが、
「使えない」という意味で、深刻だね。


再現可能な状態にまとめておいた。
再現させて、なんじゃこりゃ、と叫んでいただきたい。
マイクロソフトに連絡するのも面倒なので、
暇な人はやっておいて。
たぶん俺、このバグに20年なやんでるわ。
毎回カーソルの行き来で困ってる。

これを防いで、
ページ間の移動を意図通りにする方法も、
あったら教えてください。
posted by おおおかとしひこ at 10:25| Comment(0) | TrackBack(0) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック