2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SATySFiで年賀状宛名印刷する話

Last updated at Posted at 2022-12-11

これは「SATySFi Advent Caleandar 2022」の12日目の記事です。

今年も暮れが押し迫ってきて、新年を迎える準備に忙しい時候になりました。というわけで「年賀状の宛名印刷のためのSATySFi文書クラス」というネタをつくってみました:smiley:

ネタ注意の話

年賀状の宛名印刷というと何やら実用的な話にも聞こえますが、この記事は基本的にネタ話です。

葉書の宛名は縦書きするのが普通ですが、実は現状のSATySFiはまだ縦組をサポートしていません。縦組のサポートがないところで無理やり縦組をしようとしてもおおよそマトモな出力は得られません。

とはいっても「葉書の宛名程度であればマトモな出力なんて不要で、字が読めさえすれば十分だ:neutral_face:」という考えもあるでしょう。そういう人にとっては、もしかしたら実用性もチョットあるのかもしれません。

使用例を紹介する話

以下の場所から年賀状宛名印刷のための​「addrite パッケージ」​を入手できます。ファイルaddrite.satyhだけ用意すれば十分です。

addriteパッケージはライブラリルートにインストールして使うこともできますが、パッケージの性質を考えて(ネタなので)ここではパッケージファイルを文書ファイルと同じディレクトリに置くことにします。このため文書ソース中ではaddrite@importで読み込んでいます。

addriteを使った文書のソースコードの例を挙げます。

addrite-sample.saty
@import: addrite
open Addrite
in

document '<
  +address-from(`1234567`){
    \tate((3.2cm,8.0cm))[top](10pt)(`東京都羅轍区照府(82)-(3)-(14)`);
    \tate((2.7cm,3.0cm))[bottom](10pt)(`照府ヒルズ(1519)号室`);
    \tate((1.5cm,7.4cm))[top; spread 4.4cm](18pt)(`独 歌  紡 志`);
  }
> '<
  +address-to(`4703389`){
    \tate((9.0cm,12.2cm))[top](15pt)(`愛知県南セントレア市北カエリア区`);
    \tate((8.2cm,3.0cm))[bottom](15pt)(`西アヴィエリア(32)-(512)-(8)`);
    \tate((6.0cm,11.4cm))[top; spread 8.4cm](32pt)(`幸 主  扶 愛  様`);
  }
>

この文書ソースファイルaddrite-sample.satyとパッケージファイルaddrite.satyh同じディレクトリに置いて以下のコマンドを実行します。

satysfi addrite-sample.saty

すると以下のような出力が得られます。

addrite-sample.png

使い方を説明する話

ここではaddriteの機能の一部を大まかに紹介します。仕様の詳細については説明書を参照してください。

全体構成

addrite-sample.saty
@import: addrite
open Addrite
in

document ?:[
  «設定項目»; ……
] '<
  +address-from(`«差出人郵便番号»`){
    «差出人住所内容»
  }
> '<
  +address-to(`«宛先人1郵便番号»`){
    «宛先人1住所内容»
  }
  +address-to(`«宛先人1郵便番号»`){
    «宛先人2住所内容»
  }
  ……(任意件数記述可能)
>

addriteパッケージの機能はAddriteというモジュールの形で提供されます。通常はAddriteをopenすることが想定されています。

document函数のオプション引数(?:[«設定項目»;…])には設定項目のリストを指定します。例えば、郵便番号出力のフォントをlmmono(Latin Modern Mono)に変更したい場合は以下のように書きます。

document ?:[postal-code-font (`lmmono`, 1.0, 0.0)] ……

また、上級者用の機能ですが、update-contextで全体出力のテキスト処理文脈に比較的自由に更新を加えることができます。例えば「和文のフォントをipaexg(IPAゴシック)に変更する」という設定は以下のコード1で実現できます。

document ?:[
  update-context (set-font HanIdeographic (`ipaexg`, 1.0, 0.0));
  update-context (set-font Kana (`ipaexg`, 1.0, 0.0));
] ……

documentの最初の必須引数には差出人の情報を記述したブロックテキストを指定します。このブロックテキストは高々1個の+address-fromコマンドのみを含められます。+address-fromコマンドで記述した差出人の情報は全てのページ(宛名面印刷)に出力されます。

documentの2番目の必須引数には宛先人の情報を記述したブロックテキストを指定します。このブロックテキストは0個以上の+address-toコマンドのみを含められます。1つの+address-toコマンドが1件の宛名人の情報を表し、個別のページ(宛名面印刷)に出力されます。

+address-fromおよび+address-toコマンドの第1引数には郵便番号を文字列で指定します。この文字列は1234567のように7桁の数字からなる必要があります。ただし123-4567のようにハイフンを含めてもかまいません(出力は変わりません)。もし空欄にしたい場合は123____のように_を書きます。

テキスト配置コマンド

+address-fromおよび+address-toコマンドの第2引数は住所を記述するためのインラインブロックで、ここにはテキスト配置コマンドを記述します。テキスト配置コマンドには以下のものがあります2

% 縦組用
\tate(«出力位置»)[«オプション»;…](«フォントサイズ»)(`«文字列»`);
% 横組用
\yoko(«出力位置»)[«オプション»;…](«フォントサイズ»)(`«文字列»`);
\yoko-text(«出力位置»)[«オプション»;…](«フォントサイズ»){«テキスト»}

出力位置については、例えば

\tate((6cm,5cm))[top](10pt)(`文字列`);

であれば、「文字列」を縦組で出力したもの(矩形領域)をその上端が (6cm, 5cm) の位置に来るように出力されます3。ここで座標は「左下を原点としてx座標が右向き、y座標が上向き」と定められています。

テキスト配置コマンドの第2引数にはオプションのリストを指定します(この引数自体はオプション引数ではないことに注意)。オプションに指定できる値には以下のもの(抜粋)があります。

  • center(中央)、top(上)、bottom(下)、left(左)、right(右) などのアンカー位置を指定するためのもの。なお、アンカー位置の既定値はcenter
  • spread «長さ»で、全体が指定の長さになるように均等割付することを指示する。均等割付は入力文字列中の「ASCII空白文字で入る空き4」を伸縮することで実現される。例えば独␣歌␣␣紡␣志の入力では“歌”と“紡”の間の空きはその他の文字間の空きの2倍になる。
    spreadは縦組のテキスト配置コマンド(\tate)でのみ使用可能。

縦組の5テキスト配置コマンド(\tate)の入力文字列中では()の文字が特別な意味をもち、()で囲まれた部分が縦中横で出力されます。その他の部分の文字は和文・欧文問わず正立の向きで出力されます。

まとめ

やっぱり、早くSATySFIの縦組機能が実現されてほしいですね!:smiley:

  1. HanIdeographic(漢字)とKana(仮名)の両方の用字系についてフォントを設定する必要があります。

  2. 実は縦組のテキスト配置コマンドにはもう1つ、\tate-segmentsという(隠し?)コマンドもあったりします。

  3. つまりtopアンカーの位置を示します。指定座標からみた「文字のある方向」は正反対の方向(topなら下、leftなら右)になることに注意してください。

  4. spreadを指定しない場合は、「ASCII空白文字で入る空き」の量は半角になります。ただしこの量は設定項目のspace-sizeで変更できます。

  5. \yokoコマンドの入力文字列は単純にSATySFiの仕様に従って(embed-stringにより)インラインテキストに変換された後に出力します。\yoko-textの入力のテキストはSATySFiの仕様に従って組まれます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?