既成フォームに重ねて印刷するため、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
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行目もデフォルト間隔になります
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行目もデフォルト間隔になります
理由は分かりませんし、まったくもって場当たり的なのですが:
\node (id) at (0,0) {\texttt\ID};
のママにして、csv ファイルを:
name,kana,id
山田太郎,ヤマダタロウ,\cs{PG12481}
中村花子,ナカムラハナコ,\cs{AXU310}
田中一郎,タナカイチロウ,\cs{BOC8D14}
としてみましたら、pLaTeX では一応通りました。
(でも、ID の文字列が左にズレています…)
(\texttt を削るとエラーになります…)
soul を使うというのは、やめたほうがいいのかも知れません(すいません)。
\node (id) at (0,0) {\texttt\ID};
のママにして、csv ファイルを:
name,kana,id
山田太郎,ヤマダタロウ,\cs{PG12481}
中村花子,ナカムラハナコ,\cs{AXU310}
田中一郎,タナカイチロウ,\cs{BOC8D14}
としてみましたら、pLaTeX では一応通りました。
(でも、ID の文字列が左にズレています…)
(\texttt を削るとエラーになります…)
soul を使うというのは、やめたほうがいいのかも知れません(すいません)。
\@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}
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}
北見さん、ありがとうございます
このソースだと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}
目的の出力が得られました。
このソースだと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}
目的の出力が得られました。
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}