%#!lualatex
\documentclass{ltjsarticle}
\usepackage{luatexja-fontspec,luatexja-otf, luacode, booktabs,array,xcolor}
\usepackage[scale=0.80]{geometry}
\usepackage{listings}
\setsansjfont{KozGoPr6N-Regular}

% \IVS[?] 用
\begin{luacode}
   local identifiers = fonts.hashes.identifiers
   local fallback_color = 'red'  -- IVS がないときは，この色で既定文字を出力
   local list_color = 'blue!50!black'     -- リスト表示の色

   local attr_curjfnt = luatexbase.attributes['ltj@curjfnt']
   local ubyte = unicode.utf8.byte
   local uchar = unicode.utf8.char
   local sort = table.sort
   function list_ivs(s)
      local c = ubyte(s)
      local pt = identifiers[tex.getattribute(attr_curjfnt)].resources
      pt = pt and pt.variants
      if pt then
         local t = {}
         for i,v in pairs(pt) do
           if v[c] then t[#t+1]={i,v[c]} end
         end
         sort(t, function(a,b) return a[1]<b[1] end)
         tex.sprint('\\textcolor{' .. list_color .. '}{')
         for _,i in ipairs(t) do
            if i[1]>=0xE0100 then -- only IVS
               tex.sprint('\\oalign{' .. s .. uchar(i[1])
                          .. '\\crcr\\hss\\tiny' .. tostring(i[1]-0xE0100) .. '\\hss\\crcr}')
            end
         end
         tex.sprint('}')
      else
         tex.sprint('\\textcolor{' .. fallback_color .. '}{' .. s .. '}')
      end
   end
\end{luacode}

\makeatletter

%%%%%    \IVS[<selector number>]{<character>}
%%%%% or \IVS<selector number>{<character>}
%%%%% (<selector number>: 0--239, or `?')
\def\ltj@ivs@out#1#2{#2\char\numexpr "E0100+#1\relax} % IVS"
\def\ltj@ivs@list?#1{\directlua{list_ivs('#1')}}
\def\ltj@ivs@grab@num{\expandafter\expandafter\expandafter\ltj@ivs@out\ltj@grab@num}
\def\ltj@ivs@nobracket{\@ifnextchar?{\ltj@ivs@list}{\ltj@ivs@grab@num}}
\def\ltj@ivs@bracket[#1]{\ltj@ivs@nobracket#1}
\def\IVS{\@ifnextchar[{\ltj@ivs@bracket}{\ltj@ivs@nobracket}}

\let\MJI=\IVS

\begin{document}
\jfontspec{ipamjm} % IPAmj明朝

例文はZRさんのブログ記事「ipamjmパッケージでアレしてみた」\footnote{%
\verb+http://d.hatena.ne.jp/zrbabbler/20131214/1387029624+}より引用．

\begin{quote}
\LARGE
渡邉󠄏さんとか%    { } の中は U+9089 U+E010F
渡𫟪󠄂さんとか。% { } の中は U+2B7EA U+E0102
\end{quote}


\begin{quote}
\LARGE
\MJI15{邉}\MJI25{邉}\MJI27{邉}\MJI26{邉}\MJI26{邉}\MJI16{邊}
\MJI18{邊}\textcolor{blue}{\MJI2{𫟪}}\MJI17{邊}〓\\
\MJI28{邉}\MJI29{邉}\MJI23{邉}\MJI15{邊}\MJI8{邊}\MJI20{邉}
\MJI24{邉}\MJI19{邉}\MJI18{邉}\MJI16{邉}\\
\MJI14{邊}\MJI10{邊}\MJI12{邊}\MJI11{邊}\MJI13{邊}\MJI9{邊}
\textcolor{blue}{\MJI0{𫟪}}\textcolor{blue}{\MJI1{𫟪}}〓\MJI21{邉}
\end{quote}
MJ番号を直接指定していたところは，このソース中では無視して下駄「〓」にした．
青色は「𫟪」(U+2B7EA)のIVS．

\begin{quote}
\LARGE
渡邉󠄏さんとか%    { } の中は U+9089 U+E010F
渡𫟪󠄂さんとか。% { } の中は U+2B7EA U+E0102
\end{quote}


\def\TEST{%
  奈良県葛󠄀城市と東京都葛󠄁飾区．%
  江戸川区葛西はどっち？
}

\paragraph{IVSとopentype featureの干渉テスト}

\begin{quote}
 \Large
 {\jfontspec{KozMinPr6N-Regular}\TEST}\\
 {\jfontspec[CJKShape=JIS1978]{KozMinPr6N-Regular}\TEST}\\
 {\jfontspec[CJKShape=JIS1990]{KozMinPr6N-Regular}\TEST}
\end{quote}

\newpage
\def\TABLE#1#2{%
   \begin{center}
   #1\par\medskip
   \jfontspec{#2}
   \Large
   \begin{tabular}{c>{\tt}ll}
      \toprule
      文字&Unicode&異体字\\
      \midrule
      今&U+4ECA&\IVS?{今}\\
      邉&U+9089&\IVS?{邉}\\
      邊&U+908A&\IVS?{邊}\\
      𫟪&U+2B7EA&\IVS?{𫟪}\\
      葛&U+845B&\IVS?{葛}\\
      \bottomrule
   \end{tabular}
   \end{center}
}

\TABLE{IPAmj明朝}{ipamjm}
\TABLE{小塚明朝 Pr6N R}{kozminpr6n-regular}
\TABLE{Source Han Serif Regular}{Source\space Han\space Serif\space Regular}

\begin{lstlisting}[basicstyle=\tt, columns=fixed, basewidth=.5em]
奈良県葛󠄀城市と東京都葛󠄁飾区．%
江戸川区葛西はどっち？
\end{lstlisting}

\end{document}
