雑記: TeX でも会話したい話

追記: ある程度意図通りにコンパイルできた版はこちらにあります。

TeX でも会話したい

TeX で以下のような表現をしたいとします。tcolorbox で実現できることがわかります。
f:id:cookie-box:20211013121132p:plain
TeX ファイルは以下です。コンパイルするにはお手元に kazusa.png と takumi.png という画像ファイルが必要なので適当な画像を用意してください。

\documentclass[dvipdfmx,b5j,10pt]{jsarticle}

% 色定義
\usepackage[svgnames]{xcolor}
\definecolor{paleiris}{RGB}{229,227,246}
\definecolor{palegold}{RGB}{255,247,204}

% カラーボックス
\usepackage[most,listings]{tcolorbox}
\tcbuselibrary{breakable}

% 独自のセリフボックス定義
\newtcolorbox{SERIFU}[2][]{
    enhanced,  % タイトルボックスの表示に必要
    breakable,  % ページをまたぐのに必要
    fontupper=\color{Brown},  % セリフの文字色を茶色にするために挿入
    arc=7pt,  % 角の丸みの半径
    top=10pt, right=10pt, left=10pt, bottom=10pt,  % パディング
    boxrule=0pt, frame hidden,  % フレーム隠蔽
    grow to left by=-24pt,  % キャラクター画像を表示するため左にマージン
    % タイトルボックスとしてキャラクター画像を表示
    title={\hspace{6pt}},
    attach boxed title to top left={xshift=-28pt, yshift=-38pt},
    boxed title style={
        enhanced,
        arc=18pt,
        top=15pt, right=12pt, left=12pt, bottom=16pt,
        boxrule=0pt, frame hidden,
        underlay={
            \begin{tcbclipinterior}
            \includegraphics[width=38pt]{#2}
            \end{tcbclipinterior}
        },
    },
    #1
}

\color{Brown}  % 地の文を茶色にするために挿入

\begin{document}

\begin{SERIFU}[colback=paleiris]{kazusa.png}
tcolorbox なるパッケージを利用したらこのような表現ができました。
詳しくは https://www.ctan.org/pkg/tcolorbox を参照してください。
\end{SERIFU}

\begin{SERIFU}[colback=palegold]{takumi.png}
これが見通しのいい方法かはわからないけどね。
\end{SERIFU}

\begin{SERIFU}[colback=paleiris]{kazusa.png}
私たちのセリフの文字も茶色にしているし、地の文も茶色にしています。
\end{SERIFU}

\vspace{5pt}
\noindent つづかない

\end{document}

ページをまたぐとフォントの色変更がリセットされてしまう

目的は達成されたかのように思えたのですが、セリフがページをまたぐと以下の欠陥があることがわかります。
f:id:cookie-box:20211013123318p:plain

ページをまたいでもフォントの色変更を維持できないのか

参考文献 2. (2014年の投稿)をみると、そもそも tcolorbox はページをまたいだフォントの色変更維持に対応していなかったようです。しかし、2021 年の現在はどうなのでしょうか。ドキュメントを参照してみます。

ドキュメントの 392 ページ(2021年10月17日現在)に use color stack なるオプションの説明があり、そこに以下のようにあります。

Depending on the LATEX engine and loaded packages, if your text contains some color
changing commands, your color may not survive the break to the next box. For some
engines, there is support for additional color stacks which allow colors to survive breaks.
Such an color stack can be activated by /tcb/use color stack with help of the pdfcol package.

つまりコンパイルするエンジンによっては、use color stack なるオプションを記述すればフォントの色変更維持をしてくれるようです。しかし、色変更してくれる pdfcolpdfTeX 向けのパッケージのようで、私が利用している pLaTeX (ptex2pdf) でこのオプションは利用できなさそうです。試しに breakable, の下に use color stack, と記述してみると以下のメッセージが表示されます(セリフ毎にこのメッセージが出るのでエンターキーで無視し続けると dvi ファイルは出力されますがなぜか pdf にはしてくれないので dvipdfmx main.dvi などとコマンドを打って pdf を出力します。当然色変更は維持されていません)。

Package pgfkeys Error: I do not know the key '/tcb/use color stack' and I am going to ignore it.

なので参考文献 2. の回答にもドキュメントの 392 ページにもあるように、XeLaTeXLuaLaTeX を利用しなければならなさそうです。

そもそも私はいつも TeXworks を通してコンパイルしていて、緑の三角を押すと何が起きているか知らないのですが、私が利用している pLaTeX (ptex2pdf) の設定をみると ptex2pdf というコマンドをよんでいるようです。実際、以下を直接実行しても main.pdf がコンパイルできます。このとき ptex2pdf から pLaTeX がよび出されているらしいのがログからわかります。

$ ptex2pdf -l -ot -kanji=utf8 main.tex

upLaTeX をよび出すには以下のようにしますがこのとき1行目を \documentclass[uplatex,dvipdfmx,b5j,10pt]{jsarticle} と変更しておかないと怒られます。

$ ptex2pdf -u -l -ot -kanji=utf8 main.tex
XeLaTeX で解決する方法

XeLaTex では色変更が維持できるようですが、use color stack オプションが利用できるというわけではなく、\addfontfeatures{Color=Brown} なるコマンドがあるのでそれを利用せよということのようです。何にせよ XeLaTeX で上の文書がコンパイルできるか試してみます。

$ xelatex main.tex

すると、1行目で読み込んでいる jsarticle.cls に対して This file needs format `pLaTeX2e' but this is `LaTeX2e'. という怒られが発生します。そこで TeX WikiXeTeX のページをみると「XeLaTeX で日本語」という項目があり1番目の選択肢として BXjscls の利用が示されています。そのページにしたがって1行目を以下のようにします。すると PDF がコンパイルできます。この時点では色変更は維持されていません。

\documentclass[b5paper,xelatex,ja=standard]{bxjsarticle}