42.10 表示されるテキストのサイズ

すべての文字が同じ幅をもつ訳ではありませんが、以下の関数により文字の幅をチェックできます。関連する関数についてはインデント用のプリミティブスクリーン行単位の移動を参照してください。

Function: char-width char

この関数は文字charがカレントバッファーに表示された場合(つまりそのバッファーのディスプレイテーブルがあれば考慮に入れる。ディスプレーテーブルを参照)の幅を列数でリターンする。タブ文字の幅、通常はtab-width (通常の表示の慣習を参照)。

Function: char-uppercase-p char

charがUnicodeに照らして大文字であれば非nilをリターンする。

Function: string-width string &optional from to

この関数は文字列stringがカレントバッファーおよび選択されたウィンドウに表示された場合の幅を列数でリターンする。オプション引数fromtostring内で考慮すべき部分文字列を指定するもので、substringの場合のように解釈される(文字列の作成を参照)。

リターン値は近似値。ディスプレイプロパティやフォント等は無視して構成文字(constituent characters)にたいしてはchar-widthのリターン値、タブ文字は常にtab-width列を占めるものとみなす。これらの理由により、以下で説明するwindow-text-pixel-sizestring-pixel-widthの使用を推奨する。

Function: truncate-string-to-width string width &optional start-column padding ellipsis ellipsis-text-property

この関数はディスプレイ上でwidth列を満たすようにstringを切り詰めて、新たな文字列としてリターンする。

stringwidthに満たなければ、結果はstringと等しい。それ以外の場合には超過した文の文字列は結果から省かれる。string内の複数列文字が列widthを超過する場合には、その文字は結果に含まれない。つまり結果がwidthより短くなりことはあり得るが、超過することはない。

オプション引数start-columnは開始列を指定する(デフォルトは0)。これが非nilなら、その文字列の最初のstart-column列は値から省かれる。string内の1つの複数列文字が列start-columnを超えて跨がるようなら、その文字は結果に含まれない。

オプション引数paddingが非nilなら、結果となる文字列の幅を正確にwidth列に拡張するためにパディング文字が追加される。結果がwidthより短ければ、widthに達するまで必要な個数分のパディング文字が終端に追加される。string内の複数列文字が列start-columnを超える場合には、結果の先頭にもパディング文字が追加される。

ellipsisが非nilの場合には、stringを切り詰める際にstring終端を置き換える文字列であること。この場合にはwidth列に収まるよう、ellipsis用に必要なスペースを開放するために、より多くの文字がstringから削除される。しかしstringの表示幅がellipsisの表示幅より小さければ、ellipsisを結果に追加しない。ellipsisが非nilかつ文字列以外なら、それは変数truncate-string-ellipsisの値を意味する。

オプション引数ellipsis-text-propertyが非nilなら、実際に文字列を切り詰めずに省略記号(ellipsis)を表示するdisplayテキストプロパティ(displayプロパティを参照)でstringの超過部分を隠すことを意味する。

(truncate-string-to-width "\tab\t" 12 4)
     ⇒ "ab"
(truncate-string-to-width "\tab\t" 12 4 ?\s)
     ⇒ "    ab  "

この関数はstringが広すぎる際に適切な切り詰め位置を見つけるためにstring-widthchar-widthが使用するのでstring-widthと同じ問題を抱えている。とりわけstring内で文字合成(character composition)が発生した際には、文字列の表示幅が構成文字の合計幅より短くなるかもしれず、この関数が不正確な結果をリターンするかもしれない。

Function: truncate-string-ellipsis

この関数はtruncate-string-to-widthおよび同様のコンテキストにおいて省略記号(ellipses)として使用する文字列をリターンする。値は変数truncate-string-ellipsisnilでなければその値、すなわち選択されたフレームで表示可能なら単一文字U+2026 HORIZONTAL ELLIPSIS、それ以外なら文字列‘...’。

以下の関数は与えられたウィンドウにあるテキストを表示したときのサイズをピクセル単位でリターンします。この関数はテキストを含むためにウィンドウを十分大きくするためにfit-window-to-bufferfit-frame-to-buffer (ウィンドウのリサイズを参照)により使用されます。

Function: window-text-pixel-size &optional window from to x-limit y-limit mode-lines ignore-line-at-end

この関数はwindowのバッファーのテキストのディメンション(dimension: サイズ、寸法)をピクセル単位でリターンする。windowは生きたウィンドウでなければならずデフォルトは選択されたウィンドウ。リターン値は任意のテキスト行の最大ピクセル幅と、すべてのテキスト行の最大ピクセル高さのコンス。この関数はバッファーがテキストの表示を要したり、その他似たような状況において必要となるwindowサイズをLispプログラムが調整できるようにするために存在する。

リターン値にはオプションでサイズが計測された最初の行のバッファー位置を含めることができる(以下参照)。

オプション引数fromが非nilなら、それは考慮すべき最初のテキスト位置を指定する。デフォルトはそのバッファーのアクセス可能な最小の位置。fromtなら、改行文字ではないアクセス可能な最小位置を意味する。fromがコンスセルの場合にはcarがバッファー位置、cdrにはその位置から、サイズを測定するテキストが属する最初のスクリーン行までの垂直オフセットをピクセル単位で指定する(計測はそのスクリーン行の視覚的な先頭から開始されることになる)。この場合にはピクセルの幅と高さ、それにバッファー位置からなるリストが値としてリターンされる。オプション引数toが非nilなら、それは考慮すべき最後のテキスト位置を指定する。デフォルトはそのバッファーのアクセス可能な最大の位置。totなら、改行文字ではないアクセス可能な最大位置を意味する。

オプション引数x-limitが非nilなら、その位置を超えるテキストを指定するような最大X座標を指定する。したがってこれはこの関数がリターンし得る最大のピクセル幅でもある。x-limitnilまたは省略なら、windowのbody(ウィンドウのサイズを参照)のピクセル幅を使用することを意味する。このデフォルト値はウィンドウより長い切り詰められた行のテキストは無視されることを意味する。このデフォルト値はは呼び出し側がwindowの幅の変更を意図しない場合に有用。それ以外なら呼び出し側はここで想定されるwindowのbodyの最大幅を指定すること。特に行の切り詰めが予想される場合に、それらの行のテキストを勘定に入れる必要があるなら、x-limitを大きな値にセットする必要がある。長い行の幅の計算にはいくらかの時間を要するかもしれないので、必要に応じてこの変数を小さくするのはよいアイデアである。これはいずれにせよ切り詰められるような長い行をバッファーが含む場合が特に該当する。

オプション引数y-limitが非nilなら、その値を超えるテキストは無視されるような最大Y座標を指定する。したがってこれは関数がリターンし得る最大のピクセル高さでもある。y-limitnilか省略なら、toで指定したバッファー位置までのすべてのテキスト行を考慮することを意味する。大きなバッファーのピクセル高さの計算には多くの時間を要する可能性があるので、特に呼び出し側がバッファーのサイズを知らない場合におけるこの変数の指定は合理的である。

オプション引数mode-linesnilまたは省略された場合には、リターン値にwindowのモードライ、タブライン、ヘッダーラインの高さを含めないことを意味する。これがシンボルmode-linetab-lineheader-lineのいずれかなら、それらが存在する場合にはリターン値にそのラインの高さだけを含める。これがtの場合には、もし存在すればすべてのラインの高さをリターン値に含める。

オプション引数ignore-line-at-endはリターンするpixel-heightにtoのスクリーン行のテキスト高さを含めるかどうかを制御します。これはあなたのLispプログラムにとって関心があるのは、toのスクリーン行の視覚的な先頭を除外したテキストのサイズだけという場合に役に立つでしょう。

window-text-pixel-sizeはウィンドウ内に表示されているテキスト全体を扱い、個々の行サイズには留意しません。それは以下の関数が行います。

Function: window-lines-pixel-dimensions &optional window first last body inverse left

この関数は指定したwindowに表示された各行のピクセルサイズを計算する。これはwindowのカレントグリフマトリクス( windowにカレントで表示されている各バッファー文字のグリフを格納するマトリクス。グリフを参照)を調べることにより機能する。成功したら各行末文字の右下隅のX座標とY座標を表すコンスペアのリストをリターンする。これらの座標はwindowの左上隅にある原点(0, 0)からピクセル単位で計測される。windowは生きたウィンドウでなければならずデフォルトは選択されたウィンドウ。

オプション引数firstが整数なら、リターンするwindowのグリフマトリクスの最初の行のインデックス(0から開始)を示す。windowにヘッダーラインがあればインデックス0の行はヘッダーラインになることに注意。firstnilなら考慮する最初の行はオプション引数bodyの値で判断される。bodyが非nilなら、(もしあれば)ヘッダーラインをすべてスキップしてwindowのbodyの最初の行から開始することを意味する。それ以外ならwindowのグリフマトリクスの最初の行(ヘッダーラインかもしれない)から開始することを意味する。

オプション引数lastが整数なら、リターンするwindowのグリフマトリクスの最後の行のインデックスを示す。lastnilなら考慮する最初の行はオプション引数bodyの値で判断される。bodyが非nilなら、windowのモードラインを省略してwindowのbodyの最後の行を使用することを意味する。それ以外ならwindowのグリフマトリクスの最後の行(モードラインかもしれない)を使用することを意味する。

オプション引数inversenilなら、リターンされる任意の行にたいするYピクセル値がwindowの左エッジ(bodyが非nilなら左bodyエッジ)から、その行の最後のグリフの右エッジまでのピクセル単位の距離を指定することを意味する。非nilinverseは、リターンされる任意の行にたいするYピクセル値がその行の最後のグリフの右エッジから右エッジ(bodyが非nilなら右bodyエッジ)までのピクセル単位の距離を指定することを意味する。これは各行末の未使用スペースの量を判断するために有用。

オプション引数leftが非nilなら各行左端文字の左下隅のX座標とY座標をリターンすることを意味する。これは主に右から左にテキストを表示にたいして使用されるべき値である。

leftが非nilinversenilなら、リターンされる任意の行にたいするYピクセル値がその行の最後(左端)のグリフの左エッジから、windowの右エッジ( bodyが非nilなら右bodyエッジ)までのピクセル単位の距離を指定することを意味する。leftinverseがいずれも非nilなら、リターンされる任意の行にたいするYピクセル値がwindowの左エッジ( bodyが非nilなら左bodyエッジ)から、その行の最後(左端)のグリフの左エッジまでのピクセル単位の距離を指定することを意味する。

この関数はwindowのカレントグリフマトリクスが最新でなければnilをリターンする。これはたとえばコマンドの処理中のようにEmacsがbusyな際に通常は発生する。これは遅延が0秒であるようなアイドルタイマーからこの関数が実行された際に取得され得る値である。

Function: buffer-text-pixel-size &optional buffer-or-name window from to x-limit y-limit

これはwindow-text-pixel-sizeに酷似しているが、そのバッファーがウィンドウに表示されていない際に使用できる(ウィンドウに表示されていればwindow-text-pixel-sizeのほうが高速なのでこの関数を使用するべきではない)。

buffer-or-nameには生きたバッファーか生きたバッファーの名前を指定しなければならず、デフォルトはカレントバッファー。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウ。この関数はあたかもbufferwindowで表示されているかのようにテキストのサイズを算出する。リターン値は全テキスト行の最大pixel-width、およびbuffer-or-nameで指定されたバッファーの全テキスト行のpixel-heightからなるコンス。

オプション引数x-limity-limitは、window-text-pixel-sizeの場合と同じ意味をもつ。

Function: string-pixel-width string

これはstringの幅(ピクセル単位)を計算するためにwindow-text-pixel-sizeが利便的用途に用いる関数である。注意: 改行が埋め込まれた文字列の幅を計測するためにこの関数を呼び出すと、改行を含んでいないもっとも広い幅をリターンする。これはその文字列がバッファーに挿入された際のもっとも長い行の幅が結果となることを意味する。

Function: line-pixel-height

この関数は選択されたウィンドウのポイント位置にある行の高さをピクセル単位でリターンする。値にはその行の行スペーシングが含まれる(行の高さを参照)。

Function: string-glyph-split string

文字合成(character composition)が効力をもっていれば、たとえばアクセント付き文字、合字、あるいは複雑なテキストシェイプが一部スクリプト用に必要な際に書記素クラスター(grapheme cluster)を形成するよう文字シーケンスを合成できる。これが発生すると単純な方法によって文字が表示列にマップされなくなり、そのような文字列にたいする表示レイアウト、そしてワイド文字列の切り詰めも複雑な処理となり得る。これはそのような処理において一助となる関数である。この関数は引数stringを部分文字列のリストに分割する。この部分文字列はそれぞれ1つの単位として表示されるべき単一の書記素クラスターを生成する。このリストを使用すればLispプログラムは表示において正しい見た目になるよう視覚的に有効にstringの部分文字列を構成したり、リターンされたリストの構成要素の幅を追加してstringの任意の部分文字列の幅を計算する等を行うことができるだろう。

たとえば1つ目のグリフ以外を表示したければ以下のようにすればよい:

(apply #'insert (cdr (string-glyph-split string))))

行番号(Display Custom in The GNU Emacs Manualを参照)とともにバッファーを表示している際には、行番号の表示に必要な幅が解ると便利なときがあります。以下はレイアウト計算用にこの情報を必要とするLispプログラムのための関数です。

Function: line-number-display-width &optional pixelwise

この関数は選択されたウィンドウで行番号の表示に使用される幅をリターンする。オプション引数pixelwiseがシンボルcolumnsなら、リターン値はフレームの正準列(正準文字幅)にたいする浮動小数点数となる。pixelwisetやそれ以外の非nil値なら、値はピクセルで計測した整数となる。pixelwiseが省略かnilなら、値はline-numberフェイスにたいして定義されたフォントによる列数を表す整数となる。この場合には値には番号の表示の間隙を埋めるために使用する2列分は含まれない。選択されたウィンドウに行番号が表示されていなければ、pixelwiseの値にかかわらず値は0になる。別のウィンドウにたいしてこの情報が必要ならwith-selected-windowを使用すること(ウィンドウの選択を参照)。


This page has generated for branch:work/emacs-30_69b16e5c63840479270d32f58daea923fe725b90, commit:5e3f74b56ff47b5bcef2526c70f53f749bbd45f6 to check Japanese translation.