parskipパッケージをjlreqで使うと箇条書き内のアキがどうにもならない場合がある
LaTeXには parskip
というパッケージがあって、段落間の垂直方向のアキを文書全体で統一的に制御できる[1]。
\documentclass{jlreq}
\usepackage{parskip}
\begin{document}
\section{section}
parskipパッケージがあると…
段落間にアキができる。
\end{document}
上記をlualatexで処理すると、下記の左図の結果になる。 \usepackage{parskip}
をコメントアウトして読み込まないようにすると、文書クラスとして jlreq
を使っているので、「段落の先頭1字下げ、段落間のアキなし」という日本語で見慣れた組版になる(右図)。
日本語の組版に慣れているとちょっと意外なのだが、parskip
では箇条書きの項目間にもアキができるようになっている。文書全体でアキの雰囲気を統一するためらしい。
\documentclass{jlreq}
\usepackage{parskip}
\begin{document}
\section{section}
\begin{itemize}
\item 箇条書きの項目間にも
\item アキができる
\end{itemize}
\end{document}
実行結果は下記の左図のようになる(右図は比較のために parskip
を読み込まずに実行した結果)。
この箇条書き項目間のアキをつぶすには、itemize
環境内で \setlength{\parskip}{0pt}
とすればよい。箇条書きの項目間を制御する寸法は \parskip
ではなく \parsep
と \itemsep
なのだが、parskip
パッケージの実装で \parsep = \parskip
および \itemsep = \z@
と定義されているので \parskip
を設定することになる。
しかし、実はそれだけでは箇条書きがセクション見出しの直後にある場合にはアキがなくならず、「見出しと箇条書きの間」に何かしらの本文が必要になる場合がある。たとえば、まさにこの例のように文書クラスで jlreq
を使っていると、見出しの直後に本文なしで出現する itemize
環境では \setlength{\parskip}{0pt}
を挿入しても項目間のアキがなくならない。
\documentclass{jlreq}
\usepackage{parskip}
\begin{document}
\section{section}
何か段落が必要
\begin{itemize}
\setlength{\parskip}{0pt} %% これだけではだめ
\item 箇条書きの項目間にも
\item アキができる
\end{itemize}
\end{document}
上記の実行結果が左図で、見出しと箇条書きの間に本文があるので項目間のアキが詰まっている。しかし本文がないと(右図)、 \setlength{\parskip}{0pt}
があってもアキが詰まらない。
この現象が起きるのはおそらく jlreq
だけで、文書クラスで設定されている \parskip
と parskip
パッケージの食い合わせの問題であるような気がする(ちなみにエンジンがuplatexでも起きる)。
またPandocか
ここまでは「そもそも日本語組版を前提としている jlreq
で parskip
パッケージを使う必要はないですねー」という話で済むのだが、困ってしまうのがPandocである。LaTeXライターが下記のような仕様なので、日本語のPDFを作るために文書クラスとして jlreq
を使おうと思うと、見出しの直下にある箇条書きで挙動を制御するのが難しくなる。
- デフォルトのテンプレートに
parskip
パッケージが埋め込まれている - 箇条書きの出力に
\setlength{\parskip}{0pt}
が埋め込まれてしまう
どうしょうもないのが上記の2つめで、このせいで「ほとんどの箇条書きは項目間にアキができないけど、見出し直後の箇条書きだけはすかすか」になる。
おとなしく --pdf-engine=xelatex documentclass=bxjsarticle -V classoption=pandoc
とでもする以外に回避策という回避策も思いつかないのだけど、このためだけに jlreq
を諦めるのも悔しいので、たとえば見出しの直後に `\mbox{}\vspace*{1.5\baselineskip}`{=latex}
と書いておくという手はあるだろう(parskip
パッケージのアキのデフォルトが .5\baselineskip
なので)。
追記:pandocの -V indent
というオプションにより、文書クラスの設定を有効にできる(parskipパッケージを埋め込まない)ようになっていたので(参考)、jlreqを使うときはこれを指定すればこの問題にはまりません
-
段落のインデントも制御できるけど今回はその話はしない。 ↩︎
Discussion