abenori / jlreq

Other
125 stars 18 forks source link

見出しが複数行になると、前後の文章に重なる #79

Closed tkurita closed 3 years ago

tkurita commented 3 years ago

例えば、

\documentclass[uplatex,dvipdfmx]{jlreq} \begin{document} 本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文 \subsubsection{サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション サブサブセクション} 本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文 \end{document}

のようなコードの場合、サブセクションの内容が前後の本文に重なります。

abenori commented 3 years ago

jlreq.cls内部での\subsubsectionは一行取りで定義されていますので,複数行になるとはみ出てしまいます.なので,そのような箇所が文書内にある場合は,\subsection\RenewBlockHeading\ModifyHeadingで定義し直してはみ出ないようにされるとよいかと思います.

abenori commented 3 years ago

なお,内部マクロをいじればはみ出る場合に行取りを動的に変更することは可能です.ただし,このようなことが通常行われるのかは自分にはわかりません.以下は行取りを担当しているマクロ\jlreq@BlockHeading@start@gyodoriを改変した例です.jlreqのアップデートに伴い機能しなくなる可能性が当然あります.

\makeatletter
\long\def\jlreq@BlockHeading@start@gyodori#1#2#3#4{\par{%
  \setbox\jlreq@tempboxa=\vbox{#4}%
  \jlreq@tempskipa=0pt
  \jlreq@tempskipb=0pt
  \jlreq@tempskipc=0pt
  \jlreq@BlockHeading@start@analyzespace#1:\jlreq@endmark
  \let\jlreq@maeakitype=\jlreq@resulta
  \let\jlreq@maeaki=\jlreq@resultb
  \jlreq@BlockHeading@start@analyzespace#2:\jlreq@endmark
  \let\jlreq@ushiroakitype=\jlreq@resulta
  \let\jlreq@ushiroaki=\jlreq@resultb
  \def\jlreq@lines{#3}%
  \ifx r\jlreq@maeakitype\ifx r\jlreq@ushiroakitype\def\jlreq@lines{}\fi\fi
  \setbox\jlreq@tempboxb=\hbox{阿}%
  %%%%%%%%%%%%%%%%%%%%%%挿入
  \ifdim\dimexpr\ht\jlreq@tempboxa + \dp\jlreq@tempboxa\relax > \dimexpr\jlreq@lines \baselineskip\relax
    \jlreq@tempdima=\dimexpr\ht\jlreq@tempboxa + \dp\jlreq@tempboxa + \baselineskip\relax
    \divide\jlreq@tempdima by \baselineskip
    \edef\jlreq@lines{\the\numexpr\jlreq@tempdima\relax}%
  \fi
  %%%%%%%%%%%%%%%%%%%%%%
  \ifx\jlreq@lines\@empty
    \ifx\jlreq@maeaki\@empty\else
      \ifx a\jlreq@maeakitype
        \jlreq@tempskipc=\glueexpr\jlreq@maeaki\relax
      \else
        \jlreq@tempskipa=\glueexpr\jlreq@maeaki\relax
      \fi
    \fi
    \ifx\jlreq@ushiroaki\@empty\else
      \jlreq@tempskipb=\glueexpr\jlreq@ushiroaki\relax
    \fi
  \else
    % #3 -> \jlreq@lines
    \jlreq@tempdima=\glueexpr(\jlreq@lines\baselineskip - \baselineskip - \ht\jlreq@tempboxa - \dp\jlreq@tempboxa)\relax
    \ifx\jlreq@maeakitype\@empty
      \jlreq@tempskipa=\glueexpr(\jlreq@tempdima + \dp\jlreq@tempboxb - \ht\jlreq@tempboxb)/2\relax
    \else
      \ifx a\jlreq@maeakitype
        \jlreq@tempskipa=\glueexpr(\jlreq@tempdima + \dp\jlreq@tempboxb - \ht\jlreq@tempboxb)/2\relax
        \jlreq@tempskipc=\glueexpr\jlreq@maeaki\relax
      \fi
      \ifx s\jlreq@maeakitype
        \jlreq@tempskipa=\glueexpr(\jlreq@tempdima + \dp\jlreq@tempboxb - \ht\jlreq@tempboxb)/2 + \jlreq@maeaki\relax
        \jlreq@tempdima=\dimexpr\jlreq@tempdima + \jlreq@maeaki\relax
      \fi
      \ifx r\jlreq@maeakitype
        \jlreq@tempskipa=\glueexpr\jlreq@maeaki\relax
        \jlreq@tempdima=\dimexpr\jlreq@tempdima + \baselineskip - \dp\jlreq@tempboxb\relax
      \fi
    \fi
    \ifx\jlreq@ushiroakitype\@empty
      \jlreq@tempskipb=\glueexpr\jlreq@tempdima - \jlreq@tempskipa\relax
    \else
      \ifx a\jlreq@ushiroakitype
        \jlreq@tempskipb=\glueexpr\jlreq@tempdima - \jlreq@tempskipa + \jlreq@ushiroaki\relax
      \fi
      \ifx r\jlreq@ushiroakitype
        \jlreq@tempskipb=\glueexpr\jlreq@ushiroaki\relax
        \jlreq@tempskipa=\glueexpr\jlreq@tempdima - \jlreq@tempskipb + \baselineskip - \ht\jlreq@tempboxb\relax
      \fi
    \fi
  \fi
  \jlreq@ifgluezero\jlreq@tempskipc{}{\vskip\jlreq@tempskipc\relax}%
  \ifx r\jlreq@maeakitype\prevdepth=-1000pt\fi
  \jlreq@tempdimb=\ht\jlreq@tempboxa
  \jlreq@tempdimc=\dp\jlreq@tempboxa
  \setbox\jlreq@tempboxa=\vbox{%
    \jlreq@ifgluezero\jlreq@tempskipa{}{\vskip\jlreq@tempskipa}%
    \unvbox\jlreq@tempboxa
  }%
  \ifx\jlreq@lines\@empty
    \dp\jlreq@tempboxa=\dimexpr\dp\jlreq@tempboxa + \ht\jlreq@tempboxa - \jlreq@tempdimb\relax
    \ht\jlreq@tempboxa=\jlreq@tempdimb
    \box\jlreq@tempboxa
    \ifx r\jlreq@ushiroakitype\prevdepth=-1000pt \else\prevdepth=\jlreq@tempdimc\fi
  \else
    \dp\jlreq@tempboxa=\dimexpr\dp\jlreq@tempboxa + \ht\jlreq@tempboxa\relax
    \ht\jlreq@tempboxa=0pt
    \box\jlreq@tempboxa
    \ifx r\jlreq@ushiroakitype\prevdepth=-1000pt \else\prevdepth=0pt \fi
  \fi
  \nobreak
  \jlreq@ifgluezero\jlreq@tempskipb{}{\vskip\jlreq@tempskipb}%
  \edef\jlreq@do{%
    \ifdim\parskip=0pt \else
      \unexpanded{\def\jlreq@parhook@gyodori}{%
        \noexpand\parskip=\the\parskip
        \unexpanded{\def\jlreq@parhook@gyodori{}}%
      }%
      \unexpanded{\parskip=0pt}%
    \fi
  }%
  \expandafter}\jlreq@do
}
\makeatother
tkurita commented 3 years ago

コメントありがとうございます。ujarticle をもっぱら使っていますが、ujarticle では見出しが複数行にわたっても前後の文章と重なることはありません。固定するより、そのような振る舞いの方が便利ありがたいと感じます。

abenori commented 3 years ago

行取りすることにこだわらないということでしたら,before_spaceとafter_spaceを\subsubsectionに設定してやれば,上下に必ずこれらで指定した空きが入りますので,はみ出すことはなくなると思います.(なお,\subsubsectionは別行見出しとして実装されています.)または,ujarticleの\subsubsectionの定義をそのままもってくればujarticleのものと同じ挙動の見出しが実現できます.

tkurita commented 3 years ago

コメントありがとうございます。「before_spaceとafter_spaceを\subsubsectionに設定」するにはどうすれば良いのでしょうか?どうにもやり方が見つからず、ヒントをいただければ。

abenori commented 3 years ago

例えば\RenewBlockHeading{subsubsection}{3}{before_space=10pt,after_space=10pt}または\ModifyHeading{subsubsection}{before_space=10pt,after_space=10pt}のようにしてください.設定は\NewBlockHeadingが受け付けるものと同じものを受け付けます.詳細はREADME-ja.mdをご覧ください.

tkurita commented 3 years ago

ありがとうございます。\ModifyHeading の方は、効果がありませんでした。 \RenewBlockHeadingだと、前後の文章とかさらないようになりましたが、すべての属性を自分で設定しなければならないのが、少々面倒でしょうか。

abenori commented 3 years ago

前に設定されていたbefore_linesが生き残ってしまっているようです.後ほど直しておきます.とりあえずは\ModifyHeading{subsubsection}{before_lines={},before_space=10pt}と打ち消しておけば有効になるかとは思います.

tkurita commented 3 years ago

ありがとうございます。所望の動作が得られました。