箇条書きの行間を詰める

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

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

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

(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でコンパイルしようとしている文章を、できるかぎり全体を把握して、変える必要があると思います。