いものやま。

雑多な知識の寄せ集め

jlreqでの箇条書きのインデント調整に関して。

f:id:yamaimo0625:20191027115107j:plain

 \TeXでちょっと困るのが箇条書き(itemize環境、enumerate環境)でのインデントの調整。
いろいろ設定項目があって、よく分からなくなることが多い。
ここではjlreqドキュメントクラスを使ったときのインデントの調整方法を残しておく。


これはTeX & LaTeX Advent Calendar 2019 - Adventarの7日目の記事です。
Lua(La)TeX関係ないですが・・・

6日目はuwabamiさんのTeX on Debian 10 (Buster) - 平衡点(2019-12-06)でした。
8日目はtrueroadさんのLuaTeXで原ノ味フォントを使う - Qiitaです。

jlreqドキュメントクラス

jlreqドキュメントクラスは、日本語組版処理の要件にしたがうように作られたドキュメントクラス。

日本語文書を作る場合、jsclasses(やbxjscls)を使うことが多いと思うけど、後発のjlreqは見出しやページスタイルのカスタマイズが圧倒的に楽。
もっと実績を増やして使われるようになって欲しい・・・

bxjsclsでのカスタマイズは以下も参照:

jlreqでのカスタマイズは以下も参照:

jlreqでの箇条書きのインデント調整

jlreqで箇条書きのインデントを調整する場合、プリアンブルで\jlreqsetupおよび\setlengthを使って長さを指定する。

  • \jlreqsetupで指定
    • itemization_label_length
      ラベルの長さ(≒一行目の左マージン;マージン部分にラベルが出る)
    • itemization_labelsep
      ラベルとの間隔
  • \setlengthで指定
    • \leftmargin<X>
      (二行目以降の)左マージン(<X>はレベルの深さでiii、など)

なお、ここで言うラベルとは、itemize環境での点やenumerate環境での番号など。
また、jlreqは2019-09-24版。
(ドキュメントに記載がないので変更の可能性がある)

図で表すと、次のようになる:

f:id:yamaimo0625:20191204182002p:plain

たとえば、次のようなソースがあったとする:

\documentclass[uplatex,dvipdfmx,paper=a5,open_bracket_pos=nibu_tentsuki]{jlreq}
\usepackage{bounddvi}

% ここに設定を書く

\begin{document}
\noindent\hrulefill

\begin{itemize}
    \item あああああああああああああああああああああああああああああああああ
        \begin{itemize}
            \item いいいいいいいいいいいいいいいいいいいいいいいいいいいいい
        \end{itemize}
    \item ううううううううううううううううううううううううううううううううう
\end{itemize}

\noindent\hrulefill
\end{document}

デフォルトだとこんな出力:

f:id:yamaimo0625:20191204185724p:plain

一行目のインデントをちょうど全角一文字にしたい場合、次のようにする:

\jlreqsetup{
  itemization_label_length={1zw},
}

f:id:yamaimo0625:20191204190228p:plain

さらに、レベル2の一行目のインデントだけ全角三文字分にしたい場合は、次のようにする:

\jlreqsetup{
  itemization_label_length={1zw, ii=3zw},
}

f:id:yamaimo0625:20191204190453p:plain

ラベルとの間隔を全角一文字にしたい場合はこう:

\jlreqsetup{
  itemization_labelsep={1zw},
}

f:id:yamaimo0625:20191204190915p:plain

二行目以降の左マージンを全角三文字分にしたい場合は、こうなる:

\setlength{\leftmargini}{3zw}
\setlength{\leftmarginii}{3zw}

f:id:yamaimo0625:20191204191121p:plain

一行目と二行目以降の先頭が揃ってた方がキレイだと思うので、個人的には次のようにするといいと思う:

\jlreqsetup{
    itemization_label_length={1zw, i=2zw},% レベル1だけインデントをより深くしてみた
    itemization_labelsep={0.5zw},
}
\setlength{\leftmargini}{2.5zw}% 2+0.5
\setlength{\leftmarginii}{1.5zw}% 1+0.5

f:id:yamaimo0625:20191204191635p:plain

括弧類で始まる場合

jlreqでは括弧類が行頭にきた場合の処理をクラスオプションで指定できるようになってる。
オススメは、段落開始のときは二分空き(=半角だけ下がる)、折り返して行頭になったときは天付き(スペース入らない)になる設定。
こうすると、変なことしなくても会話文がそのまま書ける。

\documentclass[uplatex,dvipdfmx,paper=a5,
  open_bracket_pos=nibu_tentsuki,% この設定!
  ]{jlreq}
\usepackage{bounddvi}

\begin{document}
% 『響け!ユーフォニアム 北宇治高校吹奏楽部、決意の最終楽章 前編』より
机の上で丸めた手を、久美子は強く握り締めた。

「黄前久美子」

「はい!」

こうして、久美子の一年は始まった。
北宇治高校での、最後の一年が。
\end{document}

f:id:yamaimo0625:20191204194206p:plain

ただ、これがちょっと悪さして、箇条書きの先頭に括弧類がきた場合、インデントがおかしくなる場合があった。

\documentclass[uplatex,dvipdfmx,paper=a5,open_bracket_pos=nibu_tentsuki]{jlreq}
\usepackage{bounddvi}

\jlreqsetup{
    itemization_label_length={1zw},
    itemization_labelsep={0.5zw},
}
\setlength{\leftmargini}{1.5zw}

\begin{document}

\noindent\textbf{参考文献}

\begin{itemize}
    \item 『響け!ユーフォニアム』\\
        武田綾乃 著、宝島社
    \item その他もろもろ
\end{itemize}
\end{document}

f:id:yamaimo0625:20191204194831p:plain

この場合、\itemのあとに\hspace{0zw}を入れると、普通の行頭と同じように動くみたい。

ただ、上記の場合は二分空きじゃなくて天付きの方が自然に感じたので、自分は次のように\bitemというマクロを定義して使った:

\newcommand{\bitem}{\item\hspace{-0.5zw}}

\itemの代わりに\bitemを使うと、次のようになる:

f:id:yamaimo0625:20191204195543p:plain

enumerate環境に関して

itemize環境はこれまでので大体問題ないんだけど、割と困るのがenumerate環境。
というのも、ラベル部分で必要な長さがドキュメントを通して一定とは限らないから。
特に、enumerateパッケージを使ってラベルの書式を指定する場合、かなり困る。

一応、\jlreqsetupでは環境名を指定しての長さの指定もできる:

\documentclass[uplatex,dvipdfmx,paper=a5,open_bracket_pos=nibu_tentsuki]{jlreq}
\usepackage{bounddvi}

\jlreqsetup{
    itemization_label_length={1zw,enumerate={5zw}},% enumerateでは全角5文字分
    itemization_labelsep={0.5zw},
}
\setlength{\leftmargini}{1.5zw}
\setlength{\leftmarginii}{5.5zw}

\begin{document}
\noindent\hrulefill

\begin{itemize}
    \item あああああああああああああああああああああああああああああああああ
        \begin{enumerate}
            \item いいいいいいいいいいいいいいいいいいいいいいいいいいいいい
            \item ううううううううううううううううううううううううううううう
        \end{enumerate}
\end{itemize}

\noindent\hrulefill
\end{document}

f:id:yamaimo0625:20191204201212p:plain

なので、書式を特に変えないのであれば、この方法もあり。
(ただし、\leftmargin<X>は適当に変える必要がある)

ただ、次のようにenumerateパッケージを使うと途端におかしなことになる:

\documentclass[uplatex,dvipdfmx,paper=a5,open_bracket_pos=nibu_tentsuki]{jlreq}
\usepackage{bounddvi}

\usepackage{enumerate}

\jlreqsetup{
    itemization_label_length={1zw,enumerate={3zw}},
    itemization_labelsep={0.5zw},
}
\setlength{\leftmargini}{3.5zw}

\begin{document}
\noindent\hrulefill

\begin{enumerate}[(a)]
    \item あああああああああああああああああああああああああああああああああ
    \item いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
    \item ううううううううううううううううううううううううううううううううう
\end{enumerate}

\begin{enumerate}[\hbox{Step-}1.]
    \item あああああああああああああああああああああああああああああああああ
    \item いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
    \item ううううううううううううううううううううううううううううううううう
\end{enumerate}

\noindent\hrulefill
\end{document}

f:id:yamaimo0625:20191204205009p:plain

一行目の設定はjlreqによるものが反映されてるが(ただしそれもラベルの長さがそれぞれ違うので変に見える)、二行目の設定はまったくおかしくなってる。

これはなぜかというと、実はenumerateパッケージ内で\leftmargin<X>の値が書き換えられてしまってるから。

% enumerate.styより
\def\@@enum@[#1]{%
  \@enLab{}\let\@enThe\@enQmark
  \@enloop#1\@enum@
  \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
   ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
  \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
  \expandafter\let\csname the\@enumctr\endcsname\@enThe
  \csname c@\@enumctr\endcsname7
% 以下で\leftmargin<X>が変えられる
  \expandafter\settowidth
            \csname leftmargin\romannumeral\@enumdepth\endcsname
            {\the\@enLab\hspace{\labelsep}}%
  \@enum@}

ラベルの長さをそのまま\leftmargin<X>の値にされてしまってる。

これを直すには、コピペしてきて長さを設定している部分をコメントアウトする。

% enumerateパッケージの修正
\makeatletter
\def\@@enum@[#1]{%
  \@enLab{}\let\@enThe\@enQmark
  \@enloop#1\@enum@
  \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
   ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
  \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
  \expandafter\let\csname the\@enumctr\endcsname\@enThe
  \csname c@\@enumctr\endcsname7
% \leftmargin<X>の設定を無効にする
%  \expandafter\settowidth
%            \csname leftmargin\romannumeral\@enumdepth\endcsname
%            {\the\@enLab\hspace{\labelsep}}%
  \@enum@}
\makeatother

f:id:yamaimo0625:20191204205812p:plain

また、それぞれでインデントの深さを変えたい場合には、\jlreqsetupを使わずに長さを指定するしかない:

\documentclass[uplatex,dvipdfmx,paper=a5,open_bracket_pos=nibu_tentsuki]{jlreq}
\usepackage{bounddvi}

\usepackage{enumerate}

% enumerateパッケージの修正
\makeatletter
\def\@@enum@[#1]{%
  \@enLab{}\let\@enThe\@enQmark
  \@enloop#1\@enum@
  \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
   ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
  \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
  \expandafter\let\csname the\@enumctr\endcsname\@enThe
  \csname c@\@enumctr\endcsname7
% leftmargin設定を無効にする
%  \expandafter\settowidth
%            \csname leftmargin\romannumeral\@enumdepth\endcsname
%            {\the\@enLab\hspace{\labelsep}}%
  \@enum@}
\makeatother

\begin{document}
\noindent\hrulefill

{
% \leftmarginiを('(a)'の幅)+(ラベルとの間隔)に設定
\settowidth{\leftmargini}{(a)}
\addtolength{\leftmargini}{0.5zw}
\begin{enumerate}[(a)]
    \setlength{\itemindent}{0zw}% 一行目の追加のインデント
    \setlength{\labelsep}{0.5zw}% ラベルとの間隔(\leftmargini+\itemindentから左側に空白)
    \item あああああああああああああああああああああああああああああああああ
    \item いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
    \item ううううううううううううううううううううううううううううううううう
\end{enumerate}
}

{
% \leftmarginiを('Step-1.'の幅)+(ラベルとの間隔)に設定
\settowidth{\leftmargini}{Step-1.}
\addtolength{\leftmargini}{0.5zw}
\begin{enumerate}[\hbox{Step-}1.]
    \setlength{\itemindent}{0zw}% 一行目の追加のインデント
    \setlength{\labelsep}{0.5zw}% ラベルとの間隔(\leftmargini+\itemindentから左側に空白)
    \item あああああああああああああああああああああああああああああああああ
    \item いいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいいい
    \item ううううううううううううううううううううううううううううううううう
\end{enumerate}

\noindent\hrulefill
\end{document}

f:id:yamaimo0625:20191204210727p:plain

ここまで頑張ると、いい感じになる。
このあたりは改善されるといいんだけど・・・

今日はここまで!