📝

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 だけで、文書クラスで設定されている \parskipparskip パッケージの食い合わせの問題であるような気がする(ちなみにエンジンがuplatexでも起きる)。

またPandocか

ここまでは「そもそも日本語組版を前提としている jlreqparskip パッケージを使う必要はないですねー」という話で済むのだが、困ってしまうのが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を使うときはこれを指定すればこの問題にはまりません

脚注
  1. 段落のインデントも制御できるけど今回はその話はしない。 ↩︎

Discussion