VPLファイルについて

Re: VPLファイルについて

- 本田 知亮 の投稿
返信数: 2

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

\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}