Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

縦組クラス #30

Closed
aminophen opened this issue Dec 31, 2016 · 26 comments
Closed

縦組クラス #30

aminophen opened this issue Dec 31, 2016 · 26 comments

Comments

@aminophen
Copy link
Member

forum:2112 の話に関連して:

[1] tbook でタイトルの前に空ページが入るのは変?

\documentclass{tbook}
\title{縦書きのテスト}
\author{○○○○}
\begin{document}
\maketitle
あいう
\end{document}

[2] 目次、部、章の始まりが全て奇数ページにする openleft オプション、\cleardoublepage?

[3] 著者名が中揃えよりは下揃えが見栄え的に良い?

[4] tbook で \thanks の数字が寝るのは変?(現在は本文側は直立、傍注側は寝る)

\documentclass{tbook}
\title{タイトル}
\author{著者\thanks{所属}}
\begin{document}
\maketitle
本文
\end{document}

挙動を変えていいのかどうか、オプションを付ければ切り替わるように? など可能性が少しでもあるものを列挙しておきます。TeX Live 2017 頃までの TODO として。

@kmaed
Copy link
Member

kmaed commented Dec 31, 2016

[1] について,titlepage 環境の最初に \cleardoublepage が入っているので,タイトルが偶数ページに来るように空白ページが入るのでしょうが,果たしてこれが意図通りの挙動なのでしょうか.

ついでに,pldoc.pdf の titlepage の項を見ていると,

二段組モードでなければ、タイトルページの直後のページのページ番号も 1 にし
ます。

     \if@twoside\else
       \setcounter{page}\@ne
     \fi
   }
\fi

とあるのですが,説明通りの意図ならば \if@twocolumn の間違いではないかと疑っています.

[2] はあっても良いのではと個人的には思います.文庫本なんかだと左起こしの方が多いような気がしますし.もちろん互換性は維持したうえでの話です.

[3] は現状維持でよいのでは.

[4] は結果を見てみただけですが,確かに妙な感じがします.

@aminophen
Copy link
Member Author

[4] は簡単には \hbox{\yoko ...} を足して

\def\p@thanks#1{\footnotemark
  \protected@xdef\@thanks{\@thanks
    \protect{\noindent\hbox{\yoko$\m@th^\thefootnote$}#1\protect\par}}}

にすると違和感がなくなります。なお、pldoc.pdf の

縦組のときは、\thanks コマンドを \p@thanks\let します。このコマンドは \footnotetext を使わず、直接、文字を \@thanks に格納していきます。

の意図はよく理解できていません。挙動的には \p@thanks が使われるのは「縦組かつ [titlepage] のときだけ」で、notitlepage だと * †、titlepage だと 1, 2 になります。

@aminophen
Copy link
Member Author

あけましておめでとうございます。本年もよろしくお願いします。

[1] の \cleardoublepage はちょっとよくわかりません。推測ですが

  • 本家 LaTeX の book は openright がデフォルト。単純に訳すと openright = 右起こし である。
  • 本家と合わせる思想の pLaTeX も、自然な流れとして右起こしを採用。結果的に、縦組は(現実の縦組出版は左起こしが多いにもかかわらず)右起こしに決定。
  • これを実現するため、縦組では \cleardoublepage を偶数ページ開きになるよう改変した。結果として、章や節と同時にタイトルページも右起こしに。 → これが意図的なの?がいまの論点。

なお、kmaed さんご指摘の

ついでに,pldoc.pdf の titlepage の項を見ていると,

とあるのですが,説明通りの意図ならば \if@twocolumn の間違いではないかと疑っています.

は、コードの方は LaTeX2e の classes.pdf と同じなので

If we are not in two-side mode the first page after the title page should also get page number 1.

これを単に日本語訳しようとして訳し間違えたと思われます。ドキュメントを直します。

@kmaed
Copy link
Member

kmaed commented Jan 3, 2017

これを単に日本語訳しようとして訳し間違えたと思われます。

本当ですね.ありがとうございます.

@aminophen
Copy link
Member Author

twoside の訳を c3caf47 で「両面」にしました。

先日 66fb747 で入れた openany の修正 (texjporg/jsclasses#48) と今回の誤訳修正は master に commit しましたが、これ以外の変更は未確ということでブランチを切りましょう。

@KITAMI-Ken
Copy link

TeXQ&A にときどき書き込んでいる 北見 けん です。
こちらには初めて来ました。よろしくお願いいたします。

[1]と[2]に関連して、\cleardoublepage の扱いについて。

この件を検討する上で、
LaTeX および pLaTeX 本体における \cleardoublepage の定義についての問題と、
文書クラス(book, jbook, jsbook など)の \chapter などにおける
\cleardoublepage の利用の仕方についての問題を、
はっきり切り分ける必要があるように思います。

LaTeX 本体では \cleardoublepage は
「奇数ページになるまでページを繰る命令」として定義されていて、
たまたま結果として、横書きでは右ページになるまでページを繰ることになっています。
pLaTeX 本体では、これが、
「(縦書きでも横書きでも)右ページになるまでページを繰る命令」になるように目論んで、
「横書きでは奇数ページになるまで、縦書きでは偶数ページになるまでページを繰る命令」として
再定義されています。(pldoc にその旨が説明されています。)

その上で、文書クラスにおいては、どの文書クラスでも、
\chapter の定義は openany か openright のクラスオプションに応じて、
\clearpage で始めるか \cleardoublepage で始めるかを選ぶようになっています。

そこで、問題点は
[A] pLaTeX 本体における「\cleardoublepage の右ページ起こし化」は妥当か?
[B] クラスファイルにおける「openright の \cleardoublepage への紐づけ」は妥当か?
というように分けて考えるのがよいのではないでしょうか。

そもそも、LaTeX 本体の設計時に、横書き左綴じの書籍しか考慮せずに、
「奇数ページ起こし」を「右ページ起こし」と同一視して用語を混同したのが不味かったのだろうと思います。

互換性を考慮せずに根本的に設計を変えるとするならば、
(p)LaTeX 本体のほうでは \cleardoublepage の代わりに、
\cleartooddpage(奇数ページになるまでページを繰る命令)
\cleartoevenpage (偶数ページになるまでページを繰る命令)
\cleartorightpage(右ページになるまでページを繰る命令)
\cleartoleftpage(左ページになるまでページを繰る命令)
の4つ(のうち実用的ないくつか)を用意するようにして、
クラスファイルのほうではページ起こしオプションとして
openany, openright, openleft, openodd, openeven を用意して、
オプションに応じて \chapter の定義で \clearto****page を使い分けるようにするのがよいと思います。

まあ、互換性は簡単に捨てるわけにはいかないので、この案は採用できなさそうですが。

で、今後どのように変更するとしても、少なくとも上に書いた [A] と [B] の問題点を
はっきりと意識した議論をする必要があるのではないかということが、いいたいことでした。

いきなりの長文で失礼いたしました。

@aminophen
Copy link
Member Author

北見さん、こちらでもよろしくお願いいたします。

そこで、問題点は
[A] pLaTeX 本体における「\cleardoublepage の右ページ起こし化」は妥当か?
[B] クラスファイルにおける「openright の \cleardoublepage への紐づけ」は妥当か?
というように分けて考えるのがよいのではないでしょうか。

ありがとうございます。実は考えをまとめる時間がとれず書いていませんでしたが、私も漠然とそのあたりのことが気にかかっています。いろいろ迷いますが、標準以外のクラスも考慮すると、[A] にあたる「\cleardoublepage がカーネルで再定義される」ということ自体は変えてはいけない気もしますね。

(あと私事ですが、1〜2月は議論や考察に対して私が充分な時間をとれないと思います。事実誤認などあるかもしれませんので、その際はどなたでも仰ってください。)

@KITAMI-Ken
Copy link

早速レスポンスいただきありがとうございます。

いろいろ迷いますが、標準以外のクラスも考慮すると、[A] にあたる「\cleardoublepage がカーネルで再定義される」ということ自体は変えてはいけない気もしますね。

やはり (p)LaTeX カーネルの変更は影響が大きいですね。
pLaTeX の \cleardoublepage を LaTeX のものに戻すような案が散見されますが、
pLaTeX で再定義されてこれまで使われてきた(かもしれない)現行の定義はいじらずに、
文書クラス毎に、ページ起こしオプションの意味づけを独自に拡充再定義して、
文書クラス内部ではカーネルの \cleardoublepage を使わずに、
再定義したページ起こしオプションの意味づけにマッチした \cleartooddpage 相当の内部マクロを
使うというのが、現実的な解ではないかという気がしてきました。

多くの方から意見が集まるといいですね。

@aminophen
Copy link
Member Author

あまりよく考えていませんが、おもしろそうだなと思ったのは

\cleartooddpage(奇数ページになるまでページを繰る命令)
\cleartoevenpage (偶数ページになるまでページを繰る命令)
\cleartorightpage(右ページになるまでページを繰る命令)
\cleartoleftpage(左ページになるまでページを繰る命令)

という北見さんの発想でした。これを (p)LaTeX カーネルに「追加する」のはアリではないかという気がしています。もちろん \cleardoublepage は従来どおりの挙動とし、互換性を崩さないという前提です。「古い pLaTeX + 新しいクラス」でもエラーにならないように、クラス毎に追加するほうがよいのかもしれませんが、どうせならカーネルに…と思わなくもない、という一つの意見です。

@munepi
Copy link
Member

munepi commented Jan 7, 2017

北見さんの発想と同様なことを、クラスファイル側に追加してすでにやっています。

某弊社では、cls(dtxにいたる)内で横書き、縦書きそれぞれに改丁に関する命令を追加しています。具体的なマクロは以下のとおりです。

横書き

% \def\cleardoublepage{\clearpage\if@twoside\ifodd\c@page\else
%   \hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\let\cleardoublepage@right\cleardoublepage
\def\cleardoublepage@left{\clearpage\if@twoside\ifodd\c@page
  \hbox{}\thispagestyle{empty}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\let\clearoddpage\cleardoublepage@left

縦書き

\def\cleardoublepage{\clearpage\if@twoside\ifodd\c@page\else
  \hbox{}\thispagestyle{empty}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\let\cleardoublepage@left\cleardoublepage
\def\cleardoublepage@right{\clearpage\if@twoside\ifodd\c@page
  \hbox{}\thispagestyle{empty}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\let\clearoddpage\cleardoublepage@right

クラスオプションで各見出しにおける開始頁起こしの制御

基本的に(1つの製作プロジェクトに含まれる) LaTeX 文章内に、 \cleardoublepage, \clearoddpage を書かないで済むようにしたいです。

そこで、各見出しにおける開始頁起こしは、クラスオプションで <見出し>=<value> として制御できるようにしています。

  • <見出し>: part:break-before, chapter:break-bebore, section:break-before (部、章がほとんど、節はたまに、CSS3 の名前に習っています)
  • <値>: right, left, page (縦横にかかわらず、改丁は絶対的に指定できるようにしておくと、右起こし、左起こし、右開き、左開きとかの言葉に惑わされない :D 、page は成り行き)

なお、このような制御をやりだすと、 \frontmatter, \mainmatter, \backmatter, \tableofcontents (場合によって、 \appendix \begin{theindex}, \begin{thebibliography} も)に対しても、開始頁起こしを同様に <宣言>=<値> を決定できるようにしておく必要があります。

さらに、前付 \fronamatter や後付 \backmatter (いわゆる、付き物)中における \chapter だけ成り行きにして、本文 \mainmatter 中における \chapter は改丁に動くようにするなどやりだすと…、この手の各種宣言、見出しにおける開始頁の制御の仕様を考える必要がありますね。

ここまで汎用クラスファイルで用意するかどうかはまた別の話かもしれません。

@KITAMI-Ken
Copy link

いろいろ迷いますが、標準以外のクラスも考慮すると、[A] にあたる「\cleardoublepage がカーネルで再定義される」ということ自体は変えてはいけない気もしますね。

やはり (p)LaTeX カーネルの変更は影響が大きいですね。
pLaTeX の \cleardoublepage を LaTeX のものに戻すような案が散見されますが、
pLaTeX で再定義されてこれまで使われてきた(かもしれない)現行の定義はいじらずに、

この点についてですが、pLaTeX および標準クラスのこの挙動に合わせた運用がこれまで実際になされていたという報告です。 TeX Q&Aの いな んずさんの書き込みです。
pLaTeXの縦書き書籍を片ページ起こし(縦書きなので、片ページ起こしといえば左ページ起こしであり、つまり奇数ページ起こしです)にしたいとき、文書クラスの openright オプションは右ページ起こしになってしまい使えないので、あえて openany にした上で必要に応じて手動で \clearpage を入れているということのようです。(〝手動゛のところはマクロで自動化しているのかもしれません。)

これだとやはり、すでに運用されていた仕様は追認しないと困ることになりそうですから、縦書きでの左ページ起こしオプションの「追加」が無難なところですね。どんなオプション構造がいいか、munepi さんが紹介なさっている方法も参考になります。

@aminophen
Copy link
Member Author

出来るところから進めていきたいと思います。今までの話でいくと

[2] 目次、部、章の始まりが全て奇数ページにする openleft オプション、\cleardoublepage?

は従来の挙動を維持したままオプション追加ということでよいですかね。実装方法は、\celarナントカ を必要なだけクラスファイルに追加することになるでしょうか。

これに少し絡んできますが

[1] tbook でタイトルの前に空ページが入るのは変?

これはどうなのでしょう。\cleardoublepage が \maketitle に入っているのが原因ですが、「従来の挙動を維持したまま」のほうがよいのかどうか。この挙動を前提にした運用が今までされてきたのか、という点について、ご存知の方はいらっしゃいますか?

[3] 著者名が中揃えよりは下揃えが見栄え的に良い?

現状でなにもしない。

[4] tbook で \thanks の数字が寝るのは変?(現在は本文側は直立、傍注側は寝る)

これはどう見ても私には奇妙なのですが、修正ということで入れてよいでしょうか? 挙動が変わると困る場合があれば仰ってください。

@aminophen
Copy link
Member Author

aminophen commented Feb 3, 2017

本 issue #30 の実装を進めるため、tatecls ブランチを切りました。手始めに 8bff00c\p@thanks の番号を直立にするコードを入れました。

% 著者名の脇に表示される合印は直立した数字、注釈側は横に寝た数字となっていまし
% たが、不自然なので|\hbox{\yoko ...}|を追加し、両方とも直立するようにしました。
% \changes{v1.7d}{????/??/??}{縦組クラスの所属表示の番号を直立にした}
%    \begin{macrocode}
\def\p@thanks#1{\footnotemark
  \protected@xdef\@thanks{\@thanks
    \protect{\noindent\hbox{\yoko$\m@th^\thefootnote$}#1\protect\par}}}
%    \end{macrocode}
% \end{macro}

@aminophen
Copy link
Member Author

aminophen commented Feb 3, 2017

\clearナントカpage を実装して openleft を増やす話ですが、調べてみると \cleartooddpage / \cleartoevenpage については nextpage.sty というパッケージに同名の命令があります。これが既存のドキュメントに使われている可能性は十分あるので、名称については衝突しないものを考案する必要があります。

そこで、「非ユーザ向け内部命令」ということにして

  1. \pltx@cleartoleftpage
  2. \pltx@cleartorightpage
  3. \pltx@cleartooddpage
  4. \pltx@cleartoevenpage

の 4 つを jclasses の中で定義し、クラスファイル内ではこれを使ってみました (b748feb) 。欧文 LaTeX の \cleardoublepage が 3. に、また pLaTeX の \cleardoublepage が 2. にあたるものです。

文字化けして読みづらい説明文:

% \subsection{改ページ(日本語\TeX{}開発コミュニティ版のみ)}
%
% |\cleardoublepage|命令は、\LaTeX{}カーネルでは「奇数ページになるまでページを
% 繰る命令」として定義されています。しかしp\LaTeX{}カーネルでは、アスキーの方針
% により「横組では奇数ページになるまで、縦組では偶数ページになるまでページを
% 繰る命令」に再定義されています。すなわち、p\LaTeX{}では縦組でも横組でも
% 右ページになるまでページを繰ることになります。
%
% p\LaTeX{}標準クラスのbookは、横組も縦組も|openright|がデフォルトになっていて、
% これは従来p\LaTeX{}カーネルで定義された|\cleardoublepage|を利用していました。
% しかし、縦組で奇数ページ始まりの文書を作りたい場合もあるでしょうから、
% コミュニティ版クラスでは以下の命令を追加します。
% \begin{enumerate}
%   \item|\pltx@cleartorightpage|:右ページになるまでページを繰る命令
%   \item|\pltx@cleartoleftpage|:左ページになるまでページを繰る命令
%   \item|\pltx@cleartooddpage|:奇数ページになるまでページを繰る命令
%   \item|\pltx@cleartoevenpage|:偶数ページになるまでページを繰る命令
% \end{enumerate}
% また、コミュニティ版クラスの内部では、p\LaTeX{}カーネルの|\cleardoublepage|の
% 代わりに上記の命令を使って|openright|および|openleft|オプションを実装します。
% \changes{v1.7d}{????/??/??}{\cs{cleardoublepage}の代用となる命令群を追加}

@aminophen
Copy link
Member Author

7881f2c で機械的に openleft オプションを追加しました。従来の openright の挙動を元に、対称性を重視して実装してあります。これが妥当な挙動かどうかは議論が必要と思います。特に、タイトル前の白紙ページについてはどうすべきでしょうか。

@aminophen
Copy link
Member Author

aminophen commented Feb 7, 2017

タイトル前の白紙ページ

これは「openright かつ book のとき」 \documentclass{tbook} および「(新設を検討中) openleft かつ book のとき」 \documentclass[openleft]{jbook} だけで問題になります。

縦組クラスは (u)pLaTeX 系およびその派生物以外に見当たりませんので、横書きの openleft について既存の cls 達を調べてみると、openleft の実装があるのは memoir と koma-script だけでした。koma-script の場合では key=val 方式であるという syntax の違いはありますが

\documentclass[headings=openleft]{scrbook}
%\documentclass[headings=openleft]{scrreprt}
\title{hoge}
\author{fuga}
\usepackage{lipsum}
\begin{document}
\maketitle
\lipsum[1-2]
\end{document}

の挙動が現在の platex の tatecls ブランチ e27ec11 と同じになっています(= scrbook の場合もやはりタイトルの前に白ページあり、scrreprt の場合は白ページなし)。koma-script は割と LaTeX 標準クラスに近いシリーズものなので、これと同じであるということは割と妥当な挙動といえるかもしれません。

memoir のほうは book クラスからかなりの改変を加えたものになっているようですが、これはタイトルの前に白ページが入ることはありません。

\let\printglossary\relax % pLaTeX カーネルで定義済みのためエラーになるのを防ぐ
\documentclass[openleft]{memoir}

とはいえ、これに合わせるような変更を入れると現行のドキュメントのページ数が変わってしまうので、pLaTeX のクラスについても「openleft/openright に合わせてタイトルページ前に白ページが入ることもあるという仕様」ということで定めてもよい気がしてきました。

@aminophen
Copy link
Member Author

aminophen commented Feb 7, 2017

いろいろ試していると、別の疑問が生じました。何度かフォーラムにも出ていた気がしますが、これでいいのかどうか… (なお、openleft な scrbook でも同様の現象です)

\documentclass{tbook}
\usepackage{lipsum}
\title{hoge}
\author{fuga}
\begin{document}
\maketitle
\chapter{AAA}
\lipsum[1-2]
\end{document}

この場合最初が白ページ、その次にタイトルページが来ますが、これは openright により \cleartorightpage が発行されたからだとわかります(つまり右になるように最初を白ページにした)。しかし、titlepage 環境の定義により、タイトル自体のページ番号は「1」に設定しなおされます(titlepage 環境が強制的に \setcounter{page}\@ne している)から、タイトルページのマージン量が(右に送られたはずなのに)左用に変化しています。

さらにその次の \chapter のページは、「2」になりますが、これは右ページのレイアウトを持ちます。つまり「右に送られたけれど間違った左用のレイアウトを持つページ」と「右に送られて正しい右用のレイアウトを持つページ」が連続するという挙動になっています。

タイトルページが「縦組の右」および「横組の左」に来る場合はそのページ番号を \@ne でなく偶数である \z@ のような設定にする方がよいのではないかとふと思いました。これは仕様変更にあたりますし、さらに koma-script とも異なる挙動でもありますが、どうでしょう?

@aminophen
Copy link
Member Author

本 issue であがった一連の話題について、いったん整理します。tatecls ブランチをどこまで master にマージしてよいか考えているところなのですが、案としては以下のように列挙できます。

[1] 本ブランチは master に入れない。

[2] 所属の\p@thanks が寝てしまう現象だけ直すため 8bff00c までを採用する。

[3] 上記 [2] に加えて openleft オプションの追加 dc5559d までを採用する。このコミットまでは、openleft オプションを使った場合だけ挙動が変化するため、openleft でない場合の挙動については完全な後方互換性があります。また、openleft の挙動は openright と対称性を保っているので、容易に想像できると思われます。

[4] 上記 [3] に加えて、上のコメントに書いた「右ページと右ページが連続する」という現象などへの対処も加える。これは互換性という観点からは変えてはまずいことになると思われますが、意図に反したバグと認定して直したほうがよいという意見があってもよいとも思います。

このどれがよいか(あるいは別の可能性があればそれも)については影響も大きいので、場合によっては forum のほうでも再度近いうちに書き込むこととします。

@aminophen
Copy link
Member Author

ふと思ったのですが openleft な場合に \cleardoublepage が pLaTeX カーネルそのまま=右になるまでページを繰る命令ではユーザ目線では不便ですね。openleft な場合だけ \pltx@cleartoleftpage に \let するというのだとまずいでしょうか?

@aminophen
Copy link
Member Author

ddaf57e で \cleardoublepage を「openright な場合は \pltx@cleartorightpage に、openleft な場合は \pltx@cleartoleftpage に \let」してみました。こうすると \part などの命令から呼び出されるモノを \cleardoublepage のまま=従来どおりにできるため、「openright のまま \cleardoublepage だけを再定義して左起こしの文書を作る」というノウハウを使ってきたような場合でも ok になります(もちろん openleft を使っていただくに越したことはないでしょうけど)。

@aminophen
Copy link
Member Author

aminophen commented Feb 11, 2017

「右ページと右ページが連続する」

これはやはりバグ認定して直すことにしました。pldoc.pdf の titlepage 環境の説明文

…レポートスタイルでは、ページ番号を1 にリセットし、そして最後で1 に戻します。互換モードでは、ページ番号はゼロに設定されますが、右起こしページ用のページパラメータでは誤った結果になります。

から 2.09 互換モードと 2e モードのときで挙動が違うことがわかるのですが、縦組に関しては 2.09 互換モードのほうが正しい出力になります。

\documentstyle{tbook} % これは 2.09 互換モード → 正しい出力
%\documentclass{tbook} % これは 2e モード → 間違った出力
\title{title}
\author{author}
\begin{document}
\maketitle
\chapter{test}
\end{document}

これは 2.09 → 2e の変更時に縦組を考慮せずに間違った変更を入れてしまった可能性が高いので 1eca478 で修正を試みました。

@aminophen
Copy link
Member Author

\documentclass{tbook} % これは 2e モード → 間違った出力

と思っていたのですが、考え方によってはアスキーの出力が(タイトル前の空白ページさえなければ)正しいという見方もできますね。空白ページが仮になかったとすると、タイトルが表紙になって奇数ページレイアウトを持つのは自然ですし、ページをめくると右に2という番号のページが出るのでこれも自然な挙動です。一方で、\maketitle より前に何か文章があったとすると、前に私が考えたとおり奇数偶数のレイアウトが交互にならないので不正なのは変わりありません。\maketitle より前に何かあるかどうかで分岐したほうが互換性が向上するのかもしれないと悩みはじめました。

@aminophen
Copy link
Member Author

\maketitle より前に何かあるかどうかで分岐したほうが

アスキーの頃の挙動が

\newenvironment{titlepage}
    {%
%<book>      \cleardoublepage
      \if@twocolumn
        \@restonecoltrue\onecolumn
      \else
        \@restonecolfalse\newpage
      \fi
      \thispagestyle{empty}%
      \setcounter{page}\@ne
    }%
    {\if@restonecol\twocolumn \else \newpage \fi
     \if@twoside\else
        \setcounter{page}\@ne
     \fi
    }

であるのに対し、以下のように変えると実現できることがわかりました。

\newenvironment{titlepage}
    {%
      \if@twocolumn
        \@restonecoltrue\onecolumn
      \else
        \@restonecolfalse\newpage
      \fi
%<book>      \ifnum\c@page=\@ne\else\cleardoublepage\fi
      \thispagestyle{empty}%
      \ifodd\c@page\setcounter{page}\@ne\else\setcounter{page}\z@\fi
    }%
    {\if@restonecol\twocolumn \else \newpage \fi
     \if@twoside\else
        \setcounter{page}\@ne
     \fi
    }

これなら「tbook で \begin{document} 直後に \maketitle を書いた場合」に最初に空白ページが出なくなりますから、「奇数レイアウトのタイトルページ」=表紙っぽくなります。また、「tbook で何らかの文章の後で \maketitle した場合」は \newpage が発行されてページ番号が 1 より大きくなっているはずなので、\cleardoublepage が発行されて「偶数レイアウトのタイトルページ」ができますから、例のバグも解消できていることになります。

@aminophen
Copy link
Member Author

二転三転していますが、仕様変更案を jclasses.dtx にかなり詳しくドキュメント化しました。

改めてアスキー版の挙動を整理すると、以下のようになります。
\begin{enumerate}
\item アスキー版では、タイトルページの番号を必ず1にリセットしていましたが、
  これは正しくありません。本来ならば、タイトルの出るページに応じて
  \begin{itemize}
    \item 奇数ページ目に出る場合、ページ番号を1(奇数)にリセット
    \item 偶数ページ目に出る場合、ページ番号を0(偶数)にリセット
  \end{itemize}
  とすべきです。そうしないと、タイトルページが偶数ページ目に出る場合にも、
  レイアウトだけ奇数ページ用が適用されてしまい、さらにその次のページも偶数の
  ページ番号を持ってしまうからです。
\item アスキー版bookクラスは、タイトルページを必ず|\cleardoublepage|で始めて
  いました。これ自体が正しくないと断定することはできません。しかしこれでは、
  偶数ページ起こしの場合に|\maketitle|を文書の冒頭に書いただけで、
  タイトルの前に空白ページが発生します。
\end{enumerate}

一つめの例を考えます。
\begin{verbatim}
  \documentclass{tbook}
  \title{タイトル}\author{著者}
  \begin{document}
  \maketitle
  \chapter{チャプター}
  \end{document}
\end{verbatim}
アスキー版tbookクラスでの結果は
\begin{verbatim}
  1ページ目:空白(ページ番号1は非表示)
  2ページ目:タイトル(奇数レイアウト、ページ番号1は非表示)
  3ページ目:チャプター(偶数レイアウト、ページ番号2)
\end{verbatim}
ですが、仮に最初の空白ページさえなければ
\begin{verbatim}
  1ページ目:タイトルすなわち表紙(奇数レイアウト、ページ番号1は非表示)
  2ページ目:チャプター(偶数レイアウト、ページ番号2)
\end{verbatim}
とみなせるため、コミュニティ版では空白ページを発生させないようにしました。

二つめの例を考えます。
\begin{verbatim}
  \documentclass{tbook}
  \title{タイトル}\author{著者}
  \begin{document}
  テスト文章
  \maketitle
  \chapter{チャプター}
  \end{document}
\end{verbatim}
アスキー版tbookクラスでの結果は
\begin{verbatim}
  1ページ目:テスト文章(奇数レイアウト、ページ番号1)
  2ページ目:タイトル(奇数レイアウト、ページ番号1は非表示)
  3ページ目:チャプター(偶数レイアウト、ページ番号2)
\end{verbatim}
ですが、これでは奇数と偶数のページ番号が交互になっていないので正しく
ありません。そこで、コミュニティ版では
\begin{verbatim}
  1ページ目:テスト文章(奇数レイアウト、ページ番号1)
  2ページ目:タイトル(偶数レイアウト、ページ番号0は非表示)
  3ページ目:空白ページ(ページ番号1は非表示)
  4ページ目:チャプター(偶数レイアウト、ページ番号2)
\end{verbatim}
と直しました。

@aminophen
Copy link
Member Author

aminophen commented Feb 14, 2017

上の「二つめの例」を交互にする方法は、上に書いたもののほかにも

  1ページ目:テスト文章(奇数レイアウト、ページ番号1)
  2ページ目:空白ページ(ページ番号2は非表示)
  3ページ目:タイトル(奇数レイアウト、ページ番号1は非表示)
  4ページ目:チャプター(偶数レイアウト、ページ番号2)

という実現の仕方もありえますね。どちらがよいのだろう…?(強制的に奇数レイアウトになっていたという従来の挙動により近いのはこっちのような気もする。実装は \cleardoublepage\pltx@cleartooddpage に置き換えればよい)

@aminophen
Copy link
Member Author

紙に印刷して作ってみると後に書いたほうが自然に見えたので 23604f5 でそっちに直しました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants