Re: 欧文文字間を密着させたい

名前: .
日時: 2005-10-18 00:33:04
IPアドレス: 222.7.117.*

>>38632 # むしろ,[蛇足] で挙げた方法を先に検討したほうが簡単に済むと # 思うのですが,それはともかく とりあえず,定義に必要な事項を挙げます. # 以下に出てくる \@tfor などは,マクロ作成に関する“教科書的な” # 解説書であれば(先に言及した『基礎解説』以外であろうと) # 取り上げているはずです. # 単なる一例として例示した書籍が手元になくても, # そこで諦めないでくださいね. ・幅を指定したボックスを作成するためには,どのようなプリミティブ (TeX 自身の組み込みコマンド)が使えますか? # \hbox to<幅>{<中身>} ・文字列を 1 文字ずつ取得してその個々の文字に対して何らかの処理を 適用する,というタイプのループ処理を行うには,LaTeX が提供する どのマクロが使えますか? # \@tfor\@tempa:=<文字列>\do{<\@tempa を使った処理>} # この場合,(最も基本的な場合には)\@tempa には <文字列> の # 個々の文字が代入されます. # なお,\@tempa のところは,“ユーザが一時的に勝手に定義しても構わない # コマンド”であれば何でも構いません. ・以上のことを組み合わせて均等割付処理を行うマクロを作成してください. (なお,個々の文字の間に \hskip 0pt plus 1fill minus 1fill を 挟み込むといい,という話は先のコメントで済ませています.) # とりあえず, # \def\equispace#1#2{% #1: <幅>, #2: <均等割付対象> # \hbox to#1{\@tfor\@tempa:=#2\do{% # \@tempa% <均等割付対象> の個々の文字 # \hskip 0pt plus 1fill minus 1fill}}} # という定義ができるはずです. # ただし,これだけでは,均等割付対象の最後の文字のあとにも余分な # \hskip 0pt ... が入るので,それを削除する必要があります(\@tfor...\do{...} # 全体の直後で \unskip を用いれば,その処理ができます). # さらに,均等割付対象がただ 1 文字の場合には幅が <幅> の範囲の中央に # 置くためにボックスの両端に \hfil(これの伸長度は個々の文字の間に # 挟み込んだグルーの伸長度に比べると無限小であることにも # 注意してください)を置くことにすると,とりあえず # \def\equispace#1#2{% # \hbox to#1{% # \hfil # \@tfor\@tempa:=#2\do{% # \@tempa% # \hskip 0pt plus 1fil minus1fil}% # \unskip # \hfil}} # と定義できるでしょう. # あとは,“ボックスを作るようなマクロでは必要があれば段落を開始する” # という“お約束”に従って \equispace の定義中の \hbox の直前に # \leavevmode を入れることになり,それで完成です. # あとは,今の \equispace を用いて # \def\labelenumi{% # \protected@edef\@tempa{\protect\equispace{.8em}{\theenumi}}% # \@tempa} # とでもした状態で enumerate 環境を用いてみれば,状況がわかります. # 文字 @ を含む名称のコマンドを含む記述を扱う場合には, # そのような記述全体を \makeatletter,\makeatother で囲んでください # (念のため). [蛇足] なお,\kanjiskip 等に頼る方法には“それらのグルーが入らない箇所の 文字間隔は変わらない”という欠点がありましたが,上記のように \@tfor を単純に用いたのでは“\equispace{5zw}{半\textgt{魚}人} のような記述はエラーを引き起こす”という欠点があります. その場しのぎで済ますには \textgt{魚} の部分を {,} で囲めばよいのですが, まともに対処するには \equispace の引数中で用いてもよいコマンドの範囲を 限定した上で,引数中に現れたコマンドに応じた対処を(マクロ内で) 施すことになります. # “\equispace{5zw}{{{半魚人}} のように引数に余分な括弧をつけると # 均等割付が効かない”ことのほうは“仕様”としても構わないでしょうけれども, # これにも対処するなら,\@tfor を用いるのではなくもう少し手の込んだことを # することになります.

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます)