abenori / jlreq

Other
126 stars 18 forks source link

前付ページ番号がローマ数字に固定されている #34

Closed kmuto closed 5 years ago

kmuto commented 5 years ago

jsbook由来だと思うのですが、現状は\frontmatterで\pagenumbering{roman}、\mainmatterで\pagenumbering{arabic}と直接表記されているため、前付が必ずローマ数字、本文に入って数字リセットで1始まりのアラビア数字、という表現から逃れるにはマクロごと書き換えなければなりません。

JLREQ 2.6.3 gではページ番号(ノンブル)については通しノンブルも別ノンブルもあるとなっているので、調整可能になっていると嬉しいです。

abenori commented 5 years ago

痛いところを突かれました.うまく整理仕切れず苦しまぎれのが現在です.

やはり「\fontmatterを再定義する」のはなしでしょうか?(LaTeX的にはどうなんでしょう?>識者の方)(jlreq.cls内ではある程度汎用的にするためにちょっとややこしくなっていますが,再定義は簡単だと思います.)


話を変えて,マクロ再定義ではなく,インターフェースを用意する場合の話です.とりあえず

\jlreqsetup{
  frontmatter = {
    pagenumbering = roman,
    clearpage = cleardoublepage,
    pagestyle = plain,
    headings = {
      _chapter = {label_format={},after_label_space=0pt},
      restore_at_mainmatter = {_chapter}
    }
  }
}

というのを想像しました.これに応じて\frontmatterを適当に定義するという感じです.

これは前付などを主に据えた例になりますが,ページ数を主に据えると

\jlreqsetup{
  page_numbering_frontmatter = roman,
  page_numbering_mainmatter = arabic
}

のような感じでしょうか.


どうでしょう?(ってなんだか答えにくいお返事になってしまいましたが…….)

abenori commented 5 years ago

ちなみに前付とかって本文とはどういう部分が異なる(可能性がある)のでしょうか?

kmuto commented 5 years ago

\frontmatter再定義だと、「単にノンブルを変える」という目的に対して手段がちょっと大きいかなと感じていました(review-jsbookでもちょっと困っています…)。通しノンブルにするなら\mainmatterも再定義が必要ですね。 ただ、「たかが17行ぶんのマクロ再定義」とも言えるので、「そういう仕様だ」と通すのはアリではあります。

インターフェイスについては前者側はだいぶヘビーな感じがするので、後者でも十分かも。ただ「通しノンブル」としたいときに、frontmatter=arabic,mainmatter=arabicとするのか、はたまたmainmatter=throughみたいな謎ワードを生み出すかなど悩みそうです。

前付について異なる面というと、思いつくのは…

munepi commented 5 years ago

色々とやり方はあると思いますけれども、「通しノンブル」のみに関しては、(よく分かっていない end user 側が) \frontmatter\mainmatter をいじることのほうが、制御しきれずに影響がデカいです。ましてや、 \LoadClass{jlreq} している側で \frontmatter\mainmatter を再定義していると、 jlreq 側のそれらの定義が変わったときに追従する手間が発生してしまいます。

それゆえ、通しノンブルのより本質的な \pagenumbering の定義のみを変えてしまうほうが、保守性が高いと思います。実際にkernelで以下だけですし。

%%% From File: ltpageno.dtx
\message{page nos.,}
\countdef\c@page=0 \c@page=1
\def\cl@page{}
\def\pagenumbering#1{%
  \global\c@page \@ne \gdef\thepage{\csname @#1\endcsname
   \c@page}}
abenori commented 5 years ago

インターフェイスについては前者側はだいぶヘビーな感じがするので、後者でも十分かも。

前者でもライトにはできるかなと思います.どちらかというと「前付である」が主か「ノンブルである」が主かという感じで.例えば前付きでのノンブルと\chapterの採番の有無を指定するとして,次のどっちの方が直感的でしょうか?

  1. 前付き=「ノンブルroman,\chapter採番なし」,本文=「ノンブルarabic,\chapter採番あり」
  2. ノンブル=「前付きroman,本文arabic」,\chapter採番=「前付きなし,本文あり」

通しノンブルは忘れていました.謎ワードは格好悪いですね…….


\frontmatter等を再定義する場合.

ましてや、\LoadClass{jlreq} している側で \frontmatter\mainmatter を再定義していると、 jlreq 側のそれらの定義が変わったときに追従する手間が発生してしまいます。

この方針の場合,jlreq内で定義されている\frontmatter等はあくまで「デフォルト設定」と捉え,その部分の変化は影響を与えないように設計することになると思います.また,jlreqが提供する機能を使って必要なことはできるようにするつもりです.(例えばの例を末尾に加えます.)

ただ,インターフェースを用意するのに比べてユーザの作業は重くなるとは思います.

個人的にカーネルで定義された部分の上書きはできる限りしたくない……


\renewcommand*{\frontmatter}{%
  \cleardoublepage
  \setboolean{@mainmatter}{false}%
  \SaveHeading{chapter}{\SavedChapter}%
  \ModifyHeading{chapter}{label_format={},after_label_space=0pt}%
  \pagestyle{plain}%
  \pagenumbering{roman}%
}
\renewcommand*{\mainmatter}{%
  \cleardoublepage
  \setboolean{@mainmatter}{true}%
  \pagestyle{headings}%
  \SavedChapter
  \setcounter{chapter}{0}%
  \pagenumbering{arabic}%
}
abenori commented 5 years ago

上記の例ですが,\LoadClass{jlreq}されている場合の例ではなくて,実際にjlreqを使っているユーザがプリアンブルに書くコードの例ですね.例えば本文のページスタイルがheadingsに固定されていますが,これはスタイルを決めてしまったユーザだからこそかけるコード.

kmuto commented 5 years ago

この場合だと

前付き=「ノンブルroman,\chapter採番なし」,本文=「ノンブルarabic,\chapter採番あり」

の記法のほうが直感的に思います。通しノンブルはjlreq英語版だと「serial pagination」という名前が付いていますね。

abenori commented 5 years ago

通常「前付きは通しノンブルで」という指定が行われているのではないかと想像し,次のような感じで\jlreqsetupに加えてみました.c170a7e です.

\jlreqsetup{
  frontmatter_pagination={arabic,independent},
  mainmatter_pagination=roman,
  backmatter_pagination={roman,continuous},
}

mainmatterにはスタイルだけを指定します.frontmatterとbackmatterにはスタイルとcontinuous(通しノンブルの時)かindependent(別ノンブルの時)を指定します.

とりあえず書いてみただけなので,バグっているかもしれません.指定方法の提案ということで.他にもfrontmatter***とかmainmatterとかbackmatter_とかを色々と入れてみています.