2016/12/30

2017年賀状

年賀状書いた。

%!PS
<< /PageSize [285 420] >> setpagedevice

/setrandcolor {% def
    /r1 {rand 5 mod 3 div} def
    /r2 {rand 4 mod 4 div} def
    /r3 {rand 3 mod 4 div} def
    r1 r2 r3 setrgbcolor
} def

/f {% def
    dup dup dup
    4 mod 0 eq {(2) 4 1 roll -1 0 rmoveto} if 
    4 mod 1 eq {(0) 3 1 roll -3 0 rmoveto} if 
    4 mod 2 eq {(1) 2 1 roll -3 0 rmoveto} if 
    4 mod 3 eq {(7 ) -5 0 rmoveto} if
} def

/i 4 def

/lineto-chars { % def
  /ex x def /ey y def
  /y exch def /x exch def
  /d x ex sub dup mul y ey sub dup mul add sqrt def
  /R y ey sub x ex sub atan def
  R rotate
  { d 0 le % ifelse
    { exit }
    { setrandcolor 
      /ra rand 5 mod 3 div 10 mul 22 add def
      /Georgia-Bold findfont
      [25 0 0 ra 0 0] makefont setfont
      i f show
      /i i 1 add def
      /d d 7 sub def }
  ifelse
  } loop
  0 R sub rotate
} def

1 1 20 { % for
  /n exch def

  newpath
  0 0 moveto
  135  45 moveto
   85 140
  110 165
  110 130 curveto
  0 0 moveto
  150 130 moveto
  155 190
  210 140
  130  40 curveto
  flattenpath
  {/y exch def /x exch def}{lineto-chars}{}{} pathforall
  gsave
  
  32 230 moveto
  0.9 0.1 0.2 setrgbcolor
  /Georgia-Bold findfont [90 0 0 100 0 0] makefont setfont
  (2017) show
  
  grestore
  showpage
} for

2017 by Keiichiro Shikano on Scribd

PSの解説でよく登場する、パスに沿った文字列描画の簡易版です。 まずflattenpathしてカレントパスをlinetoの配列に変換したあと、各linetoが描く直線がX軸になるまで回転→linetoの長さまで数字を順番に書く→回転を戻す、を繰り返しています。 どのへんが簡易版かというと、グリフを書き終わったポイントは当然ながらオリジナルのパスからはずれているのだけど、そこへ戻す処理をさぼっています。そのため、ベースになるパス(ハート型)よりも文字列の描く図形のほうが肥大していく、それもフォントや処理系によってずれ幅がけっこう違ってしまう、という緩い仕様です。 このコードはWindowsのDistillerに合わせてあります。 gsだと、なぜかずれがもう一回り大きい。

過去のやつ。

2016/12/24

JSONをTeXで組版する

昨今、ドキュメント技術の主戦場といったらウェブです(ワールドワイドなほう)。 ウェブ上ではさまざまな構造化テキストが飛び交っています。 まっさきに思いつくのは、HTMLをはじめとする、ブラウザがネイティブにレンダリングできる構造化テキストでしょう。

しかしブラウザにはJavaScriptという強力なプログラミング言語の実装が組み込まれているので、HTML以外の構造化テキストをサーバから取得して整形する場合も少なくありません。 そのようなデータ形式のひとつにJSONがあります。

最近のWebサービスでは、サーバからHTMLを送らずにJSONデータだけを送り、ブラウザがそれをJavaScriptで解析して画面表示をすべて動的に作っている場合もあるようです。 この場合にブラウザがやっていることは、ある種の自動組版だといえるでしょう。 そもそもブラウザによるHTMLのレンダリング自体が自動組版だという見方もできますが、それよりさらに抽象化した、JSONを原稿とする自動組版という考え方です。 必ずしもページ全体をJSONから表示していなくても、たとえばJSONデータから表を生成してdiv要素に差し込むといった局所的な組版もありえると思います。

ブラウザとJavaScriptでできることがTeXでできないはずがない

というわけで、TeXでJSON組版をしてみました。 題材としては、CTANの各パッケージのJSONクエリとかも考えたのですが、残念ながらCTANではパッケージの詳細説明の項目にプレーンテキストではなくHTMLが直書きされている場合があるようです。 TeXで扱うのにHTMLタグは邪魔でしかありません。 まさかCTANともあろうものが、TeXでJSONデータを利用することを考えていなかったなんて。

それに、どうせならもっとクリスマスらしい題材にしたいところです。 クリスマスといえばホワイトクリスマス、ホワイトクリスマスといえば雪だるま。雪だるまを組版するなら天気予報でしょう。 OpenWeatherMapという会社のサイトで天気予報をはじめとする気象データをJSONにより取得できるので、これを組版していきましょう。

天気予報JSONデータの取得

まずはデータの取得です。TeXからHTTPリクエストを発行する汎用の手法はないので、cURLでもwgetでも好きなものを使ってください。 OpenWeatherMapでサインアップしてAPPIDを手に入れれば、たとえば下記のようなURLによって、東京の5日後までの3時間おき予報データが取得できます。

http://api.openweathermap.org/data/2.5/forecast?q=Tokyo,jp&APPID=0000000000000
参考までに、取得できるのはこんな形のJSONデータです。
{"city":{
  "id":1850147,
  "name":"Tokyo",
  "coord":{"lon":139.691711,"lat":35.689499},
  "country":"JP",
  "population":0,
  "sys":{"population":0}},
 "cod":"200",
 "message":0.0103,
 "cnt":37,
 "list":[
    {"dt":1482483600,
     "main":
       {"temp":9.94,
        "temp_min":8.84,
        "temp_max":9.94,
        "pressure":1015.88,
        "sea_level":1017.11,
        "grnd_level":1015.88,
        "humidity":71,"temp_kf":1.1},
     "weather":[
       {"id":802,
        "main":"Clouds",
        "description":"scattered clouds",
        "icon":"03n"}],
     "clouds":{"all":36},
     "wind":{"speed":6.71,"deg":318.003},
     "rain":{},
     "sys":{"pod":"n"},
     "dt_txt":"2016-12-23 09:00:00"},
     ...

JSONデータのTeXによるパーズ

JSONデータを取得できたら、パーズします。JSONを読むパッケージが見当たらなかったので、ざっくり再帰下降パーザを書きました。TeXは関数型言語なので、素直に書けますね。

公開APIは以下の3つ。

\readJson #1 #2
第一引数に渡したコントロールシーケンスに、第二引数に渡したJSONデータが格納される
\readJsonValueById #1 #2 #3
第一引数に渡したコントロールシーケンスに、第二引数に渡したJSONデータの、第三引数の名前に対応する値が格納される
\showJsonValueById #1 #2
第一引数に渡したJSONデータの、第二引数の名前に対応する値が入力に残る

ちょっと例を見てみましょう。青字になっているのがJSONデータです。

\documentclass{article}
\usepackage{jsonlite}

\begin{document}

\readJson{\json}{{"id":[1,2,3], "class":"foo", "data":{"id":"456"}, "info":"Is this a text?"}}
\readJsonValueById{\jsonId}{\json}{"id"}     %=> expl3 sequence
\readJsonValueById{\jsonData}{\json}{"data"} %=> id:456

\readJson{\jsonJsonData}{{\jsonData}}
\showJsonValueById{\jsonJsonData}{"id"}      %=> 456

\end{document}

天気予報JSONデータを表組する

OpenWeatherMap社から提供される天気予報JSONデータから、都市名、予報の時刻、予想天気、予想気温を取ってきて、LaTeXの表として組みましょう。 各時刻の予報は、"list"という名前の配列の各要素になっているようです。 この配列に対するmapで、表の各行を整形するという戦略にします。 実はjsonliteパッケージではJSONの配列をexpl3のシーケンスとして保持するので、シーケンス用のmapが使えます。

\NewDocumentCommand{\showForecast}{ m }{%
  \begin{longtable}{ l | c | r}
    日時 & 空模様 & 気温 \\\hline
    \endfirsthead
    日時 & 空模様 & 気温 \\\hline
    \endhead
    \seq_map_function:cN #1 \format_forecast:n
  \end{longtable}
}

TeX言語のくせにシーケンスとかmapとか、お前はなにを言ってるのだ、という感じかもしれませんが、2016年にもなればそういうものなんです。 そもそもTeXは関数型言語なのだからシーケンスに対するmapくらいできないはずがありません。

あとは、\format_forecast:nを書いていくだけなんですが、 OpenWeatherMap社のデータで"weather"がさらに配列になっていたりして無駄にめんどくさいので解説は省略します。 jsonliteパッケージと同じディレクトリに完全なコードを置いてあるので参考にしてください。

天気記号のサポート数がそこそこあるDejaVuSansを使いたかったので、XeLaTeXで実行してみた結果がこれです。DejaVuSansの☃はどことなく品がいいですね。

ところで、Brzozie(ブジョジェ)という地名がどこなのか気になった人がいるかもしれません。ブジョジェはポーランドの湖水地方で、バホテク湖があるところです。来年のTUG2017は、このバホテク湖で毎年開催されているBachoTeXというイベントと合同で5月に開催されることになっています。なんとか参加するぞ。

そしてこの記事は、第五回となるTeX&LaTeXアドベントカレンダーの24日めの記事です。 昨日はアセトアミノフェンさん(この記事を見てDejaVuSansを使うことを思いつきました)、明日の最終日はZRさんです。

2016/12/03

独立系出版社をやるという覚悟について

カナダ最大の都市であるトロントから北に向かって1時間ちょっと、荒野だか畑だか牧場だかよくわからない広大な土地を走り抜けたところに、エリンという小さな村があります。 19世紀に開拓された当時からメインストリートであったと思われる道が、川の蛇行している部分を堰き止めるように貫いていて、その両脇だけで主な商圏が形成されているような素朴な村です。

そんな小さな村に、なんと出版社があります。 その名もThe Porcupine’s Quill。 直訳すると「ヤマアラシの針」ですね。 言うまでもなく独立系の出版社で、大手からは陽の目を見るのが難しいカナダ発の文学者やアーティストの作品を手掛けているようです。

今年の7月、この《ヤマアラシの針出版》を訪問する機会がありました。 世界中のTeX関係者が集まるTUGという会合があるんですが、2016年の開催地がトロントで、その一環として《ヤマアラシの針出版》の見学会が組まれていたのです。 トロントからエリン村まで農道(もしくは牧道)を延々とかっ飛ばし、パン屋さんの前でマイクロバスを降りると、その何軒か隣の靴屋みたいな建物が《ヤマアラシの針出版》の本社でした。

SDIM0346

こんなカナダのど田舎に本社を構えているというだけで十分に話として面白いんですが、この出版社、他の多くの出版社と違って、印刷から製本まで本づくりのすべてを自前でやっています。 それも、ドイツ製のオフセット印刷機やら製本機やらを社内に一式すべて用意し、経営者であるティムさんと奥さんのエルクさんが手作業で本を作っているのです。 ちなみに、やや出来過ぎ感がありますが、お二人の姓は「インクスター」さんといいます。

これが、さっきの建物の地下にあるHeidelberg Kordというオフセット印刷機。とてもよく手入れされていて、油でてかてかしています。インクが香ばしい。

SDIM0336

こちらは建物の1階に実装されている、本をかがるための機械。ファンシーな窓の鎧戸と陽光のせいで博物館の展示物っぽいけど、むちゃくちゃ軽快に稼働します。

SDIM0333

正直なところ、訪問前にはそれほど大きな期待はしていませんでした。 自分とは畑違いの文芸系の出版社っぽいし、そもそも出版社の仕事なんてどこも大差ありません。

しかし実際に《ヤマアラシの針出版》でティムさんから「どういう考えで本を企画し、作り、それを売ってきたか」を語ってもらい、ビンテージな機械が力学を駆使して本を作り上げるようすを目の当たりにすると、いちいち唸りっぱなしでした。 出版社っていうのは、こんなふうに本を作って売るっていう仕事であり、その骨格がまさにいま自分の目の前に展開されてるんだなと。

  • 出版社の仕事なんて、確かにどこも大差ないけれど、誠実にやっていくと結局は「モノづくり」になるんだよなという気持ち。
  • 電子書籍もいいけど、モノとしての物理は単純に強いなという気持ち。
  • 年間ノルマで本の形を整えなくても、こんなふうに、やりたい人がやりたいように出版をやれるのが健全だよなという気持ち。
  • ぼくも、完全に同じやり方ではないかもだけど、こんなふうにして本にかかわっていくぞという気持ち。

なにをかくそう、ぼくも自分で出版をやりたいと思って、昨年2015年の12月1日にラムダノート株式会社という会社を作りました。 今年2016年の7月にThe Porcupine’s Quillを訪問して、自分が仕事としてやりたいことは「本を作って買ってもらうこと」なんだなと再確認しました。 来年2017年の2月ころには、最初のタイトルとして、TLSの関連書を発行する予定です。 年が明けてしばらくしたら直販サイトで予約できるようにする予定(予定)なので、ご期待ください。

そういえば、この最初のタイトルは翻訳ものなんですが、原書を発行しているロンドンの出版社もやっぱり独立系出版社でした。 そっちもそっちで4月に訪問してたくさん刺激を受けたので、翻訳発行後にあらためてどこかで話ができればいいなと思います。

なお、この記事はラムダノート株式会社の設立にあたって出資して頂いた株式会社時雨堂の社長になんか書けといわれ、pyspaアドベントカレンダー2016のエントリーとして書きました。pyspaには脱サラする直前からずっと癒されてきました。でも、昨日はイアンさん、明日はモリヨシさんだし、あきらかに場違いな記事だろこれ。