欧文フォントの文字間隔指定

欧文フォントの文字間隔指定

- 土屋 勝 の投稿
返信数: 8
既成フォームに重ねて印刷するため、LuaLaTeXで欧文フォントの文字間隔を指定するにはどうすれば良いのでしょうか。

ドキュメントクラスはjlreqを使い、タイプライター体の欧文英数字文字列の文字間隔を指定したいのですが、方法がわかりません。下のサンプルだと\IDの箇所です。邦文のkanjiskipに相当する命令が無いかと探してみたのですが、見つかりませんでした。

この文字列は5~10文字程度の任意長。CSVファイルからdatatoolパッケージで読み込み、tikzでレイアウトしています。1文字ごとにスペースを挿入する、といった方法は無しで。

\documentclass[a6paper]{jlreq}
\usepackage{luatexja-fontspec}
\usepackage{tikz}
\usepackage{datatool}
\begin{document}
\pagestyle{empty}
\DTLloaddb{data}{sample.csv}
\DTLforeach*{data}{\Name=name,\Kana=kana,\ID=id}{%
\noindent\begin{tikzpicture}
\node (id) at (0,0) {\texttt\ID};
\node [below of =id](name) {\Name};
\node [right of = name, xshift=10mm] (kana) {\Kana};
\end{tikzpicture}
\newpage
}
\end{document}

sample.csv

name,kana,id
山田太郎,ヤマダタロウ,PG12481
中村花子,ナカムラハナコ,AXU310
田中一郎,タナカイチロウ,BOC8D14
土屋 勝 への返信

Re: 欧文フォントの文字間隔指定

- ut の投稿
LuaLaTeX 特有の方法があるのかどうかも、datatool パッケージとの
連携がうまくいくかどうかも分からないのですが、昔ながらの方法で
したら、このようなときには soul パッケージの利用が一般的だった
ような気がします(LuaTeX では的外れでしたら、すいません)。
ut への返信

Re: 欧文フォントの文字間隔指定

- 土屋 勝 の投稿
utさん、ありがとうございます
soulパッケージを入れてみました

\documentclass[a6paper]{jlreq}
\usepackage{luatexja-fontspec}
\usepackage{tikz}
\usepackage{datatool}
\usepackage{soul}
\sodef\cs{}{1em}{1em}{1em}
\begin{document}
\pagestyle{empty}
\DTLloaddb{data}{sample.csv}
\DTLforeach*{data}{\Name=name,\Kana=kana,\ID=id}{%
\noindent\begin{tikzpicture}
\node (id) at (0,0) {\cs\ID};
\node [below of =id](name) {\Name};
\node [right of = name, xshift=10mm] (kana) {\Kana};
\end{tikzpicture}\par\noindent
\cs{ID is}\cs{\ID}
\newpage
}
\end{document}

これをlualatexで処理すると

! Package tikz Error: Giving up on this path. Did you forget a semicolon?.

See the tikz package documentation for explanation.
Type H for immediate help.
...

l.18 }

?
というエラーが出ます。無視してEnterキーを連打するとPDFが出力されますが
1行目の\IDは1em間隔で出力される
4行目の\IDはデフォルトの間隔で出力される
となります。

ソースファイルの12行目を
\node (id) at (0,0) {\cs{\ID}};
と、変数をカッコでくくると大量にエラーが出て、1行目もデフォルト間隔になります
土屋 勝 への返信

Re: 欧文フォントの文字間隔指定

- ut の投稿
実際に試してみることもなく、適当なことを言ってしまって申し訳
ありませんでした(てっきり、LuaTeX じゃないと試せないものと思
い込んでいました)。

どうも、LuaTeX との関係というよりは、tikz と datatool と soul
との連携の問題のようですね…。

datatool のマニュアルを今ザッと見返してみたのですが、うまい
方法は、今のところ見つかっていません…。
ut への返信

Re: 欧文フォントの文字間隔指定

- ut の投稿
理由は分かりませんし、まったくもって場当たり的なのですが:

  \node (id) at (0,0) {\texttt\ID};

のママにして、csv ファイルを:

  name,kana,id
  山田太郎,ヤマダタロウ,\cs{PG12481}
  中村花子,ナカムラハナコ,\cs{AXU310}
  田中一郎,タナカイチロウ,\cs{BOC8D14}

としてみましたら、pLaTeX では一応通りました。
(でも、ID の文字列が左にズレています…)
(\texttt を削るとエラーになります…)

soul を使うというのは、やめたほうがいいのかも知れません(すいません)。
土屋 勝 への返信

Re: 欧文フォントの文字間隔指定

- 北見 けん の投稿
\@tfor を使って一文字ずつ処理する方法をやってみました。

csvファイルを別に作るのは面倒だったので、データは直書きしてあります。

\documentclass[a6paper]{jlreq}
%\usepackage{luatexja-fontspec}
\usepackage{tikz}
%\usepackage{datatool}
\makeatletter
\def\printID{\relax\expandafter\printIDprefix\ID\do{\hbox to 1zw{\hss\IDletter\hss}}}
    %\texttt の処理をごまかすのに \relax が必要みたい・・・よくわかっていません。
\def\printIDprefix{\@tfor\IDletter:=}
\makeatother
\begin{document}
\pagestyle{empty}
%\DTLloaddb{data}{sample.csv}
%\DTLforeach*{data}{\Name=name,\Kana=kana,\ID=id}{%
\def\Name{山田太郎}\def\Kana{ヤマダタロウ}\def\ID{PG12481}{%
\noindent\begin{tikzpicture}
%\node (id) at (0,0) {\texttt\ID};
\node (id) at (0,0) {\texttt\printID};
\node [below of =id](name) {\Name};
\node [right of = name, xshift=10mm] (kana) {\Kana};
\end{tikzpicture}
\newpage
}
\end{document}
北見 けん への返信

Re: 欧文フォントの文字間隔指定

- 土屋 勝 の投稿
北見さん、ありがとうございます
このソースだとlualatexで「1zw」が無効になってしまうので「1\zw」と修正し、csvから読み込むようにしてみました

\documentclass[a6paper]{jlreq}
\usepackage{luatexja-fontspec}
\usepackage{tikz}
\usepackage{datatool}
\makeatletter
\def\printID{\relax\expandafter\printIDprefix\ID\do{\hbox to 1\zw{\hss\IDletter\hss}}}
%\texttt の処理をごまかすのに \relax が必要みたい・・・よくわかっていません。
\def\printIDprefix{\@tfor\IDletter:=}
\makeatother
\begin{document}
\pagestyle{empty}
\DTLloaddb{data}{sample.csv}
\DTLforeach*{data}{\Name=name,\Kana=kana,\ID=id}{%
%\def\Name{山田太郎}\def\Kana{ヤマダタロウ}\def\ID{PG12481}{%
\noindent\begin{tikzpicture}
%\node (id) at (0,0) {\texttt\ID};
\node (id) at (0,0) {\texttt\printID};
\node [below of =id](name) {\Name};
\node [right of = name, xshift=10mm] (kana) {\Kana};
\end{tikzpicture}
\newpage
}
\end{document}

目的の出力が得られました。
土屋 勝 への返信

Re: 欧文フォントの文字間隔指定

- 北見 けん の投稿
うまくいったようでよかったです。
> lualatexで「1zw」が無効になってしまうので「1\zw」と修正し
1zwは単なる例示で、必要な長さに変えてもらう心づもりでした。
TeXの解する単位であれば 7mm でも 0.3in でもなんでもよいのだと思います。
土屋 勝 への返信

Re: 欧文フォントの文字間隔指定

- Z. R. の投稿

LuaLaTeXであれば、fontspecパッケージの機能を使って文字間隔を調整できます。

% LuaLaTeX
\documentclass[a6paper]{jlreq}
%↓これでfontspecも読み込まれる
\usepackage{luatexja-fontspec}
\usepackage{tikz}
\usepackage{datatool}
% letter-spacingを有効にした等幅フォント \IDFont を定義する.
% ※LetterSpace はフォントサイズの百分率で指定する.
% ※\IDFont は宣言型命令(引数無し)であることに注意.
\newfontfamily\IDFont{lmmono10-regular.otf}[LetterSpace=32.5]
\begin{document}
\pagestyle{empty}
\DTLloaddb{data}{sample.csv}
\DTLforeach*{data}{\Name=name,\Kana=kana,\ID=id}{%
\noindent\begin{tikzpicture}
%↓例えばこんな枠が置かれていたとする
\draw[shift={(0.06,-0.19)}] (0,0) grid[step={(0.3,0.4)}] (2.1,0.4);
%↓先に定義した \IDFont を使う
\node [right] (id) at (0,0) {\IDFont \ID};
\node [below of =id](name) {\Name};
\node [right of = name, xshift=10mm] (kana) {\Kana};
\end{tikzpicture}
\newpage
}
\end{document}