uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

- ya ra の投稿
返信数: 5

実行環境

  • Windows11
  • TeX Live 2023
  • LuaLaTeX

unicode-math では、数式が Unicode で出力されます。 一方で、unicode-math に収録されていない記号を OpenType フォントではないフォントから取り入れようとすると、たとえその記号が Unicode に登録されていたとしても、PDF 内のテキスト情報は期待した記号ではない何かになってしまいます。

例えば、mathabx パッケージで提供されている天文学記号を以下のように導入した場合、生成された PDF のテキスト情報は Unicode に対応しません。(@ABCDEFGHIJKLMN がコピペされる)

% +++
% latex = lualatex
% +++
\documentclass[11pt]{jlreq}
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
%%
%% mathabx
%% 以下のディレクトリにあるファイルから適当に抜粋
%% texlive/2023/texmf-dist/tex/generic/mathabx
\DeclareFontFamily{U}{mathb}{\hyphenchar\font45}
\DeclareFontShape{U}{mathb}{m}{n}{
      <5> <6> <7> <8> <9> <10> gen * mathb
      <10.95> mathb10 <12> <14.4> <17.28> <20.74> <24.88> mathb12
      }{}
      %% 山括弧がエンコードされてしまうようです...
      %% 実際は、< → < の半角、> → > の半角です。
\DeclareSymbolFont{mathb}{U}{mathb}{m}{n}
\DeclareFontSubstitution{U}{mathb}{m}{n}
\DeclareMathSymbol{\Sun}       {0}{mathb}{"40} % U+2609
\DeclareMathSymbol{\Mercury}   {0}{mathb}{"41} % U+263F
\DeclareMathSymbol{\Venus}     {0}{mathb}{"42} % U+2640
\DeclareMathSymbol{\Earth}     {0}{mathb}{"43} % U+1F728
\DeclareMathSymbol{\Mars}      {0}{mathb}{"44} % U+2642
\DeclareMathSymbol{\Jupiter}   {0}{mathb}{"45} % U+2643
\DeclareMathSymbol{\Saturn}    {0}{mathb}{"46} % U+2644
\DeclareMathSymbol{\Uranus}    {0}{mathb}{"47} % U+26E2
\DeclareMathSymbol{\Neptune}   {0}{mathb}{"48} % U+2646
\DeclareMathSymbol{\Pluto}     {0}{mathb}{"49} % U+2647
\DeclareMathSymbol{\varEarth}  {0}{mathb}{"4A} % U+2641
\DeclareMathSymbol{\Leftmoon}  {0}{mathb}{"4B} % U+263D
\DeclareMathSymbol{\Rightmoon} {0}{mathb}{"4C} % U+263E
\DeclareMathSymbol{\Fullmoon}  {0}{mathb}{"4D} % U+1F315
\DeclareMathSymbol{\Newmoon}   {0}{mathb}{"4E} % U+1F311
%%
\begin{document}

\begin{equation}
  \Sun \Mercury \Venus \Earth \Mars \Jupiter \Saturn \Uranus \Neptune 
  \Pluto \varEarth \Leftmoon \Rightmoon \Fullmoon \Newmoon
\end{equation}

\end{document}

テキスト情報をそれぞれの記号に対応する Unicode に変更する方法はありますか?

↓ コピペしたテキスト情報で PDF 内を検索した様子 ↓

添付 スクリーンショット 2023-08-08 044437.png
ya ra への返信

Re: uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

- 奥村 晴彦 の投稿
あれ、< > が出ないでしょうか。プレインテキストフォーマットで

\DeclareFontShape{U}{mathb}{m}{n}{
  <5> <6> <7> <8> <9> <10> gen * mathb
  <10.95> mathb10 <12> <14.4> <17.28> <20.74> <24.88> mathb12
}{}

Markdownだとダメなのかもしれません。

ご質問についてはよくわからないのですが、Unicodeの惑星記号なら適当なシンボルフォント(MacならApple Symbols)を使えば出そうです。日本語を使うなら全角と混乱しないようにプリアンブルに
\ltjsetparameter{jacharrange={-2,-3}}
と書いておいて、
\newfontface{\apple}{Apple Symbols}
{\apple ☉☿♀♁♂♃♄♅♆♇ }
みたいに。
奥村 晴彦 への返信

Re: uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

- ya ra の投稿
奥村様、回答ありがとうございます。

Markdown フォーマットのブロックコード内で角括弧を使用したところ、エンコードされてしまいました。

----------

ご指摘の通り、確かに当該記号の含まれる他のフォントを利用すれば、問題なく出力されます。(私は Windows なので、Noto Sans Symbols を利用することで再現できました)

今回の質問で重要な点を書きそびれていたのですが、私は mathabx から得られる形の記号を使いたいということです。

他のフォントでも記号を Unicode として出力することは出来ますが、出力のみを目的にしていませんでした。この点が不明瞭だったことは申し訳ありません。
ya ra への返信

Re: uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

- 奥村 晴彦 の投稿
なるほど。
よくわからないのでChatGPT(GPT-4)に聞いてみました。最初ちょっとバグっていたのでマニュアルを見て修正したのが次のコードです:

\documentclass{article}
\usepackage{mathabx}
\usepackage{accsupp}
\newcommand*{\copyableSun}{
    \BeginAccSupp{method=hex,unicode,ActualText=2609}
        \Sun
    \EndAccSupp{}
}
\begin{document}
\[ \copyableSun \]
\end{document}

これでAcrobat Readerならコピペできるようですが、MacのPreviewではなぜかうまくいきませんでした。
奥村 晴彦 への返信

Re: uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

- ya ra の投稿

ありがとうございます。

教えていただいた方法を当該記号全体に対応させてみました。

% +++
% latex = lualatex
% +++
\documentclass[11pt]{jlreq}
\usepackage{unicode-math}
\setmathfont{STIX Two Math}
\usepackage{accsupp}
%%
%% mathabx
%% 以下のディレクトリにあるファイルから適当に抜粋
%% texlive/2023/texmf-dist/tex/generic/mathabx
\DeclareFontFamily{U}{mathb}{\hyphenchar\font45}
\DeclareFontShape{U}{mathb}{m}{n}{
      &lt;5&gt; &lt;6&gt; &lt;7&gt; &lt;8&gt; &lt;9&gt; &lt;10&gt; gen * mathb
      &lt;10.95&gt; mathb10 &lt;12&gt; &lt;14.4&gt; &lt;17.28&gt; &lt;20.74&gt; &lt;24.88&gt; mathb12
      }{}
\DeclareSymbolFont{mathb}{U}{mathb}{m}{n}
\DeclareFontSubstitution{U}{mathb}{m}{n}
\DeclareMathSymbol{\genSun}       {0}{mathb}{"40} % U+2609
\DeclareMathSymbol{\genMercury}   {0}{mathb}{"41} % U+263F
\DeclareMathSymbol{\genVenus}     {0}{mathb}{"42} % U+2640
\DeclareMathSymbol{\genEarth}     {0}{mathb}{"43} % U+1F728
\DeclareMathSymbol{\genMars}      {0}{mathb}{"44} % U+2642
\DeclareMathSymbol{\genJupiter}   {0}{mathb}{"45} % U+2643
\DeclareMathSymbol{\genSaturn}    {0}{mathb}{"46} % U+2644
\DeclareMathSymbol{\genUranus}    {0}{mathb}{"47} % U+26E2
\DeclareMathSymbol{\genNeptune}   {0}{mathb}{"48} % U+2646
\DeclareMathSymbol{\genPluto}     {0}{mathb}{"49} % U+2647
\DeclareMathSymbol{\genvarEarth}  {0}{mathb}{"4A} % U+2641
\DeclareMathSymbol{\genLeftmoon}  {0}{mathb}{"4B} % U+263D
\DeclareMathSymbol{\genRightmoon} {0}{mathb}{"4C} % U+263E
\DeclareMathSymbol{\genFullmoon}  {0}{mathb}{"4D} % U+1F315
\DeclareMathSymbol{\genNewmoon}   {0}{mathb}{"4E} % U+1F311
%%
\newcommand{\copyableAstronomicalSym}[2]{ \BeginAccSupp{ method = hex, unicode, ActualText = #2, } #1 \EndAccSupp{}}
\newcommand{\Sun}       {\copyableAstronomicalSym{\genSun}{2609}}
\newcommand{\Mercury}   {\copyableAstronomicalSym{\genMercury}{263F}}
\newcommand{\Venus}     {\copyableAstronomicalSym{\genVenus}{2640}}
\newcommand{\Earth}     {\copyableAstronomicalSym{\genEarth}{1F728}}
\newcommand{\Mars}      {\copyableAstronomicalSym{\genMars}{2642}}
\newcommand{\Jupiter}   {\copyableAstronomicalSym{\genJupiter}{2643}}
\newcommand{\Saturn}    {\copyableAstronomicalSym{\genSaturn}{2644}}
\newcommand{\Uranus}    {\copyableAstronomicalSym{\genUranus}{26E2}}
\newcommand{\Neptune}   {\copyableAstronomicalSym{\genNeptune}{2646}}
\newcommand{\Pluto}     {\copyableAstronomicalSym{\genPluto}{2647}}
\newcommand{\varEarth}  {\copyableAstronomicalSym{\genvarEarth}{2641}}
\newcommand{\Leftmoon}  {\copyableAstronomicalSym{\genLeftmoon}{263D}}
\newcommand{\Rightmoon} {\copyableAstronomicalSym{\genRightmoon}{263E}}
\newcommand{\Fullmoon}  {\copyableAstronomicalSym{\genFullmoon}{1F315}}
\newcommand{\Newmoon}   {\copyableAstronomicalSym{\genNewmoon}{1F311}}
%%
\begin{document}

\begin{equation}
  \Sun
  \Mercury
  \Venus
  \Earth
  \Mars
  \Jupiter
  \Saturn
  \Uranus
  \Neptune
  \Pluto
  \varEarth
  \Leftmoon
  \Rightmoon
  \Fullmoon
  \Newmoon
\end{equation}

\end{document}

私も同じように Acrobat Reader であれば、ほとんど上手くいくようになりました。(SumatraPDF、PDF.js、MS Edge の内部ビューワともにダメでした)

Acrobat Reader 内でコピーすると次のようになりました。

☉☿♀ὲ♂♃♄⛢♆♇♁☽☾ἱἱ

ただし、 Unicode Hex が 5 桁の \Earth\Fullmoon\Newmoon は上手く解釈されないようでした。

\Earth (U+1F728) と (U+1F72) を見比べると、上 4 桁は一致しています。どうやら、ActualText は 4 桁までしか読まないようです。

糸口を見出していただいたので、あとはいくつかの問題を解消すれば良さそうです。ありがとうございます。

ya ra への返信

Re: uincode-math 利用時に OFT 以外のフォントを使ってもテキスト情報を Unicode にしたい

- 和田 勇 の投稿
* マークダウンでコードブロック内の表示が思い通りにならない

 当フォーラムで markdown のコードブロック記法として ``` ... ``` を用いると
 「<」や「>」などが思い通りに表示できないない場合は、 <pre> ... </pre> で
 回避しています。もちろん投稿は markdown のまま。

  (ちなみのこの投稿自体は プレインテキスト)

 あるいは添付ファイルでアップロードの検討もします。

* 追加情報ですが、件の文字列のコピペというか pdf からテキスト取り出し方法について

  「pdftotext  hoge.pdf」 や ripgrep-all で 「 rga .  hoge.pdf」(any character で検索)などとすると
  ya ra さんが示されたように☉☿♀ὲ♂♃♄⛢♆♇♁☽☾ἱἱ が得られます。