
ありそうでなかなかない、LaTeXで使えるリングノート枠。
下のブログを見つけてfancyparに惚れこんだものの、ページまたぎができないと察して頭を抱えていた。
konoyonohana.blog.fc2.com
…ならば自分で作ればいいじゃないか!という持ち前の勢いの良さで、tcolorboxのマニュアル(※530ページ、全文英語)を読み始める。
その他にも海外ブログやら類似パッケージのstyファイルやらいろいろなものを読み漁って、なんとか丸1日で実装にこぎ着けたので、コード全文とその解説をまとめておく。
なお、以下ではすべてpLaTeX(ptex2pdf)でコンパイルしている。
手順0,制作の方向性
fancyparは『個々の段落を装飾する』マクロ集であり、複数の段落をまとめて囲むことは想定されていない。実際、fancyparパッケージで定義されているものはコマンドであり、環境ではないので、(\parboxで囲んで無理やり1行と認識させない限り)内部で改行などをすればエラーが吐き出されるはずである。
そこで今回実装したいのは、fancyparの\NotebookParというコマンドで出力されるリングノート枠の改良版だ。
具体的には、次のような機能をもつものを作りたい。
なお、個人的に罫線は無い方が読みやすい気がするので、本家のような罫線はつけない方向で行く。
手順1,fancyparのstyファイルからリング部分のコードを抜き出す
結論から言うと、fancypar.styの116~124行目がリング部分を記述するコードである。
\tikz{
\draw[draw=black,fill=white] (-1,-0.3) circle (3pt);
\ifFP@fancypar@spiral
\draw[very thin,rotate=4,double=\FancyNSColor,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
\else\relax
\fi
}
今回はspiral=trueとしてリングノート風の出力を得たいので、リング穴とリングを描画するコードだけ抜き出す。
\tikz{
\draw[draw=black,fill=white] (-1,-0.3) circle (3pt);
\draw[very thin,rotate=4,double=\FancyNSColor,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
}
\FancyNSColorという色は、43行目で次のように定義されている。
\DeclareOptionX[FP]<fancypar>{spiralcolor}{\def\FancyNSColor{#1}}
これは、spiralcolor=…というオプションで指定した色が\FancyNSColorであるという意味だが、今回はそのようなオプションはつけずにデフォルトの色を指定することにする。
fancyparパッケージのドキュメント(fancypar.pdf)の6ページを見ると、デフォルトの色はLightYellow3であるらしい。
インターネットでRGB値を調べ、次のように定義しておく。
\definecolor{lightyellowiii}{RGB}{205,205,180}
先ほどの\FancyNSColorをlightyellowiiiに置き換えて、次のようにするとコンパイルが可能になる。
\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{lightyellowiii}{RGB}{205,205,180}
\begin{document}
\tikz{
\draw[draw=black,fill=white] (-1,-0.3) circle (3pt);
\draw[very thin,rotate=4,double=lightyellowiii,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
}
\end{document}
コンパイル結果は、次のようになる。

手順2,リングを新たなデコレーション単位として定義する
さて、問題はこのリングをどうやって枠の左上から左下までに渡って等間隔に配置するか?なのだが、散々ネットを徘徊した末に、次の方法で実装できそうな予感がしてきた。
TikZにはdecoration.shapesというライブラリがある。
このライブラリを読み込むと、予め定義した図形(猫の足跡とか)を何度もスタンプを押すように並べることができるようになる。
そこで、先ほど描画したリング1つを新たなスタンプとして定義して、枠の左上から左下まで並べていけば、目的のレイアウトは実現できそうだ。
その前に、先ほど描いたリングを90°回転させておく。
\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{lightyellowiii}{RGB}{205,205,180}
\begin{document}
\tikz{
\draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);
\draw[very thin,rotate=90,double=lightyellowiii,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
}
\end{document}
コンパイル結果は

どうやらスタンプとして並べられるときに図形が-90°回転されるようなので、予め90°回転させておかないと目的の出力が得られない。
自分で新たなスタンプを定義するには、\pgfdeclaredecorationコマンドを用いるらしい。
上の画像のリングをspiralスタンプとして、次のように定義する。
\pgfdeclaredecoration{spiral}{initial}
{
\state{initial}
[width=\pgfdecoratedpathlength/floor(\pgfdecoratedpathlength/13pt]
{
\draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);
\draw[very thin,rotate=90,double=lightyellowiii,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
}
\state{final}
{
\pgfpathmoveto{\pgfpointdecoratedpathlast}
}
}
コードの意味についてはとりあえず省略(実はまだあんまりよくわかっていない)
とりあえず、
13より大きな値にするとリングの間隔はより広くなる。小さな値にするとより狭くなる。ここは好みで調整
実際にこのスタンプを使ってみよう。
\tikz{
\draw[decorate,decoration={spiral}]
(0,0)--(0,-10);
}
のようにしてスタンプを並べることができる。
コンパイル用の完全版は、
\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,
decorations.shapes}
\definecolor{lightyellowiii}{RGB}{205,205,180}
\pgfdeclaredecoration{spiral}{initial}
{
\state{initial}[width=\pgfdecoratedpathlength/floor(\pgfdecoratedpathlength/13pt)]
{
\draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);
\draw[very thin,rotate=90,double=lightyellowiii,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
}
\state{final}
{
\pgfpathmoveto{\pgfpointdecoratedpathlast}
}
}
\begin{document}
\tikz{
\draw[decorate,decoration={spiral}]
(0,0)--(0,-10);
}
\end{document}
コンパイル結果は、

手順3,デコレーション機能をtcolorboxのデザインで使う
tcolorboxでは、『左上』などの位置情報を方角で表現する。
- 枠の左上の角…frame.north west
- 枠内部の左上端…interior.north west
よって、枠の左上から左下にわたってspiralスタンプを並べる命令は次のようにかける。
\draw[decorate,decoration={spiral}] ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);
(※いい感じにリングノートに見えるように、左端から少しずらしている)
ringnote環境のコード全文
\documentclass[a4paper,12pt,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,
decorations.shapes}
\usepackage{xparse}
\usepackage{tcolorbox}
\tcbuselibrary{listings,breakable,xparse,skins,hooks}
\definecolor{lightyellowiii}{RGB}{205,205,180}
\pgfdeclaredecoration{spiral}{initial}
{
\state{initial}[width=\pgfdecoratedpathlength/floor(\pgfdecoratedpathlength/13pt)]
{
\draw[draw=black,fill=white,rotate=90] (-1,-0.2) circle (3pt);
\draw[very thin,rotate=90,double=lightyellowiii,
double distance=1.5pt]
(-1,-0.2) arc (40:-250:10pt and 2pt);
}
\state{final}
{
\pgfpathmoveto{\pgfpointdecoratedpathlast}
}
}
\DeclareTColorBox{ringnote}
{ O{} O{white} O{} }
{ enhanced,
colback=#2,
breakable,
sharp corners,
left*=10mm,
boxrule=0.4pt,
underlay unbroken={\draw[decorate,decoration={spiral}] ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},
underlay first={\draw[decorate,decoration={spiral}] ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},
underlay middle={\draw[decorate,decoration={spiral}] ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},
underlay last={\draw[decorate,decoration={spiral}] ($(interior.north west)+(1.375,0)$)--($(interior.south west)+(1.375,0)$);},
IfValueTF={#1}
{title=#1}
{},
#3
}
ringnote環境の使い方
\begin{ringnote}[タイトル][テキスト背景色][さらなるtcolorboxオプション]
テキスト
\end{ringnote}
使用例ギャラリー(ページをまたがない例)
\usepackage{lipsum}
\begin{ringnote}
\lipsum[1]
\end{ringnote}

\usepackage{lipsum}
\begin{ringnote}[title]
\lipsum[1]
\end{ringnote}

\usepackage{lipsum}
\begin{ringnote}[title][green!7]
\lipsum[1]
\end{ringnote}

\usepackage{lipsum}
\begin{ringnote}[][green!7]
\lipsum[1]
\end{ringnote}

\usepackage{lipsum}
\begin{ringnote}[title][green!7][colbacktitle=blue!5,
colframe=white,
coltitle=blue!50!black]
\lipsum[1]
\end{ringnote}

\usepackage{lipsum}
\definecolor{powderblue}{RGB}{230,230,255}
\usepackage{frcursive}
\begin{ringnote}[\bfseries\textcursive{title}][powderblue!50!white][colframe=white,
title style={fill,left color=red!20!white,right color=blue!20!white},
coltitle=cyan!50!white]
\lipsum[1]
\end{ringnote}

使用例ギャラリー(ページをまたぐ例)
\usepackage{lipsum}
\begin{ringnote}[title]
\lipsum[1-9]
\end{ringnote}