TeXの記憶(9) — \parshapeと\@whilenumを使う

作ってみたものの、あまり役に立たなそうなコマンドです。\@whilenumを使ってみたかった、というのがいちばんの理由です。

TeXには「\parshape」というコマンドがあって、TeX Bookの例を見たりするとなんだか便利に使えそうな気がします。ところが実際に指定しようとすると、必要な行数だけ引数を指定しなければならず面倒です。

\parboxの使い方は

\parbox n i_1 l_1 i_2 l_2 ... i_k l_k ... i_n l_n
n:整形に必要な行数
i_k:k行目の字下げ幅
l_k:k行目の文字数
n行目以降は最後のi_nとl_nの値が続く

これを必要な行数分引数として渡すのはとても面倒なので、引数を文字列として作って\parboxに渡すためのコマンドを作ってみました。TeX Bookの例よりずっと単純で、右端の一部を開けるだけですの機能です。

図版を回り込ませるならwrapfig.styのようなマクロを使ったほうが便利ですね。

実行例

img20130506

\newcommand{\Parshape}[3][0]{%
  \@tempcnta=#1\advance\@tempcnta by 1 % 全体の行数が入る
  \@tempcntb=1
  \def\STR{}%
  % #1 != 0なら、#1行分は普通に出力するための引数の文字列
  \@whilenum\@tempcntb<\@tempcnta\do{\edef\STR{ \STR 0pt \the\linewidth }%
    \advance\@tempcntb by 1}%
  \advance\@tempcnta #2
  % 整形するための引数の文字列
  \@whilenum\@tempcntb<\@tempcnta\do{\edef\STR{ \STR 0pt #3 }%
    \advance\@tempcntb by 1}%
  % 最終行以降、段落の終わりまでは通常の指定
  \edef\STR{\STR 0pt \the\linewidth}%
  % 作った文字列を引数として渡す
  \parshape \@arabic\@tempcnta \STR}

.....

\begin{document}

% 2行は通常、3行分右明け、2+3+1行からは通常
\Parshape[2]{3}{15zw}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

 

Textasticにテーマとフォントを追加してみた

使い始めたTextasticのテーマを変更してみました。

スクリーンショット 2013-05-03 9.21.11

テーマを追加

TextasticのテーマはTextMateと互換性があるので、TextMate Themeから選べます。「Coda」をダウンロードしてみました。

「Coda」の場合は、ダウンロードしたorigina.zipを解凍すると「Coda.tmTheme」ができるので、これを

~/Library/Containers/com.textasticapp.textastic-mac/Data/Library/Application Support/Textastic

に入れて再起動。

あとはPreferencesから変更するだけでした。

フォントの追加

デフォルトのフォントで表示させると日本語と半角アルファベットのベースラインの位置がすっきりしないので「Ricty Diminished」をインストールしてみました。

http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/rictydiminished.html
よりRictyDiminished-3.2.1.tar.gzを解凍して、FontBookからインストールして終わりです。

Textastic for Macを使ってみる

Textastic for Macをインストールしてみました。

Mac上で簡単な文章だけ書くならnvALTを気に入っているのですが、プログラムを表示するにはシンタックスハイライトが欲しい、でもサラっと使いたい、というエディタを探していたらMac用のTextasticがあったのでインストールしてみました。

インストールはApp Storeから500円(2013/05/01)でした。

Textastic for iPadほどのインパクとはなけれど、さっくり使えそうです。Sublime Text2のように豊富な機能はありませんが、下のステータスバーにはシンボルも表示できるし、補完もできるようです。テーマも変更できます。

スクリーンショット 2013-05-02 8.21.29      スクリーンショット 2013-05-02 8.24.30

テキストエディットのようにRevert Documentもできます。

Control+Uでカーソルの後の文字列が大文字にできるのは、Emacsを使っていた自分にはありがたいです。

ただ残念なのはControl+Kで削除したカーソル以降の文字を貼り付けできないことです。KeyRemap4MacBookを使えば何とかなるかな。

TeXの記憶(8)—ページヘッダを修正する

jsbookでもjbookでもページヘッダ(柱と呼ぶことが多いです)はページやテキスト領域(版面)の端に寄せて表示されます。柱は出版社によってページの真ん中にしたいとか、ページ番号(ノンブルと呼ぶことが多いです)を端から少し内側にしたいとか、いろいろこだわりがあるようです。これって、出版社のこだわり、というか担当編集者の好みかもしれませんが。とにかくデフォルトじゃすまない項目の一つです。

デフォルトの柱はjbook.cls、jsbook.clsとも、柱とノンブル(ページ番号)が両端に寄るようになっています。

img20130501-1

img20130501-2

この柱を真ん中に表示することにしました。jsbook.clsはノンブルも直しています。元はボールドの数字ですがイタリックで出力しています。

img20130501-3

img20130501-4

まずは、jbook.clsから。

LaTeXの各ページにはそれぞれのスタイルが割り当てられていて、普通のページはheadingsというスタイルに定義されています。この中の奇数・偶数のページヘッダ定義を直してやれば目的を達するはずです。jbook.clsの元の定義を眺めてみます。

\if@twosideの中にあるところ

\def\@evenhead{\thepage\hfil\leftmark}%
\def\@oddhead{{\rightmark}\hfil\thepage}%

偶数ページは\def\@evenhead、奇数ページは\def\@oddheadが担当しています。\@evenheadと\@oddheadは、版面(textwidth)の幅を持つので、ページ番号と柱の真ん中に\hfilを入れて、それぞれを両端に配置させています。

この部分を修正することにします。幅ゼロのボックスにページ番号を入れて、版面の幅のボックスを作って、その中央に柱を置く、という方法で作りました。奇数ページも同じ考え方で作ります。

\def\@evenhead{\hbox to \z@{%  幅ゼロのボックスを作って
  \thepage\hss}%               ページ番号を入れる
  \hbox to \textwidth{%        版面のボックスを作って
    \hss\leftmark\hss}}%       真ん中に柱を入れる

\def\@oddhead{\hbox to \textwidth{\hss\rightmark\hss}%
  \hbox to \z@{\hss\thepage}}%

jsbook.clsも同じところだろうと思って見てみると

\def\@evenhead{%
  \if@mparswitch \hss \fi
  \underline{\hbox to \fullwidth{\autoxspacing
      \textbf{\thepage}\hfil\leftmark}}%
  \if@mparswitch\else \hss \fi}%

のような定義になっています。\fullwidthって何でしょうか。LaTeXにこんな定義があったのかな?とりあえず、ファイル内を検索するとjsbook.clsの中で定義されている長さで、ページのテキスト領域+余白を合わせたもののようです。奇数ページは右に余白を置き、偶数ページは左に余白置く、というためにあるようです。(jsbook.clsを仕事で使ったことがないので知りませんでした。ほんとはもともとLaTeXにあるのかな。)

jsbook.clsは\fullwidthにあたる幅全体に下線を引いて、そこにページ番号と柱を出力していますが、同じ考えで進めました。\underlineの中で、\fullwidth幅の中にノンブルと柱を配置すればいいわけです。

\def\@evenhead{%
  \if@mparswitch \hss \fi
  \underline{\hbox to \z@{\textit{\thepage}\hss}%
    \hbox to \fullwidth{\hss\autoxspacing\leftmark\hss}}%
  \if@mparswitch\else \hss \fi}%
\def\@oddhead{\underline{\hbox to \fullwidth{\hss
      {\autoxspacing\if@twoside\rightmark\else\leftmark\fi}\hss}%
    \hbox to \z@{\hss\textit{\thepage}}}\hss}%

ついでに、ボールドになっているノンブルをイタリックにしたのは\textit{\thepage}の部分です。\smallにすれば、ノンブルだけ小さな文字で出力することもできます。

ページ番号の位置もここで変更できます。版面から内側に入った体裁もよく見かけるので、1文字内側に入るものを作ってみました。jbook.clsの例です。

\def\@evenhead{\hbox to \z@{\hskip1zw\thepage\hss}%
  \hbox to \textwidth{\hss\leftmark\hss}}%
\def\@oddhead{\hbox to \textwidth{\hss\rightmark\hss}%
  \hbox to \z@{\hss\thepage\hskip1zw}}%

\hskip1zwを使って、ページ番号を中央に向けて押しています。

img20130501-5

TeXの記憶(7)—索引コマンドを作る

もちろん、LaTeXの索引コマンドは「\index」があるのですが、分量が多かったりすると本文とは別に入力するのが面倒になってきます。本文中の項目をいちいちをコピペするのも時間かかるし、別に入力するのはさらに間違いも入る可能性があります。

そんなわけで、本文の索引項目を引数にとれる索引コマンドを作っていました。

使い方は以下のようです。

この文章の中に\Idx{index}の代わりのコマンドを使って
\Idx[さくいん]{索引}を入れました。

漢字のように「読み」が必要な場合だけオプション引数を付けることにしました。

カタカナ用語が多い文章だと、オプション引数が不要なので、かなり楽になります。

ついでに、索引として拾った項目に色を付けることにしました。拾い忘れや、ちょっと前に同じ用語があったのに後のほうを索引にしてしまった、なんてことの予防になるかなと思っています。

出力

img20130419

この色表示は、草稿のときだけあればよくて、最終的な文書に色が付いていては困るので、条件分岐で色にするかどうか決めています。条件は「\newif\ifXXX」のように適当に作ればいいのですが、ここではもともと用意されているdraftオプションを使ってます。

文書の先頭で

\documentclass[draft]{jsbook}

とすると色表示、

\documentclass{jsbook}

のように「draft」オプションをとってしまえば本文の色(通常は黒)になります。

マクロは以下のようになりました。

\newcommand{\@Idxcond}[2]{\ifdraft\textcolor{#1}{#2}\else#2\fi}
\definecolor{iroIdx}{rgb}{0,0,1}
\def\Idx{\@ifnextchar[{\@Idx}{\@Idx[XXX]}}
\def\@Idx[#1]#2{\def\ARG{#1}\def\XXX{XXX}%
  \ifx\ARG\XXX\def\YOMI{#2}\else\def\YOMI{\ARG}\fi
  \index{\YOMI @#2}\@Idxcond{iroIdx}{#2}}

\@Idxcondは\Idxコマンドの中に直接書いてもいいのですが別にしてみました。

「XXX」っていうのは見た目が悪いのですが、オプション引数のデフォルトの文字列です。

TeXの記憶(6)—独自のフロート環境を作る

LaTeXにデフォルトで用意されているフロート環境はfigureとtableの2種類があります。これで事足りる場合がほとんどで、例外的な場合は「キャプションを自由に付けたい」で作ったコマンドを使えば済んでしまいます。ですが、以前の仕事で「写真1」のようなキャプションが多く必要になったことがあってphoto環境を作ってみました。(結局使ったのはその一度だけでしたが)

img20130417
入力はこれだけです。

\begin{photo}
\caption{キャプションです}
\end{photo}

float環境に必要な定義は以下のようになります。

\newcounter{photo}[chapter]
\newcommand{\photoname}{写真}
\def\fps@photo{tbp}
\def\ftype@photo{4}
\def\ext@photo{lof}
\def\fnum@photo{\photoname\nobreak\thephoto}
\newenvironment{photo}%
               {\@float{photo}}%
               {\end@float}
\newenvironment{photo*}%
               {\@dblfloat{photo}}%
               {\end@dblfloat}

1,2行めで専用のカウンタ、キャプションの先頭の文字列を定義しています。

\ftype@photoの数字「4」は、1, 2, 4, 2^n … となるようです。jsbook.clsなどの標準的なクラスを見てみるとfigureが1 (=2^0)、tableが2 (=2^1)に設定されています。photo環境は3番めということで2^2=4と定義しました。

\fps@はフロートのデフォルトの位置、\extはフロートのリストを出力するときの拡張子のようです(List Of Photo)。

\fnum@photoは「写真1.1」の部分の定義です。「1.1」を出力する「\thephoto」の部分は自動的に作られているので、このままです。

あとは、環境を設定するだけ。*が付いているのは段抜きのフロートです。

 

TeXの記憶(5) — キャプションを自由に付けたいの続き

figure環境の中で\captionを使えば図のキャプションが出力されますが、同じ環境の中に表も入れてtable環境のキャプションも入れたい、なんてことがよくあります。

デザイン上figure環境やtable環境を使うとうまく収まらないのでフロートにはできない、だけど図や表のキャプションは付けたい、なんてこともあります。そんなときに安易にキャプションを入れるマクロを作ってみました。

こんな感じに出力できます。

img20130416

必要なマクロはたった2行です。コマンドというほどでもありませんでした。

\newcommand{\figenv}{\def\@captype{figure}}
\newcommand{\tabenv}{\def\@captype{table}}

ようするに\def\@captype{figure}を直接使えばいいだけのことですが、TeX文書の中で使うには\makeatletterと\makeatotherで囲まなければならないので、あれば便利、かな。

使い方はこんな感じです。

\begin{figure}
  \caption{デフォルトのキャプション}
  \tabenv\caption{figureの中の表のキャプション}
\end{figure}

何もないところでも

\figenv\caption{キャプション}

が使えます。

\@captypeというのは、LaTeXの\captionの定義の中で使われているマクロです。ltfloat.dtxを見てみると、以下のような定義がありました。

\def\caption{%
  \ifx\@captype\@undefined
    \@latex@error{\noexpand\caption outside float}\@ehd
    \expandafter\@gobble
  \else
    \refstepcounter\@captype
    \expandafter\@firstofone
  \fi
  {\@dblarg{\@caption\@captype}}%
}

\captionが呼ばれたら\@captypeの定義を調べて、figureだったりtableのカウンタを増やしてから、キャプションを出力する別のコマンド\@captionを読んでいます。

これを見ると\@captypeが何も定義されていないとエラーになるように定義されています。自分で定義してしまえばfigureやtable環境のようにキャプションを出力できるわけです。

 

TeXの記憶(4) — キャプションを自由に付けたい

LaTeXにはfigureやtableなどのfloat環境があるので、その中で\captionを使えば「図1.3」とか「表3.2」のように番号がカウントされたキャプションが出力されます。でも、この場所だけ別のキャプションを付けたいことがままあります。そんな用途に簡単に使えるコマンドを作ってみました。

\newcommand{\CAPFONTSIZE}{\small}
\newcommand{\CAPTION}[2][]{\par
  \begingroup
  \@parboxrestore
  \if@minipage\@setminipage\fi
  \CAPFONTSIZE
  \@makecaption{#1}{\ignorespaces#2}\par
  \endgroup}

引数は2つ。最初の引数はオプションです。こんな感じに使います。

\CAPTION[図2$'$]{別なキャプション}
\CAPTION{接頭辞のないキャプション}

3行目と4行目が出力結果です。

img20130414

 

TeXの記憶(3) — 2つのオプション引き数

TeXの記憶(2) — 角丸の囲みを使った環境では引数があるときだけ見出しとして表示させるようにしました。これは自動的に章番号と順の番号を出力して見出しがあるときだけ表示させるというものでしたが、組版をやっていると例外的な要求がけっこうあります。

こんな感じです。

img20130413

もっと規則的に原稿が書けるだろうとか、気まぐれなことするんじゃない、と思ってイラっとしますが、フィードバックするのも面倒なので、そのまま対応しちゃってました。

そんなわけで、もって手広く対応できるように例外に対応できるように直してみました。

LaTeXの環境だとオプション引数が1つしか使えない(と思う)ので、TeXの引数のパターンマッチングに頼ることにします。

引数が

  • ゼロ:デフォルトの見出し、
  • 1つ:#1=見出し
  • 2つ:#1=見出し、#2=ワクの中の表示

というようにしました。
ワクの中の表示が頻繁に入れ替わるときは#1と#2を入れ替えたほうが入力の手間が少なくていいかもしれません。

% 修正したところだけ
\def\rei{\par\noindent
  % 次の文字が [ なら\@reiへ、なければ\@@reiへ
  \@ifnextchar[{\@rei}{\@@rei[\empty][\empty]}}
\def\endrei{\hfill\QED}
\def\@rei[#1]{%
  % 「\@rei[#1]」の次の文字が [ なら、それは\@@reiの2番目の引数になる
  \@ifnextchar[{\@@rei[#1]}{\@@rei[#1][\empty]}}
\def\@@rei[#1][#2]{%
  \ifx#2\empty
    \stepcounter{reicnt}%
    \Kadomaru{\bf 例\thechapter.\arabic{reicnt}}%
  \else
    \Kadomaru{\bf #2}%
  \fi
  \ifx#1\empty\else\space{\bf #1}\fi
  \hskip.9zw}

...

\begin{document}

%\chapterコマンドの代わり
\setcounter{chapter}{1}

\begin{rei}
...

\begin{rei}[見出し]
...

\begin{rei}[][例1.2$'$]
...

\begin{rei}[見出し][例1.2$''$]
...

\begin{rei}[][例外]
...

\begin{rei}
...

TeXの記憶(2) — 角丸の囲みを使った環境

前回、角丸の囲みマクロ「\Kadomaru」をpstricksで作ったので、これを利用した環境を作ってみることにします。

以下のような「例」の環境にしてみました。

img20120412

上の画像の2番目は「例1.2」の後に太字の見出しが入っています。

このタイプの見出しはあったり、なかったりすることがあるので、
オプション引数として使えるようにしてみました。
使い方は

%オプション引数のないとき
\begin{rei}
...

%オプション引数のあるとき
\begin{rei}[これは見出し]
...

で切り替えるようにします。

オプション引き数はLaTeXの環境コマンドの仕組みを利用して、引き数があるときはそのまま表示。ないときはデフォルトを「\empty」ということにして判断しています。

\newenvironment{rei}[1][\empty]{...
...
  \ifx#1\empty\else\space{\bf #1}\fi

「例」の後の1.1の数字は「章番号.順番」を自動で出しましょう。(章が必要なのでドキュメントクラス名はjsbookとしました。)章番号を自動的に出すためにカウンタも設定しています。

\newcounter{reicnt}[chapter]

環境の最後に「□」を置いてみました。これはAmSLaTeXの「amsthm」パッケージを使えば「\qed」で表示されますが、簡単なので「\QED」を作っちゃいましょう。シアン色60%の四角にします。

\newcommand{\QED}{\hfill{\textcolor{iro6}{\rule[-.3mm]{3mm}{3mm}}}}

これをrei環境の終わりに入れて自動的に表示させるようにしました。

以上全部をまとめたリストは以下のようになります。

\documentclass{jsbook}

\usepackage[dvips]{graphicx}
\usepackage{color}
\usepackage{pstricks}

\makeatletter

\definecolor{iro2}{cmyk}{0.2,0,0,0}
\definecolor{iro6}{cmyk}{0.6,0,0,0.}

\newcommand{\Kadomaru}[1]{%
  \setbox0=\hbox{#1}\dimen0=\wd0
  \advance\dimen0 0.6em
  \begin{pspicture}(0,0)(\dimen0,1.3zh)
  \psframe[linecolor=black,linewidth=0.2mm,cornersize=absolute,linearc=0.15,
  fillstyle=solid,fillcolor=iro2]
  (0,1.3zh)(\dimen0,-0.2zh)
  \rput[lb](1mm,0mm){#1}
  \end{pspicture}}

\newcommand{\QED}{\hfill{\textcolor{iro6}{\rule[-.3mm]{3mm}{3mm}}}}

\newcounter{reicnt}[chapter]

\newenvironment{rei}[1][\empty]{\par\noindent
  \stepcounter{reicnt}%
  \Kadomaru{\bf 例\thechapter.\arabic{reicnt}}%
  \ifx#1\empty\else\space{\bf #1}\fi
  \hskip.9zw}
{\hfill\QED}

\makeatother

\begin{document}

%\chapterコマンドの代わり
\setcounter{chapter}{1}

\begin{rei}
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
\end{rei}

\begin{rei}[見出し]
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
\end{rei}

\end{document}