いものやま。

雑多な知識の寄せ集め

未踏ジュニア2019年度最終成果報告会に行ってみた。

f:id:yamaimo0625:20191023151952j:plain

10/22(祝)に未踏ジュニアの最終成果報告会に行ってきた。

この発表がどれも面白かったので、軽く紹介と感想など。

未踏ジュニアとは

IPAでは独創的なアイディアを持った人材をサポートするために未踏事業というのを行っている。

ただ、これだと競争が厳しくて小中高生ではなかなか採択されないので、17才以下の小中高生(+高専生)を対象として生まれたのが未踏ジュニア。

けど、昨日の発表を見ると、普通の大学での研究や企業でのプロジェクトにも引けを取らないような発表もあったりと、とてもレベルが高いと思った。
こういった小中高生がいるのはすごく希望がある。
ぜひとも、潰されることなく(出る杭は叩かれやすい・・・)、このまま成果を出し続けていって欲しいと思った。

以下はそれぞれの発表の概要と、自分の感想。

渡部さん「バトンマスター」

陸上部で、リレーのバトンパスを上手くできるようになりたいということから、バトンパスを計測するバトンマスターを作った。
バトンにM5Stackが入っていて、3軸の加速度データからバトンパスの様子を可視化できる。
普通のシステムだとお高いけど、これなら安くできる。

***

M5Stackで万歩計を作ってる人はIoTLTで見たけど、こういうことも出来るのかぁ、と感心した。
自身が陸上部だからこその視点と思った。
そしてそれをちゃんと物として作り上げる実現力は見事。

なお、距離を求めるのに、加速度の様子から何歩進んだのかを検出して歩幅と掛け合わせていたんだけど、加速度を積分していけば距離にならないものかなと思って質問してみた。
回答は、バトンの向きが変わってしまうので難しいのと、センサの誤差があるので正確な値を得るのが難しいとのこと。

誤差は確かにそうかも。
計測の間隔に限界があるから。
ただ、バトンの向きに関しては角速度を積分すればバトンの姿勢が分かりそうな気もした。

行方さん「Edge-guided Anime Characters Generation」

なかなか上手に絵が書けないので、深層学習による画像生成で描きかけの絵から完成した絵を作るシステムを作った。
線を引くたびに予測されるキャラクターの画像が生成され表示される。

***

デモがとても面白かった。
そして、深層学習を普通に使いこなしてるとか凄い・・・
ライブラリなどを使えばいろいろ作れるんだから、凄い時代になったもんだなぁと思う。

一つ気になったのは、再現性。
お絵かきで一枚絵を描いて終わりということは少ないと思っていて、同じキャラで別ポーズをさせたり、あるいはマンガにしたりすると思うのだけど、このシステムの場合、そういった再現性を持たせて絵を書くのが非常に難しそうな気はした。
絵の練習にはとてもいいと思うんだけど。

武田さん「編模様(あもーよ)」

イラスト手編み支援アプリを作った。
編集モードと編みモードで切り替わって、編みモードだと今編んでいる段が分かりやすく表示される。
最初Scratchで作ったものをUnityへ移植したとのこと。

***

身近なところにあった題材に対してとても素晴らしい解決策を提供していてとてもよかった。
発表にもその優しい雰囲気が滲み出てた。
使う人の気持ちを考えられるのはプロダクトオーナーとして非常に重要なので、とても素晴らしいと思う。

気になることとしては、優しすぎること。
こういう出来るいい人は使い潰されやすいので、潰されないで欲しい。
ホントに。
技術的にではなく、リソース的にできるかどうかも気にかけるといいと思う。

岸本さん「fresh capsule

家事の負担を減らしたいということで、賞味期限を管理できるアプリを作った。
以前作ったこともあって、そのときは手動で賞味期限を入力するのが大変だったので、OCRを使うようにした。

***

発表を聞いて最初に気になったのが、賞味期限管理アプリって既存でいいものないのかなぁということ。
実際、その場で調べてみたら、予想通りいろいろあった。
けど、意外にも賞味期限をカメラで読み取って入力するアプリはないみたい。

以前のふりかえりから改善点を見つけて新しい開発に進めているのがとてもいい。

気になったこととしては、登録もそうだけど、使ったときに印をつけておかないと不要な通知が飛んできそうだよなぁ、というのがある。
そうなると、使うたびに操作が必要で、それも面倒そう・・・
パッといいアイディアが浮かばなので、けっこう難しい問題なのかもしれない。

迫田さん「neulot-生体信号を用いたモーションキャプチャシステム」

SAOみたいなフルダイブを実現したくて、その第一歩として脳波、筋電位を使ってデバイスを操作するシステムを作った。
筋電位を使った義手操作はALTsさんで採択された。
脳波については、従来のものはタイムラグが大きかったので、運動準備電位を使うことにした。
プログラミングの問題でタイムラグはあまり小さく出来なかったけど、プログラムを改善させればタイムラグを小さく出来るはず。

***

今回の発表の中で自分が一番驚いた発表。
やってることが普通に大学の研究室とかでやられていること。
実際、筋電位のシステムについては企業で採択とかもされてるみたいだし。
凄い。

そして、運動準備電位とかよく知ってるなぁ、と思った。
自分は前野先生の受動意識仮説の本でリベットの実験のことを読んでたから知ってたけど、普通は知らないよなぁ・・・

脳はなぜ「心」を作ったのか「私」の謎を解く受動意識仮説 (ちくま文庫)

脳はなぜ「心」を作ったのか「私」の謎を解く受動意識仮説 (ちくま文庫)

そして、今回はアウトプット側の話だったので、インプット側についても何か考えているのかを質問してみた。
今のところ考えてないようだけど、そういった研究があることは知っていたようなので、ぜひともインプット側についても考えてみて欲しいと思った。

というのは、『現れる存在』によれば、知覚→探究がサイクルとして回っていると指摘されているから。

現れる存在―脳と身体と世界の再統合

現れる存在―脳と身体と世界の再統合

われわれは、「瓶の感触」を得るのを受動的な感覚の働きと考えがちだが、これは断片的な知覚がさらなる探究を導くという、行為を含んだサイクルとして理解した方がいい。
この行為を含むサイクルが、瓶全体を知覚するという経験の基礎にある。
このラディカルな見解においては、接触は探索の道具としてあちらこちらに向けて放たれ、周囲の環境を何度となく探っている。
(『現れる存在』アンディ・クラーク 著、より引用)

アウトプットだけだと、実はアウトプットが迷子になってしまうことが考えられる。
インプットからのフィードバックによって次のアウトプットの方向性が定まり、そのループによる統合によって全体に知覚が及ぶ。
フルダイブのような仕組みを実現したいなら、このフィードバックについて考えるのは必須になってくると思う。

余談だけど、『現れる存在』はこれ以外にもいろいろ面白いことが書かれているので、ぜひとも読んで欲しいと思った。
身体性認知科学というジャンルになるっぽいのだけど、哲学、科学の混じり合う最先端なので、とても参考になると思う。

小野村さん、上念さん、石崎さん「ManageStock - 家庭向け在庫管理アプリ」

消耗品がなくなるのを防ぎたいので、簡単に在庫管理する仕組みを作った。
ドアセンサで箱の開閉をチェックするシステム、重量計でチェックするシステム、単にボタンだけのシステムをそれぞれ作ってみた。
それぞれ一長一短あったので、使い分けるとよさそう。
また、これをウェブアプリで管理するようにした。

***

ちょっとした仕組みだけど、これがあるだけでだいぶ便利そうだと思った。
以前、会社で消耗品(ノートとか付箋とか)持ち出すときに、ノートに誰が何個持っていったというのを記録するルールがあったのだけど(実質機能してなかった)、なんかそれを思い出してちょっと悲しくなった。
IoTやってますって言ってる会社がそれって、どうなんだろう・・・
評価ボードが行方不明になったりとかもあって、なんというか、ねぇ・・・中高生に負けてるよ・・・

高山さん「DetExploit - WindowsOSS脆弱性スキャナー」

アンチウィルスではなく、感染する原因をチェックして減らす仕組みを作った。
サーバからクライアントに指示を送ってスキャンを開始、情報を収集できるので、管理が簡単。
OSSで公開している。

***

話だけ聞くと、普通に企業が有料ソフト使ってやってることなのかなぁ、という感じ。
JP1とか、ウィルスバスター・コーポレートエディションとか。

割と不思議に思ったのが、どうしてこれをやろうと思ったのかなということ。
発表に使ってるPCはMacだったし(作ったシステムはWindows専用)、サーバ管理とかやる立場になることもないだろうし。

あと、入ってるソフトをチェックするためにレジストリを覗いたり外部と通信してそのデータを送ったりするのは、マルウェアの動きなので、下手すると他のアンチウィルスソフトに弾かれそうなのが気になった。
そうすると、ホワイトリストに入れてもらったりする必要があるんよね・・・

和泉田さん「Tea - 仮想経済シミュレーションプラットフォーム」

Discordというゲーム向けのチャットアプリを使って、経済シミュレーションゲームのプラットフォームを作った。
アイテムを生産したり加工して売り買いしたり出来る。
いろいろな拡張が考えられて、これをゲーム寄りにしていくのか、シミュレーション寄りにしていくのかは考え中。

***

ゲーム内での経済は自分も一時期興味を持っていたので、二つほど質問してみた。
一つは、経済では時間が重要な要素としてあるけど、それについてはどうなっているのか。
もう一つは、ゲーム内の経済はインフレしやすいように思うのだけど、それについては何か対策しているのか。

まず、一つ目については、アイテム生成に時間がかかるようになっているとのこと。
二つ目については、インフレしたらそれはそれで面白そうという回答w

一つ目の質問の背景を少し説明しておくと、強化学習で割引率というのを考える通り、経済だと「早く手に入る」ということの価値が重要だったりするから。
銀行の利子についても割引率から考えることが出来たりする。
あるいは、インフレによって貨幣価値が下がっていくという面もあったり。

以下の記事も参照:

二つ目については、メンターの方もコメントで補足していた通り、ゲーム内だと資産が減らないというのが大きい。

『21世紀の貨幣論』では、貨幣とは譲渡可能な債権であるという見方が示されている。

この考え方を使えば、流通しているお金の総量は社会に対する各個人の貸しの総量になっていて、生産すればするほど増え、消費されればされるほど減っていくことになる。
けど、ここで消費しても物自体がなくならないと、貸しが減らないことになる。
なので、どんどん貸しの量が増えていき、結果としてインフレが起こる。
(そして新規が入って来れなくなる)

なので、ゲゼルの唱えた「減価する貨幣」とかの実験がここで出来れば面白そうだなぁと思った。

松田さん「Mallet - 簡単なアプリを作れるモバイル端末用の開発環境」

スマホ/タブレットだけで簡単なアプリを作れるようにした。
ビジュアルプログラミング言語を使う。(テキスト編集も可能)
将来的にはマルチプラットフォームにする予定。

***

メンターの方が言うには、アプリを作れるようにするというから言語を作るのかと思ったら、言語はもう作ったのでそれを使えるプラットフォームを作るとのことで、もうこの時点で強い。
デモもやっていて、実際簡単に作れるようなので凄かった。

ただ、今やるならiOSネイティブで作らないでUnityを使うなりJavaScriptを使ったウェブアプリにしそうなもので、質問してみた。
まぁ、自分もSwift使いたくて(というかAndroid嫌いで)iOSネイティブアプリ作ったので、人のこと言えないのだけど(^^;

あまり明確な回答はもらえなかったのだけど、今やるなら絶対マルチプラットフォームにした方がいいと思う。
使えない人がいるというだけで価値が下がってしまうので。

平川さん「SmartVJ - 参加型の新しいメディアアート

スマホで映像や音を操ってみんなで作品を作るシステムを作った。
QRを読めば使えて、スマホを傾けたり回したりすることでエフェクターをかけたり出来る。

***

まさにIoTという感じで、IoTLTとかでも発表されそうな内容。
よく出来てるし、何よりオシャレでいいw
センスがあるw

竹内先生も質問してたけど、複数人でコラボしたときはいろいろ工夫が必要そうで、逆にそこにいろいろ可能性を感じた。
具体的なアルゴリズムは難しいけど、ハンドベルで一曲作るように、このシステムでみんなで協力して曲を作れても面白そう。

浅野さん「abecobe - シンプルかつ難しいパズルゲーム」

abecobeというスマホのパズルゲームを作った。
片方のキャラを動かすと反対のキャラは点対象の方向に動く。
それで両方をゴールに持っていく。
どうすればより面白くなるかを考えて、共感が重要だと思い、そこに注力した。

abecobe

abecobe

  • Atsushi Asano
  • ゲーム
  • 無料

***

質問タイムで、ダウンロードして実際に遊んで楽しかったと感想を伝えた人がたくさんいたw
自分も少し触ってみたけど、キャラが可愛いしパズルもなかなか面白い。

パッと浮かんだのがハイパーロボットだったので、時間制限による対戦とかは考えなかったのか質問してみた。
すると、対戦モードは試してみたけど、ゆったりプレイして欲しいかったのであえてなくしたとのこと。
作品に対する明確なポリシーを持ってて素晴らしい!

糸井さん「pirka - 会話を通して成長する人工知能技術」

話していると学習して自分に似てくるボット(人工無脳)を作った。
ユーザの言葉遣いを学習したり、単語に割り当てる感情のパラメータをユーザに合わせて学習するようにした。

***

まず思い浮かんだのは、『恋するプログラム Rubyでつくる人工無脳』。

でも、RubyではなくPythonを使っていたようなので、やっぱり時代はPythonなんだなぁとちょっと寂しくなった。

自然言語に興味があるということでそれに関した質問をしたい気持ちはあったけど、さすがにちょっと難しいので、pirka(ピリカ)という名前の由来を質問してみた。
これは、アイヌ語で「美しい」という意味とのこと。
エトピリカという鳥は美しいクチバシという意味なんだとか。

ちなみに、質問したかったのはソシュールレヴィ=ストロースは知っているのかなということ。
言語で単語をどう分けるかは恣意的で、文化による部分が大きかったりする。
(例えば日本語だと「水」と「お湯」という単語があるけど、英語だとどちらも「water」とか)
もし知らなかったら、ソシュール言語学構造主義の本は面白いので読んでみて欲しいと思った。

國武さん、森さん「VirtualPresents - VR空間をデザインする」

VR空間(VRChat)でWebサービスを提供するシステムを作った。
VR内でQRコードを見ると、そこからWebサービスと連携して画像をアップロード出来たりする。

***

VRについてはよく知らないけど、なんか凄いなという感じ。
VR内に発表会場も作ってたみたいだし。


と、めっちゃ長くなったけど、どの発表も面白かった。
あとで動画もアップロードされるようなので、興味のある人は見てみるといいと思う。

今日はここまで!

ラジオ体操のススメ。

f:id:yamaimo0625:20191016140412p:plain

最近、朝起きてラジオ体操をしているのだけど、これがいい感じだったのでオススメしたい。

ラジオ体操、なめてない?

ラジオ体操といえば、誰もが子どもの頃にやったことがあるはず。
そして「ダルいなぁ〜」とか「こんなの運動にもならないよ」と思いながら渋々やっていた人も多いと思う。

けどね、大人になった今なら分かる。

ラジオ体操、なめたらアカン。

これ、鈍った体にはメチャクチャ効く・・・

子どもの頃には「こんなのちょいと体動かしてるだけで運動でもなんでもない」と思ってたけど、大人になってやってみると体のいろんな部分を動かし伸ばしているのが身に染みて分かる。。。
正直ビックリした。

嘘だと思うなら、以下の動画を見ながら実際にやってみて欲しい。(※動画は鏡写し)

懐かし〜と思うと同時に、体がめっちゃ鈍ってて、ラジオ体操でかなりほぐれることが分かるはず。
特に、普段デスクワークで座りっぱなしだとその実感の度合いも強いと思う。

「いや、全然ラクショウだったし」という人は、素晴らしい。
まだまだ体が若い証拠。

ただね、年取ると体は一気に衰えるので、そういった人もラジオ体操のようなお手軽な運動を地道にやっていった方がいいと思う。
いや、自分自身、ここまで体が衰えるものかと驚いてるから・・・
まだ30代なんだけどなぁ・・・

毎朝続けるために

さて、ラジオ体操も一回やって終わりだと微妙なので、毎朝続けたいところ。
けど、継続するのはなかなか難しいわけで。

そこで頼るのが、やはり「仕組みの力」
意志の力だけでやろうとしてもなかなか続かないので、続けるための仕組みを用意してあげるのがいい。

夏休みのラジオ体操ならスタンプ帳とかが定番だけど、それと同じようなことを今はアプリで出来る。
「毎朝体操」というアプリがいい感じだった。

毎朝体操

毎朝体操

  • 有限会社 来栖川電算
  • ヘルスケア/フィットネス
  • 無料

使い方は簡単。

  1. アプリを起動
  2. やる体操を選択
  3. スマホを持ったまま体操する

このスマホを持ったまま体操するというのが面白くて、なんと加速度センサを使って体操の採点をしてくれる
どれくらい正確に判定できてるのかはよく分からないけど、終わったあとに点数が表示されるので、高めの点数が出てくれるとちょっと嬉しいw
カラオケの採点みたいなものと思うといいかも。
やっぱり点数が出るとそれだけで楽しさが増してやる気が出てくる。

あと、体操をすると記録されて(アプリ内の)カレンダーにスタンプが押される。
カレンダーがスタンプで埋まっていくのを見るのは嬉しいw
(ただ、なんかバグがあるのか、スタンプが消えることが・・・これ、すごく悲しいので早く修正されて欲しい)

他にもトロフィーという名のアチーブメントがあって、ある体操で満点を出すとトロフィーがもらえたり、季節に応じたトロフィーがもらえたり。

それに、イベントも定期的に行われてて、体操の点数で順位が出たりする。
(なんかイベント参加の賞品としてポイントがもらえて、そのポイントでお買い物ができたりもするっぽいのだけど、それはまだ試せてない)

こんな感じで続けるための仕組みがいろいろ用意されている。

体操の種類

用意されている体操は、以下:

  • ラジオ体操第一
  • ラジオ体操第二
  • ラジオ体操第一 + 第二(二つ続けてやる)
  • アクティブ体操(これはよく知らない・・・)

権利関係なのか、ラジオ体操の音源自体は収録されてないので、これらの体操を以下の5パターンで実施できるようになっている:

  • YouTubeの動画をスマホで流しながら行う
  • 男性インストラクターの音声に合わせて行う(音楽は流れない)
  • 女性インストラクターの音声に合わせて行う(音楽は流れない)
  • 無音で外部の音源に合わせて行う
  • スマホ内の音源に合わせて行う

オススメは無音で外部音源を使う方法か、スマホ内の音源を使う方法。
(音楽が流れないのはやっぱり寂しい)

たとえば、YouTubeにラジオ体操第一/第二の動画があるので、それをパソコンなどで流しながらその前で運動するとか。
(※スマホYouTubeの動画を流す方法だと、スマホを持ちながら運動するので動画は見れない)

あるいは、iTunesなどでラジオ体操の音源を買えるので、それをスマホに入れて使うといい。

ラジオ体操 みんなの体操 - Single

ラジオ体操 みんなの体操 - Single

  • 多胡 肇(指導) 幅 しげみ(ピアノ演奏)
  • サウンドトラック
  • ¥600

自分は後者の方法を使っている。


なお、毎朝ラジオ体操をやるためには当然毎朝ちゃんと起きないといけないわけだけど、それには以前紹介した「SleepTown」を使うといい。

自分の今のルーチンは、

  1. 23時までに「SleepTown」を起動して寝る。
  2. 「SleepTown」の6時のアラームで起きる。→建物が立つ。
  3. いろんなアプリでログインボーナスをゲットしたり周回したり。
  4. 頭がしっかり起きたところで「毎朝体操」でラジオ体操第一 + 第二。

という感じ。
朝ラジオ体操で体をぐっと伸ばせるのがとても気持ちいい。

勉強会とかがあると23時までに家に帰れなくてこのリズムが崩れることがあるけど、そうでないときはちゃんと続けられてるのでいい感じだと思う。
やっぱり「仕組みの力」は強い!

今日はここまで!

TeXで同人誌を作ってみた。(まとめ)

f:id:yamaimo0625:20190918075457j:plain

これまでの各記事は、以下から。


他、同人誌制作まわりの振り返りは以下から:

また、技術書典関連の振り返りは以下から:


宣伝!
『Math Poker Girl』はBOOTHで販売中!
 \TeXで作った書籍の出来を確認してみてね!

今日はここまで!

TeXで同人誌を作ってみた。(パッケージ紹介)

f:id:yamaimo0625:20190918075457j:plain

長かった振り返りも今日で終わりで、最後は使ったパッケージの紹介。

okumacroパッケージ

いろいろ入ったパッケージ。
自分が使った機能はルビと均等割くらい(のはず)。

colorパッケージ

色関係のパッケージ。
今回は\textcolor[gray]で文字の濃さをしていするのにしか使ってない。

\textcolor[gray]{<lightness>}{<text>}で<text>の明るさを<lightness>に出来る。
この値がちょっと分かりにくいのだけど、0が一番暗くて真っ黒になり、1が一番明るくて真っ白になる。

ascmacパッケージ

文章に枠をつけるのに使った。

\begin{screen}
ここが枠に囲まれる。
\end{screen}

\begin{itembox}[l]{タイトル}
タイトル付きの枠で囲いたい場合はitemboxを使う。
オプションはタイトルの位置の指定。
(l: 左、c: 中央、r: 右)
\end{itembox}

他にもメモ帳みたいな枠を使ったり影付きの枠を使ったり出来る。
網掛けなども可能。

fancyboxパッケージ

トランプの記号を出すために\ovalboxを使った。

なお、ascmacパッケージにも\keytopというマクロがあり、それで出来ればよかったんだけど、使ってみたら微妙だったのでfancyboxパッケージを使うようにしている。

enumerateパッケージ

enumerate環境でカウンターの表示形式を簡単に変えることが出来るようになる。

\begin{enumerate}[A.]% カウンターの表示がA., B., ...となる
  \item ... % A. ...と表示される
  \item ... % B. ...と表示される
\end{enumerate}

表示形式としてはA(A, B, ...)、a(a, b, ...)、1(1, 2, ...)、I(I, II, ...)、i(i, ii, ...)が指定できるみたい。

paralistパッケージ

内容としては列挙なんだけど、別行組にしたいわけではない場合、このパッケージを使うといいみたい。

ハイカードになるのは、
\begin{inparaenum}[(1)]
    \item ランクが同じカードが1枚もなく、
    \item ランクが連続している5枚のカードがなく、
    \item スートが同じ5枚のカードがない、
\end{inparaenum}
という条件をすべて満たしているとき。

という感じで使った。

multicolパッケージ

部分的に多段組にしたいいときに使える。

\begin{multicols}{3}
ここが3段組で組まれる。
\end{multicols}

なお、jlreqなどで縦組にするとエラーが出ることがあるっぽい。
その場合、platex-toolsのpxmulticolパッケージを使ってやるとよさそう。

longtableパッケージ

複数ページに分ける必要のある表を書くことが出来る。

使い方は説明がちょっと大変なので省略・・・
texdoc参照。

diagboxパッケージ

表で斜線を引くのに使った。

同じ機能を持った有名なパッケージはslashboxというのがあるみたいなんだけど、(diagboxのドキュメントを読む限り)ライセンスに問題があってTeX Liveでは使えないらしい。
(ちゃんとは確認してない)

\diagbox{<item1>}{<item2>}とすることで、セルに斜め線を引いて引数で指定した内容が入ってくれる。

multirowパッケージ

表でセルの縦結合を行うためのパッケージ。

\multirow{2}{*}{...}みたいにすることでセルを縦に結合できる。
詳細はドキュメント参照。

lscapeパッケージ

ページを90度回転することが出来る。
これによって幅の広い表を1ページに収まるようにしたり出来る。

\begin{landscape}
90度回転したい内容を書く。
\end{landscape}

パッケージの紹介は以上。

宣伝!
『Math Poker Girl』はBOOTHで販売中!

今日はここまで!

TeXで同人誌を作ってみた。(マクロ)

f:id:yamaimo0625:20190918075457j:plain

今日は自分が定義したマクロを軽く紹介。

小物

まずは簡単なものから。

% 空行
\newcommand{\emptyline}{\vspace{\baselineskip}}
% 三点リーダ
\newcommand{\santen}{$\cdots\cdots$}
% 倍角ダーシ
\newcommand{\dash}{------}

このあたりは必要ならあとで定義を変えられるようにマクロにしておいた。
最後までこのままで修正しなかったけど。

三点リーダと倍角ダーシについては、ホントは修正した方がよさそう。
というのも、\cdotsによる三点リーダ \cdots)と全角の三点リーダ(…)ではベースラインの関係で微妙にズレがあるように思うから。
横書きの場合はあまり気にならないけど、縦書きの場合はかなり気になる。
倍角ダーシについても同様で、---でのemダーシ(TeX記法で出せない・・・)と全角ダーシ(—)だと高さにズレが。

なお、全角ダーシを2つ並べて倍角ダーシにしようとするとフォントによっては間に隙間が入ってしまう問題があって、それに対処するためにokumacroパッケージでは\−−というマクロが用意されているんだけど、なんで見分けのつきにくい横棒をマクロ名に入れたのか・・・
長音(ー、U+30FC)なのか全角ダーシ(—、U+2014)なのか水平線(―、U+2015)なのかさっぱり分からない。

トランプ関連

トランプ関連の表現をするために以下のマクロを定義した:

% スート
\newcommand{\spadeBlack}{}
\newcommand{\heartBlack}{}
\newcommand{\diaBlack}{}
\newcommand{\clubBlack}{}
\newcommand{\spade}{\textcolor[gray]{0.1}{\spadeBlack}}
\newcommand{\heart}{\textcolor[gray]{0.6}{\heartBlack}}
\newcommand{\dia}{\textcolor[gray]{0.45}{\diaBlack}}
\newcommand{\club}{\textcolor[gray]{0.25}{\clubBlack}}

% トランプ(9sやTdと指定する)
\def\internalCardH#1#2{%
    \if#2s\ovalbox{\hbox to 2.1zw{#1\spade}}\fi%
    \if#2h\ovalbox{\hbox to 2.1zw{#1\heart}}\fi%
    \if#2d\ovalbox{\hbox to 2.1zw{#1\dia}}\fi%
    \if#2c\ovalbox{\hbox to 2.1zw{#1\club}}\fi%
    \if#2?\ovalbox{\hbox to 2.1zw{??}}\fi%
}
\def\internalCardHBlack#1#2{%
    \if#2s\ovalbox{\hbox to 2.1zw{#1\spadeBlack}}\fi%
    \if#2h\ovalbox{\hbox to 2.1zw{#1\heartBlack}}\fi%
    \if#2d\ovalbox{\hbox to 2.1zw{#1\diaBlack}}\fi%
    \if#2c\ovalbox{\hbox to 2.1zw{#1\clubBlack}}\fi%
}
\newcommand{\cardH}[1]{\internalCardH#1}    % 水平
\newcommand{\disabledCardH}[1]{\textcolor[gray]{0.8}{\internalCardHBlack#1}}    % 水平(無効状態)

これで\cardH{9s}とか\cardH{Td}とか書くだけで本文に出てきたようなトランプマークを出すことが出来る。

なお、濃さを変えるために\textcolorを使っていて、これはcolorパッケージが必要。
また、角丸の矩形を書く\ovalboxを使うのにfancyboxパッケージを使っている。

あと、スートはamsmathで出力することも出来たんだけど、フォントが微妙だったのでamsmathは使わずにUnicodeで普通に指定している。

そしてこのマクロを説明しようとすると、うーん、難しい(^^;
 \TeXのマクロってラムダ計算での関数適用(β-簡約)をベタッとやってる感じなんだよね・・・
もちろん副作用があるので適用順が重要で、それを制御するために\expandafterとかいろいろある感じ。

二重丸の記号

他にも記述量を減らすために細かいマクロは定義してるけど、有益そうなのはこれ。
二重丸の記号を出す方法。

二重丸の記号はamsmathを使えば\circledcircで出力できるんだけど( \circledcirc)、これが微妙だった。
大きな丸\bigcirc \bigcirc)の内側に小さな丸が書かれている感じにしたかったんだけど、丸のサイズが違っていて・・・

そこで用意したのが次のマクロ:

% 二重丸の記号
% \ooalignで重ねる。\crcrは重ねるものの区切り。
\newcommand{\doublecirc}{{\ooalign{$\bigcirc$\crcr\hss$\circ$\hss}}}

これを使うと大きな丸に重なるように小さい丸が出力されていい感じの二重丸になる。
(これもTeX記法で出せない・・・)

なお\ooalign{\ooalign{<item1>\crcr<item2>}}とすると<item1>の上に<item2>を重ねることが出来る。
今回は重ねる丸(\circ)の両側を\hss(バネと考えるといい)で挟むことで下になっている大きな丸(\bigcirc)のちょうど中央に重なるようにしている。

リード文

各章のはじめに引用文を書いたのだけど、それは以下のようなマクロを使った:

% リード文
\newcommand{\lead}[2]{% #1: 引用元, #2: 引用文
    \vtop to 10\baselineskip{% 10行分の高さを確保
        \begin{flushright}
            {\small {\bfseries #2}\par\dash#1}
        \end{flushright}
    }}

なお、そういうのを本当はエピグラフというらしい。
さらにはそのためのパッケージもあったみたい・・・

会話文

会話文はいろいろ厄介なことが多い。

まず、改段落されているのに行頭にインデントは不要。
けど、鉤括弧(「)のサイズは全角の半分(二分)なので、何もしないとそれ以降が半角ずつ上にズレてしまう。
そこで、会話文の鉤括弧の前にはインデントの代わりに半角(二分)のスペースを普通は入れる。

それを簡単に出来るようにしたマクロがこれ:

% 会話
\newcommand{\talk}[1]{\noindent\kern0.5zw\inhibitglue\ignorespaces#1}

これで例えば

\talk{で、どうだい?
ポーカーをやってみないかい?
ルールはもちろん、数学的な根拠にもとづいた理論をキミには教えようじゃないか。
もちろん金銭を要求したりなんかはしないさ}

とすればいい感じに鉤括弧が入ってくれる。

なお、作文の授業とかだと鉤括弧の終わりに句点を書くように指導されるのが普通だけど(その場合、閉じ括弧と句点を作文用紙の同じ1マスに書く)、小説などをみると分かる通り、普通は句点は書かない。

あと、上記の例で疑問符(?)の後ろに半角スペースを入れてないけど、これはotfパッケージを使ってるから。
otfパッケージが自動でスペースを入れてくれる。
(もし入れたくない場合は\inhibitglueを直後に置く)
otfパッケージを使わない場合、自前で半角スペースを入れないとダメなので注意。

さらに加えて書くなら、jlreqドキュメントクラスを使う場合、オプションでこのあたりの挙動を変えることが出来る。

まとめ環境

各節の終わりにまとめを書くために、summary環境というのを用意した:

% まとめ
\newenvironment{summary}
    {\begin{itembox}[l]{\textbf{\thesection まとめ}}
        \setlength{\leftmargini}{1.3zw}
        \setlength{\leftmarginii}{1.3zw}
        \setlength{\leftmarginiii}{1.3zw}
        \renewcommand{\labelitemii}{$\circ$}
        \renewcommand{\labelitemiii}{$-$}\ignorespaces}
    {\end{itembox}}

itembox環境を使ってまとめを角丸の矩形で囲むようにしている。
また、箇条書きのインデント幅や記号を変えたり。

確認問題

確認問題も番号を自分で振るのはアレだと思ったので新しくカウンタを用意して自動で番号が振られるようにした。
また、ラベルをつけておくことで解答側から参照できるようにしている:

% 確認問題
% 引数は問題名で、ex:(問題名)で参照可能
\newcounter{exercise}[chapter]  % 章でリセット
\renewcommand{\theexercise}{\the\value{chapter}.\the\value{exercise}}
\newcommand{\exercise}[1]{
    \refstepcounter{exercise}\label{ex:#1}%
    \noindent
    \textbf{問題\theexercise}\hspace{1zw}\ignorespaces}
\newcommand{\answer}[1]{
    \noindent
    \textbf{解答\ref{ex:#1}}\hspace{1zw}\ignorespaces}

これは以下のように使う:

% 問題を出すとき
\exercise{term}
以下の用語の意味を答えよ。
(意味が複数ある場合、すべて答えよ)
...
% 解答を書くとき
\answer{term}
以下の通り:
...

自分で用意したマクロはこんなところ。
 \TeXもマクロを組むのがもっと簡単ならねぇ・・・

それはさておき、宣伝!
『Math Poker Girl』はBOOTHで販売中!

今日はここまで!

TeXで同人誌を作ってみた。(ハイパーリンク)

f:id:yamaimo0625:20190918075457j:plain

今日は電書版でリンクをつける方法について。

なお、印刷用と電書用の分離については以下を参照:

hyperrefパッケージ

ファイル内でリンクによる移動ができるようにするにはhyperrefパッケージを使う。
ただし、和文だと問題があるようなので、pxjahyperパッケージも一緒に使うようにする。
そして、リンクの色の設定などは\hypersetupでやる。

自分は以下のようにしてみた:

% 目次や索引、参照にリンクをつける
\usepackage[dvipdfmx]{hyperref}
\usepackage{pxjahyper}  % 日本語環境での問題を解決するらしい
\hypersetup{colorlinks=true,%
    linkcolor=blue,%
    citecolor=blue,%
    filecolor=blue,%
    urlcolor=blue}

これで目次や索引、参照にリンクが入り、ページ間の移動が簡単に出来るようになる。
さらには、PDFに目次も入ったり。

あと、『Math Poker Girl』では調査不足で出来なかったんだけど、オプションを指定すればPDFにタイトルや著者名などの情報も入れられたみたい:

\hypersetup{
    ...,
    pdftitle=xxx, % PDFのタイトル
    pdfauthor=xxx, % PDFの作成者
}

なお、hyperrefパッケージはなんか悪名も高いパッケージらしく、もしかしたら何かレイアウトがおかしくなってたりするかも。
その場合は調査が必要・・・
自分の場合、幸いにも何も問題は起きなかった。

外部リンク

リンクに関してもう一つやったことがあって、それは外部リンクの設定。

印刷用だとリンクが貼られていても何も嬉しくないけど、電書用の場合はリンクからWebページなどにジャンプできるようになっていた方が嬉しい。
なので、共通部でマクロを用意しておいて、電書用ではリンクを貼るようにマクロを上書きするようにした。

まず、共通部で用意したマクロは以下:

% URL表記(印刷用/電書用で切り替えられるようにするため)
\newcommand{\linkurl}[1]{\texttt{#1}}
\newcommand{\linktext}[2]{#1}

\linkurl{https://www.yamaimo.dev/}とか\linktext{\texttt{@yappy0625}}{https://twitter.com/yappy0625}と使う。

そして、電書用のソースでは以下のように定義を上書き:

% URLにリンクをつける
\renewcommand{\linkurl}[1]{\url{#1}}
\renewcommand{\linktext}[2]{\href{#2}{#1}}

これで印刷用は単に文字が出力され、電書用はリンクのついた文字が出力されるようになる。


宣伝!
『Math Poker Girl』はBOOTHで販売中!

今日はここまで!

TeXで同人誌を作ってみた。(表紙/裏表紙の画像)

f:id:yamaimo0625:20190918075457j:plain

今日は電書版について表紙/裏表紙の画像を載せる方法について。

印刷用では表紙/裏表紙は別ファイルとして作成するのでPDFに入れる必要はないんだけど、電書版の場合は入ってないと格好がつかない。
けど、単に画像を貼ろうとすると本文領域のところに出力されてしまうので都合が悪い。
そこで、紙面いっぱいに画像を貼る方法が必要になってくる。

なお、印刷用と電書用の分離については以下を参照:

wallpaperパッケージ

紙面いっぱいに画像を貼るにはwallpaperパッケージを使えばいい:

これは背景画像を貼るためのパッケージなんだけど、空のページに背景画像として表紙や裏表紙を指定すれば目的を達成できる。

表紙/裏表紙の表示

自分の場合、トリム済みの表紙/裏表紙の画像をそれぞれcover1.png、cover4.pngとして用意して、以下のように表示した:

% 表紙 1, 2
\thispagestyle{empty}
\ThisCenterWallPaper{1}{cover1.png}
\null
\cleardoublepage

% 本文
\input{contents}

% 表紙 3, 4
\cleardoublepage
\pagestyle{empty}
\null
\clearpage
\ThisCenterWallPaper{1}{cover4.png}
\null

ページスタイルをemptyにしたあと、\ThisCenterWallPaperを使って紙面中央に表紙/裏表紙を出すようにしている。
(引数の1は画像サイズの倍率)

縦組での注意事項

『Math Poker Girl』では関係ないんだけど、縦組の本でこの方法を使って表紙/裏表紙を出そうとしたら、エラーになった。

! Incompatible direction list can't be unboxed.
\AtBeginShipoutAddToBox ...box \AtBeginShipoutBox 
                                                  \kern 0pt}\AtBegShi@restor...

調べてみるとwallpaperパッケージが(間接的に)atbegshiパッケージというのを使っていて、これが縦組に対応していないのが原因のようだった。
この問題に対処するためにplatex-toolsでpxatbegshiパッケージが用意されている。

なので、縦組みで使う場合は以下のようにした方がいい:

% ページいっぱいの画像を入れる
\usepackage{pxatbegshi} % 縦組だとatbegshiでエラーが出るのを回避する
\usepackage{wallpaper}

加えて、\cleardoublepageが歴史的経緯なのか奇数ページまで改ページするのではなく偶数ページまで改ページするようになっている。
(つまり開いたときに右側になるページまで改ページする;左綴じだと奇数ページで右綴じだと偶数ページ)

これは都合が悪いので、\cleardoublepageではなく(使えるのなら)\cleartooddpageを使うといい。
jlreqドキュメントクラスを使う場合は、次のようにする:

% 表紙 1, 2
\thispagestyle{empty}
\ThisCenterWallPaper{1}{cover1.png}
\null
%\cleardoublepage % 右綴じの場合、偶数ページに改ページしてしまう
\cleartooddpage[empty] % 奇数ページまで改ページ

宣伝!
『Math Poker Girl』はBOOTHで販売中!

今日はここまで!