箇条書きの行間を詰める

箇条書きの行間を詰める

- t bz の投稿
返信数: 7

下記のように毎回行間を詰めていますが、これをプリアンブルに記述することはできないでしょうか?

\begin{itemize}
    \setlength{\parskip}{0zw}
    \setlength{\itemsep}{0zw}
    \item あああ
    \item いいい
    \item ううう
\end{itemize}

\begin{enumerate}
    \setlength{\parskip}{0zw}
    \setlength{\itemsep}{0zw}
    \item あああ
    \item いいい
    \item ううう
\end{enumerate}

\begin{description}
    \setlength{\parskip}{0zw}
    \setlength{\itemsep}{0zw}
    \item あああ
    \item いいい
    \item ううう
\end{description}

t bz への返信

Re: 箇条書きの行間を詰める

- m c の投稿
いくつか方法はありますが,enumitemパッケージを使うのが簡単だと思います.
\usepackage{enumitem}
\setlist{nosep}

リスト環境を様々にカスタマイズできますので,詳細はドキュメントをご覧ください(texdoc enumitem).
m c への返信

Re: 箇条書きの行間を詰める

- t bz の投稿

返信が遅くなりまして申し訳ございません。

enumitemパッケージを使うことで問題が解決いたしました。

この度はお世話になりました。

t bz への返信

Re: 箇条書きの行間を詰める

- ut の投稿
# 既に問題はご解決済みですので、安心して(?)口を挟まさせて
# いただけます。こういう「後出しじゃんけん」スタイルが、私に
# は似つかわしいようです。

「いくつかある」方法のうち、私でも思いつくものを挙げてみますと、

(1)定義そのものをコピーしてきて、書き足す
(2)変更を書き足した環境を、別名の環境にする
(3)\let でコピーしてから、それを使って再定義する
(4)\g@addto@macro で書き足す
(5)etoolbox.sty の \appto や \apptocmd を使って書き足す

とかでしょうか。

ちゃんとは確認してませんので、うまくいかなかったり、副作用が
あったりするものもあるかも知れません。

最初に、見やすさを考えて、変更をひとまとめにしておきます:
  \newcommand{\myalteration}{\itemsep0pt\parsep0pt\parskip0pt}

(1)定義そのものをコピーしてきて、書き足す
latex.ltx とか、お使いのクラスファイルから、itemize 等々の定義
を丸々コピーしてきて、\list の第 2 引数に必要な変更を書き足すと
いう直接的なやり方です:

  \makeatletter
  \def\itemize{%
    \ifnum \@itemdepth >\thr@@\@toodeep\else
      \advance\@itemdepth\@ne
      \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
      \expandafter
      \list
        \csname\@itemitem\endcsname
        {\def\makelabel##1{\hss\llap{##1}}\myalteration}%
    \fi}
  \makeatother


(2)変更を書き足した環境を、別名の環境にする
とても素直なアプローチかと:

  \newenvironment{myitemize}{\begin{itemize}\myalteration}{\end{itemize}}


(3)\let でコピーしてから、それを使って再定義する
ある意味古典的なやり方だと思います:

  \let\originalitemize\itemize
  \renewcommand{\itemize}{\originalitemize\myalteration}


(4)\g@addto@macro で書き足す
カーネルが変更されるとうまくいかなくなる可能性があります:

  \makeatletter
  \g@addto@macro{\itemize}{\myalteration}
  \makeatother


(5)etoolbox.sty の \appto や \apptocmd を使って書き足す
これが安全な方法なのでしょう:
(\AtBeginEnvironment というのも用意されてますが、説明を読
む限り環境の冒頭に追加されるっぽいので、試してません)

  \usepackage{etoolbox}
  \appto{\itemize}{\myalteration}


※ なお、\list の第 2 引数の中でしか変更できないパラメータの
  場合には、\myalteration を \list の後ろに追加している(2)
  ~(5)の方法では、多分うまくいきません。
  逆に、今回変更したパラメータに関しては \list の第 2 引数の
  外でも変更可能みたいですので、(1)で \myalteration を \list
  の後ろに追加してみても一応うまくいきました。
ut への返信

Re: 箇条書きの行間を詰める

- m c の投稿
utさん,「いくつか」のご紹介をありがとうございます.
私もenumitemを知るまでは,(1)でひたすら愚直にカスタマイズしていました.
# 10階層まで作っていたので,各階層ごとにparsepやitemsepを書くのは面倒でした(^^;
m c への返信

Re: 箇条書きの行間を詰める

- ut の投稿
既に解決済のトピックに余計な口出しをしているのですから、疎ま
しくお感じになられてもおかしくないところ、寛容なご応答をして
くださいまして、ありがとうございます。

なお、後出しのさらに後出しですけれど、

(2)は、\NewDocumentEnvironment
(3)は、\NewCommandCopy と \RenewDocumentCommand

を使ったほうが、今どきだったかも知れません。

enumitem パッケージについては、The LaTeX Companion, 3rd, 2023
を最初手にした際に、その解説に 20 ページも割かれていて驚いた
ことを覚えています。
ut への返信

Re: 箇条書きの行間を詰める

- Yamamoto Munehiro "munepi" の投稿
以下、雑談です。

> (1)定義そのものをコピーしてきて、書き足す
> (2)変更を書き足した環境を、別名の環境にする
> (3)\let でコピーしてから、それを使って再定義する
> (4)\g@addto@macro で書き足す
> (5)etoolbox.sty の \appto や \apptocmd を使って書き足す
いずれもがなかなか難しくなりつつあると思っています。
「これがいま動いているものの本当に定義である」を探すのがたいへんですよね。

LaTeX kernelのものを引っ張ってきたとしても、それ以降に読み込んでいる何かが勝手に上書きしていたとか、Hookで\begin{document}以降なり、何かのパッケージ前後で勝手に上書きされているとか、本当はすべてを完全に把握した上で、初めてできることだと思います。

例えば、hyperrefパッケージを読み込んだ時点で、通常のクラスファイルさえも影響しますし、hyperrefパッケージが前提としているパッケージの挙動さえも変わってしまうものがありますし、なんなら\begin{document}...\end{document}中の記法を厳密にhyperrefの挙動に合わせる必要に迫られたりします。なので、hyperrefパッケージを読み込む場合、hyperrefパッケージの挙動で大事なところを把握することが必要になります。

実際には、ちょっとしたものを書き換えるものに依って、
・だいたいまぁまぁ動く、
・前後のパッケージの影響でなんかちょっとおかしくなる(それに気付かないで、そのちょっとおかしい状態さえも仕様となる)
などあると思います。

本末転倒ですが、いまLaTeXでコンパイルしようとしている文章を、できるかぎり全体を把握して、変える必要があると思います。
Yamamoto Munehiro "munepi" への返信

Re: 箇条書きの行間を詰める

- ut の投稿
貴重なご返信をありがとうございます!

無意識のうちに「古き良き法」の感覚にどっぷりと浸かってしまっ
ていたようです。
(←「古き良き法(gutes altes Recht)」なんて考えを知ったのは
学部生の頃なので、これについてさえ、私の理解は実はもう時代遅れ
なのかも知れませんが…)

最近記憶力の減退が激しく、munepi さんのご返信をお読みしてよう
やく、昨年末の ZR さんの記事を思い出しました:

  重点解説! イマドキのLaTeXの“命令フック機能”
  https://qiita.com/zr_tex8r/items/70ba9e910c8d265307fa

(先の私の投稿で「今どき」という言葉を使っていたのは単なる
偶然です)

現在の LaTeX を扱う際に、昔ながらの知識を無自覚にあてはめるの
は危険ということを、よくよく肝に銘じるようにいたします。