いものやま。

雑多な知識の寄せ集め

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で販売中!

今日はここまで!