VPLファイルについて

VPLファイルについて

- かず の投稿
返信数: 12

こんにちわ

フォントをComputerModern利用せず、他のフォントを利用しています。そのフォント用のTFMなどは作成しています。

利用しているフォントでイタリックの文字は文字幅に対してグリフが左右飛び出している文字があるので、その補正をしたいと考えております。文字のならびの組み合わせによっては文字が重なってしまう。

CHARACTERプロパティのCHARICの値はイタリックの次にローマンの文字が続いたときに有効になる値と認識しております。逆にローマンの次にイタリックが続くときに有効になる設定方法はあるのでしょうか?

イタリックの文字の右側は対処できているのですが、左側が対処できないのです。

LIGTABLEのKRNでは同じフォントでしか有効にならないためおそらく利用できないと考えております。

よろしくお願いします。

かず への返信

Re: VPLファイルについて

- ut の投稿
# ご質問に対する直接的な回答にはなっていませんが…。

サンプルとして、

  bar {\itshape foof foof} baz

という並びを考えてみます。
(“foof” はこの例のためにでっちあげたもので、“foo” の
末尾に “f” を追加してみたものです)

italic correction が入る可能性のある場所を <1> ~ <4> で
表わしてみますと、

  bar {\itshape <1>foof<2> <3>foof<4>} baz

となります。

ここで、可能ならば、<1> の次の f について、少し右に移動して
から f を置く、という風に vf で操作出来たらな、と思ったりも
したのですが、<1> と <3> の場合とを区別して、<1> のときだけ
そのような補正をする、というのは難しそうな気がします。

既存の italic correction は文字の右側に追加されるものですけ
れど、<2> と <4> とを識別して、自動で <4> にのみ補正が入ると
いうわけではなくて、<4> の位置に手動で “\/” を追加すること
で補正を実現していたと思います。

文字の左側に italic correction を入れることを考えた場合にも、
<1> と <3> を区別するのは困難だと思われ、そうだとすると <1>
の位置にのみ手作業で何かしら glue や \kern の類いを入れるこ
とで対応するのが現実的なように思えます。

【参考】David Bausum, TeX Reference Manual, Springer, 2002
(Originally, Kluwer, 2002) という TeX のプリミティブのレファ
レンスがありますが、その pp. 28 f. に “/ (italic correction)”
の解説が載っています。

丸々転載するわけにはいきませんので、その一部を転記します。

“Example”、“Produces”、“Comments” の順に叙述されている
のですが、ここでは、“Example” の plain TeX のコードを LaTeX
に書き替えて、そのタイプセット結果の “Produces” は、画像を
下に貼ります。

Example:

\documentclass{article}

\setlength{\parindent}{0pt}
\pagestyle{empty}

\newcommand{\heading}[1]{%
  {\fontfamily{bch}\selectfont\leavevmode\llap{\normalfont\textbullet\ }#1}%
}

\begin{document}

\LARGE

\fontfamily{ppl}\selectfont
\heading{palatino:} [{\itshape f}] [{\itshape f\/}] [\/{\itshape f\/}]

\fontfamily{cmr}\selectfont
\heading{computer modern:} [{\itshape f}] [{\itshape f\/}] [\/{\itshape f\/}]

\bigskip

\fontfamily{ppl}\selectfont

% Bausum, TeX Reference Manual, p. 29
\def\R#1{\dimen0=0.05em\multiply\dimen0 by #1\kern\dimen0\relax}

\heading{exemples of hand kerning:}\par
[\R0{\itshape f\/}] [\R1{\itshape f\/}] [\R2{\itshape f\/}] [\R3{\itshape f\/}] [\R4{\itshape f\/}]
[\R5{\itshape f\/}] [\R6{\itshape f\/}] [\R7{\itshape f\/}] [\R8{\itshape f\/}] [\R9{\itshape f\/}]

\end{document}

Comments:

・ The first [f] shows an instance where the f requires an italic
  correction. It is added in the second [f].

・ TeX does not provide a pre-character italic correction, and
  the third [f] shows `[' does not have an italic correction.
  This is not a probrem for CM, but it is for Caslon. It represents
  something that will need to be lived with or fixed by hand [f].

・ ... shows several examples of hand kerning. The author's preference
  uses \R4.

(原著では例に Caslon が使われていますが、ここでは URWPalladioL
を使っています.Palatino の場合には \R3 くらいがバランスがいい
ように見えます.)

添付 3969.jpg
ut への返信

Re: VPLファイルについて

- ut の投稿
うぐぐぐ…。
“exemple” はもちろん、“example” の type です(恥ずかしい…)。

ut への返信

Re: VPLファイルについて

- ut の投稿
# しつこくてすいません…。

type じゃなくて typo です… orz。
(今日の私は、目が変なのか、指が変なのか、それとも頭が…?)

かず への返信

Re: VPLファイルについて

- しっぽ 愛好家 の投稿
そもそも,「左側」のイタリック補正というのはなかったような……(添付の書庫内の 20250617-1.tex のタイプセット結果を参照してください)
もっとも,添付の書庫内の 20250617-2.tex のようなことは可能といえば可能ですが.
# 仮想フォント altcmti10.vf を用いているので,このファイルおよび altcmti10.tfm を適切なディレクトリにおいてください.
# なお,これらのサンプルは私の作業環境(TeX Live 2018,非 LuaTeX)に基づいています.
 
[バグフィクス]
ファイル 20250617-2.tex の冒頭の
\@namedef{@dummychar@cmr/m/it}{128}
\expandafter\chardef\csname @dummychar@cmr/m/it\endcsname 128
に変更してください.
しっぽ 愛好家 への返信

Re: VPLファイルについて

- ut の投稿
しっぽ愛好家 さん

貴重なご指摘並びに、素晴らしい作例をご投稿くださり、誠にあり
がとうございます。

かず さん

しっぽ愛好家さんのご回答が、まさにかずさんが求めてらした回答
だと思いますので、そちらをご参照ください。


# なお、この件に限らず、よく分かってもいないのに私がでしゃば
# ってばかりいて、それが多くの上級者のみなさんをイラつかせて
# しまっていることは想像に難くなく、今さらながら申し訳なく思
# います。

# 私の回答もどきが、しっぽ愛好家さんによる正しいご回答のきっ
# かけとなったのであれば、私のでしゃばりも少しは役に立ったの
# かもしれないと、大目に見ていただけましたらありがたいです。

下の画像は、
 (1)しっぽ愛好家さんの 20250617-2.tex によるもの(f、j、p の
    イタリックに左側の補正あり、右側の補正も通常通りあり)
 (2)通常のイタリック(イタリック補正なし)
 (3)通常のイタリック(右側のイタリック補正のみあり)
です:

添付 3969_2.jpg
ut への返信

Re: VPLファイルについて

- ut の投稿
【根本的な誤解についてのお詫び】

私の最初の投稿の冒頭で、

> サンプルとして、
>
>   bar {\itshape foof foof} baz
>
> という並びを考えてみます。

と書きましたが、そもそも、この前提がおかしかったです。

しっぽ愛好家さんも本田さんも \textit に細工をしてらっしゃっ
ていて、\textit であれば、

  bar \textit{<1>foof foof<2>} baz

の <1> や <2> を判定できるわけですから、私がぐだぐた述べたよ
うなことは考える必要はなかったわけです…。

\textit の場合には右の italic correction が自動で入ることは
知っていたにも拘わらず、敢えて、うまくいかなさそうな例を挙げ
てみたのですけれど、結局不適切でした。申し訳ありません。

あと、今さらながら、

 TLC, 2nd
 7.3.1 Standard LaTeX font commands
 7.3.3 Font commands versus declarations

 TLC, 3rd, Vol. 1
 9.3.1 Standard LaTeX font commands
 9.3.2 Font commands versus declarations

 ltfntcmd.dtx [2023/12/26 v3.5a LaTeX Kernel (Font commands)]
 Revision 73643
 Modified Wed Jan 29 20:32:39 2025 UTC

を眺めてみたところ、LaTeX における italic correction の制御
については、\itshape と \/ の組み合わせの他に、\textit と
\nocorrlist, \nocorr の組み合わせもあったのですね。

少し前のご質問にあった、コマンドの再定義・フックの件について
もそうでしたが、私の知識は全然アップデート出来ていないようで、
いろいろと時代錯誤なことばかり書き散らしてしまっていて、なん
とも申し訳ないです。改めてお詫び申し上げます。
(← https://okumuralab.org/tex/mod/forum/discuss.php?d=3912)

しっぽ 愛好家 への返信

Re: VPLファイルについて

- 本田 知亮 の投稿

私もこういう階層に手を入れるのは好きなんですが, なかなか小回りがききにくいというのもあるので ちょっと手軽なフェイク的なものを.

\textitの直前が空白ではないときに \textitの中の最初の文字がf,j,pのときに それぞれ5pt,10pt,15ptの\hskipを入れています.

\futureletで取得したトークンに\meaningをつけて \edefして文字列を取得する手法を真似させてもらいました. ちょっと泥臭いのとthe characterのケースは省いているのと フォントの大きさとか関係なくアキが固定なのは手抜きです.

\documentclass{article}

\makeatletter

\def \DeclareTextFontCommand@leftic #1#2{%
  \DeclareRobustCommand#1[1]{%
    \ifmmode
      \nfss@text{#2##1}%
    \else
      \hmode@bgroup
       \text@command{##1}%
       #2\check@icl\left@ic##1\check@icr
       \expandafter
      \egroup
    \fi
                       }%
}
\DeclareTextFontCommand@leftic{\textit}{\itshape}

\@namedef{fakeic@the letter f}{5pt}
\@namedef{fakeic@the letter j}{10pt}
\@namedef{fakeic@the letter p}{15pt}

\def\dofakeic{\edef\meaning@next@token{\meaning\token@next}%
              \hskip\csname fakeic@\meaning@next@token\endcsname}

\def\left@ic{%
\ifnum\lastnodetype=11\relax
\else
\expandafter\futurelet\expandafter\token@next\expandafter\dofakeic
\fi
}


\makeatother
\begin{document}
[\textit{f}]

[\textit{j}]

[\textit{p}]

aaa \textit{f} aaa \textit{f}

aaa \textit{j} aaa\textit{j}

aaa \textit{p} aaa\textit{p}

\end{document}
本田 知亮 への返信

Re: VPLファイルについて

- かず の投稿
しっぽ愛好家さん、本田さんありがとうございます。
参考にさせていただきます。
かず への返信

Re: VPLファイルについて

- かず の投稿
数式モードでも出来ないかcopilot君に相談していたらLaTeXでは難しいと言われLuaLaTeXで提案されました。
LuaLaTeXは全く分かりませんが提案されたソースだけ載せておきます。


\documentclass{article}
\usepackage{luacode}
\usepackage{amsmath}

\begin{document}

\begin{luacode}
function insert_italic_correction(head)
local current = head
while current do
if current.id == node.id("glyph") then
local char = unicode.utf8.char(current.char)
if char == "f" then
local kern = node.new(node.id("kern"))
kern.kern = 0.5 * tex.sp("1em")
node.insert_before(head, current, kern)
elseif char == "j" then
local kern = node.new(node.id("kern"))
kern.kern = tex.sp("1em")
node.insert_before(head, current, kern)
elseif char == "p" then
local kern = node.new(node.id("kern"))
kern.kern = 1.5 * tex.sp("1em")
node.insert_before(head, current, kern)
end
end
current = current.next
end
return head
end

luatexbase.add_to_callback("pre_linebreak_filter", insert_italic_correction, "insert_italic_correction")
luatexbase.add_to_callback("hpack_filter", insert_italic_correction, "insert_italic_correction")
\end{luacode}

通常モード:

[\textit{f}] [\textit{j}] [\textit{p}]

aaa \textit{f} aaa \textit{j} aaa \textit{p}

数式モード:

$(f)[f]\{f\}$

$\left( f \right) \left[ f \right]\left\{f \right\}$

\end{document}
かず への返信

Re: VPLファイルについて

- しっぽ 愛好家 の投稿

数式中において,補正対象の文字に「常に」アキを追加するのなら,次のような手も考えられます.

もっとも,\mathbf{f} のようなものに対してもアキが入ってしまいます(これは,\fam を調べて回避することも可能でしょうが)し, そもそも私自身はそのような補正を施したくなるのは開きのパーレンの直後のような特定の箇所のみですので (「f(x)」「p + q」のようなものには補正の必要を感じないので),私自身はむしろ(数式内では)手動での調整を行って, 下記のサンプルのような処理を実際に行うことはありませんが.

\documentclass{article}
\DeclareMathSymbol{\jinmath}{\mathalpha}{letters}{`j}
\DeclareMathSymbol{\finmath}{\mathalpha}{letters}{`f}
\DeclareMathSymbol{\pinmath}{\mathalpha}{letters}{`p}
\makeatletter
\begingroup
\toks@{\mathcode`j="8000\relax}
\lccode`\~=`j
\lowercase{\xdef\@init@mathchar{\the\toks@\def\noexpand~{{\mkern1.5mu\jinmath}}}}
\toks@\expandafter{\@init@mathchar \mathcode`f="8000\relax}
\lccode`\~=`f
\lowercase{\xdef\@init@mathchar{\the\toks@\def\noexpand~{{\mkern1.5mu\finmath}}}}
\toks@\expandafter{\@init@mathchar \mathcode`p="8000\relax}
%%% \endgroup に「p」が入っていることに注意
%%% あるいは,{,} でグルーピングしてもよい
\lccode`\~=`p
\lowercase{\xdef\@init@mathchar{\the\toks@\def\noexpand~{{\mkern.75mu\pinmath}}}}
\endgroup
\@init@mathchar
\makeatother

\begin{document}
$(f)$, $(j)$, $(p)$
\end{document}