マクロツイーター

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

LaTeXで和文を斜体する話(1)

まとめてみた。

なぜ和文を斜体しにくいのか

ほとんどの場合、日本語用のフォントには「斜体」の変種は用意されていない1。従って、和文を斜体で出力しようとすると「合成斜体」(直立体のグリフを変形して出力する)を使うことになる。TeXを利用したワークフローにおいても合成斜体は十分にサポートされているのであるが、あまり好まれていないこともあり、LaTeXユーザが簡単に使えるようにはなっていない。特に、「通常のフォント切り替え命令(\textit\slshape等)で和文に斜体が適用される」ような設定はほとんど行われないようである。

“図”として斜体する

斜体の使われ方に関する欧文と和文の間の大きな違いとして「和文の斜体は本文の段落を組むのに使われることが原則的にない」ということがある。つまり和文の斜体の用法の大部分は「図に類するもの(装飾性の高いもの)」ということになるだろう。そういう用法の場合、「フォントとしての斜体」ではなく「図の装飾としての斜体変形」を利用するのが妥当である。

TikZで図を作成する場合、テキストを配置するためにノード(node命令)を使うことになる。ここでnode命令のオプションとしてxslant=<割合>を指定すると、そのノードに斜体変形を適用できる。

例えば次のTikZの文は現在点に25%の斜体変形をかけた「テキスト」の文字を出力する。

\node[xslant=0.25] {テキスト};

※もちろん、ノードのテキストの内容は和文文字に限らない。

「斜体変形をかけた文字を含む図」の実例を挙げておく。

% upLaTeX+dvipdfmx
\documentclass[dvipdfmx]{article}
%↓単体の図を出力するための準備
\usepackage[papersize={400bp,320bp},
  margin=0pt,noheadfoot]{geometry}
\usepackage[svgnames]{xcolor}
\usepackage{tikz,scsnowman,tikzducks}
\setlength{\parindent}{0pt}
%↓既定のフォントを"原ノ味ゴシックHeavy"にする
\usepackage{lmodern,pxchfon}
\setminchofont{HaranoAjiGothic-Heavy.otf}
\newcommand{\myPeace}{\fontsize{64}{0}\rmfamily}
\begin{document}
\begin{tikzpicture}[x=1bp,y=1bp]
%↓この辺はいつものやつ☃
\useasboundingbox (0,0) rectangle (400,320);
\node at (100,100) {\scsnowman[scale=20,
  muffler=Red,hat=Green,buttons=RoyalBlue,
  arms=Brown,snow=SkyBlue]};
\node at (300,92) {\tikz[scale=60]{\duck[
  hat=Brown,cape=Orange]}};
%
%↓斜体変形をかけた文字を出力する
\node[text=Green,font=\myPeace,xslant=0.25]
  at (200,250) {世 界 平 和};
\end{tikzpicture}
\end{document}

f:id:zrbabbler:20200905142720p:plain
出力結果

TikZの図は段落の中に配置できる(“インライン”の要素である)ので、「図としての斜体」を“流用”する形で文章の一部を斜体の文字で出力することも可能である。ただし元来が図のための機能であるため、そういう使い方には少しコツが要る。詳しい説明は別の記事に譲ることにして、ここでは「斜体変形をかけたテキスト」を出力するマクロを挙げておく。

%% \mySlanted{テキスト}: テキストを25%斜体変形付で出力する.
\newcommand*{\mySlanted}[1]{\tikz[baseline=(T.base)]{%
  \node[inner sep=0pt,outer sep=0pt,xslant=0.25](T){#1}}}

この\mySlantedを使ったupLaTeX文書の例を挙げておく。

% upLaTeX+dvipdfmx
\documentclass[uplatex,dvipdfmx,a4paper]{jsarticle}
%↓ゴシック体を"原ノ味ゴシックBold"にする
\usepackage[haranoaji]{pxchfon}
\setgothicfont{HaranoAjiGothic-Bold.otf}
\usepackage{tikz}
\newcommand*{\mySlanted}[1]{\tikz[baseline=(T.base)]{%
  \node[inner sep=0pt,outer sep=0pt,xslant=0.25](T){#1}}}
\begin{document}
毎年9月21日は\mySlanted{\gtfamily 世界平和}の日☃です。
\end{document}

f:id:zrbabbler:20200905145027p:plain
出力結果

ただし、この方法には重大な欠点がある。単に「図を文章内に出力している」に過ぎないので、テキストを途中で改行することができないのである。従って、例えば「段落全体を斜体文字で出力したい」という場合2にはこの方法は使えず、きちんと「フォントとしての斜体」を用意する必要がある。

LuaLaTeXでフォントとして斜体する

LuaLaTeX(やXeLaTeX)ではfontspecの機能が使えるため、合成斜体のフォントを利用するのはそれほど難しくない。

fontspecの機能(\setmainfont\fontspec等)でフォントを定義する際に、パラメタにFakeSlant=割合を指定すると合成斜体が適用される。例えば、以下のコードは欧文フォントを25%斜体の「Comic Sans MS」に変更する。

% 欧文を25%斜体の"Comic Sans MS"にする
\fontspec{Comic Sans MS}[FakeSlant=0.25]

LuaTeX-jaで和文を扱っている場合は、luatexja-fontspecの命令(\setmainjfont\jfontspec等)を使って同様にFakeSlantを指定すれば合成斜体の和文フォントが利用できる。

% 和文を25%斜体の"HGS創英角ポップ体"にする
\jfontspec{HGSSoeiKakupoptai}[FakeSlant=0.25]

\newjfontfamilyを使って斜体の和文フォントを定義する例を挙げる。

% LuaLaTeX分署; UTF-8
\documentclass[a6paper]{ltjsarticle}
\usepackage{luatexja-fontspec}
% 斜体の"HGS創英角ポップ体"の和文フォント定義
\newjfontfamily{\myPoptai}{HGSSoeiKakupoptai}[FakeSlant=0.25]
\begin{document}
\myPoptai
日本國民は、正義と秩序を基調とする國際平和を誠實に希求し、
國權の發動たる戰爭と、武力による威嚇又は武力の行使は、
國際紛爭を解決する手段としては、永久にこれを放棄する。
\end{document}

f:id:zrbabbler:20200905161448p:plain
出力結果

「フォントをイタリック(\itshape)に変更した場合に和文に合成斜体が適用されるようにしたい」という場合は、ItalicFeaturesというパラメタを使って次のように指定できる。

% ItalicFeaturesの中に書いたパラメタはitshapeの時だけ
% 適用される
\newjfontfamily{\myPoptai}{HGSSoeiKakupoptai}
  [ItalicFeatures={FakeSlant=0.25}]

あるいは、この指定と等価になるAutoFakeSlantというパラメタも用意されている。

% itshapeを合成斜体にする
\newjfontfamily{\myPoptai}{HGSSoeiKakupoptai}[AutoFakeSlant=0.25]

AutoFakeSlantを指定して和文で合成斜体を有効にする例を挙げておく。

% LuaLaTeX分署; UTF-8
\documentclass[a6paper]{ltjsarticle}
\usepackage{luatexja-fontspec}
%↓itshapeを合成斜体にする
\setmainjfont{Harano Aji Mincho}[AutoFakeSlant=0.25]
\setsansjfont{Harano Aji Gothic}[AutoFakeSlant=0.25]
\usepackage{bxjalipsum}
\begin{document}

山路を登りながら、こう考えた。

智に働けば、\textit{ゆきだるま☃。}
情に棹させば、\textit{ゆきだるま☃。}
意地を通せば、\textit{ゆきだるま☃。}
\sffamily
とかくに人の世は、\textit{ゆきだるま☃。}

\end{document}

f:id:zrbabbler:20200905161513p:plain
出力結果

(もしかして続くかも)


  1. デザイン性の高いフォントの中には、元々斜体としてデザインされているものもある。

  2. アッ、さっき言った原則に反しているゾ!