マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

pLaTeX で everysel したい話

LaTeX で「ラグ組」(各行の右端を揃えずに組むこと)を行うには \raggedreight 命令または flushleft 環境が利用できる。しかしこれらの機能には、「ハイフネーションが行われなくなる(だから“必要以上に”行長が不揃いになってしまう)」という欠点がある。この欠点を解消するために ragged2e というパッケージが作られていて、これが新たに提供する \RaggedRightFlushLeft 環境を用いることで、従来のものより好ましい結果が得られる。(詳しくは ragged2e のマニュアルを参照されたい。)

この ragged2e パッケージであるが、実は (u)pLaTeX では使えないようである。具体的には、ragged2e を読み込むだけでpLaTeX*1和文のフォント管理機能が異常になってしまうのである。

% pLaTeX 文書
\documentclass[a4paper]{jsarticle}
\usepackage{ragged2e}% 読み込むだけでアウト
\begin{document}
% 和文のフォントサイズが変わらない!
{\TeX}はアレ{\Large{\TeX}はアレ}
\end{document}

この不具合の原因は、ragged2e 自体ではなくそれが内部で読み粉でいる everysel というパッケージにある。このパッケージは「LaTeX\selectfont 命令にパッチを当てる」という処理を行うのだが、pLaTeX\selectfont 命令は和文フォントを扱うための拡張が元々施されているので、パッチを当てると、その部分の処理が失われてしまい和文フォント変更が機能しなくなるのである。everysel 自身もパッチが「安全でない」ことを検知していて、次のような警告メッセージを出している。

LaTeX Warning: Command \selectfont   has changed.
               Check if current package is valid.

ragged2e は割と有名なパッケージであるので、結構色々なパッケージが内部で読み込んでいる。先日の某フォーラムの質問にあった vwcol パッケージも内部で ragged2e を利用しているので pLaTeX では使えないのである。

厄介なのは、ragged2e による不具合が「読み込むだけ」で発生することであり、そのため、vwcol の「ragged2e を使う機能」を全く使っていないとしても pLaTeX での不具合は発生する。だから結局、ragged2e を利用しているパッケージは全く利用することができない。(なお、ragged2e 以外に「everysel を内部で読み込んでいるパッケージ」も若干存在し、当然それらも pLaTeX では使用できない。)

これは割と大きな問題((和文ではラグ組が使われる機会は少ないし、また LaTeX\raggedright の「ハイフネーションができない」という欠点もほとんどの場合に問題にならないので、ragged2e 自体が必要とされる機会はあまり無いであろう。しかし、「ragged2e を内部で読む」パッケージで和文でも有用なものはありえるし、vwcol もその一つといえるだろう。))である気がするので、作ってみた。

これは、本家の everysel パッケージを読み込んだうえで、その処理の一部を改修して、pLaTeX でも正常に動作するようにしたものである。従って、「pLaTeX で everysel を使いたい」場合には、代わりに pxeverysel を読み込めばよい。以下は、pLaTeX において fracefnt パッケージ((tracefnt パッケージは everysel を読むわけではないが、\selectfont の再定義を行うので、やはり pLaTeX では使用できない。))と同様のデバッグメッセージを出力させる例である。

% upLaTeX 文書
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{pxeverysel}
\makeatletter %!!!!!!!!!!!!!!! TeX code BEGIN
\EverySelectfont{% tracefnt みたいなの
  \typeout{Switching to \font@name!}}
\makeatother  %!!!!!!!!!!!!!!! TeX code END
\begin{document}

{\TeX}はアレ{\sffamily{\TeX}はアレ{\Large{\TeX}はアレ}}

\end{document}

「everysel を内部で読み込むパッケージ」を利用する場合は、そのパッケージの読込よりも前に pxeverysel を読み込んでおけばよい。

% pLaTeX 文書
\documentclass[a5paper,papersize]{jsarticle}
\usepackage{pxeverysel}% vwcol の前にコレ
\usepackage{vwcol}
\usepackage{otf}% \UTF
\usepackage{lipsum}
\begin{document}

\UTF{2603} {\pLaTeX}でvwcolしてみる例 \UTF{3020}
% \UTFが正常に機能することを確認

\medskip\narrowbaselines
\begin{vwcol}[widths={0.6,0.3},sep=fill]
\lipsum[1]% ダミー文章(Lorem ipsum)を出力
% ハイフネーションが行われていることを確認
\end{vwcol}

\end{document}

*1:upLaTeX を含む。以下同様。