titlesec/titletocパッケージで「章番号のみ」を取り出したい

titlesec/titletocパッケージで「章番号のみ」を取り出したい

- Yuishin の投稿
返信数: 6
ディストリビューション: TeX Live 2020
OS: Windows 10 x64

titlesec, titletocを用いてtableofcontentsのカスタマイズをしています。
ところが、\thecontentslabelの挙動で困ってしまいました。
具体的には、「1」と章番号のみを取り出して表示したいのに、
「第1章」とフルで表示されてしまい、悩んでいます。
(partではこうならないため、不思議に思っています)
章番号のみを取り出すには、どうしたらよいでしょうか。

%% コードここから

\documentclass[a5paper,9pt]{ltjsbook}

\usepackage[no-math]{luatexja-fontspec}

\usepackage[deluxe,expert,haranoaji]{luatexja-preset}


\usepackage[newparttoc]{titlesec}

\usepackage{titleps}

\usepackage{titletoc}


\newcommand{\tocheadfont}{\gtfamily\sffamily}

\titlecontents{chapter}[0pt] % left

{\tocheadfont\large} % above code

{\thecontentslabel} % numberd entry format ← 第1章の「1」だけが欲しい

{} % numberless entry format

{\titlerule*[.5pc]{.}\contentspage} % filler page format

[] % below code


\title{Title}

\author{Yuishin}


\begin{document}

\maketitle

\tableofcontents


\chapter{サンプル章}


\section{サンプルセクション}

とりなくこゑすゆめさませみよあけわたるひんかしを

そらいろはえておきつへにほふねもれゐぬもやのうち


\end{document}

%% コードここまで

Yuishin への返信

Re: titlesec/titletocパッケージで「章番号のみ」を取り出したい

- 和田 勇 の投稿

part の動きは追っていないのですが 「第」「章」は ltjsbook.cls だと 次のような定義を行っているからだと思います。

1704:\newcommand{\prepartname}{\if@english Part~\else 第\fi}
1706:\newcommand{\prechaptername}{\if@english Chapter~\else 第\fi}
1707:\newcommand{\postchaptername}{\if@english\else 章\fi}
1708:\newcommand{\presectionname}{}%  第

なのでこのうち必要なものを再定義する方法ではダメでしょうか

\renewcommand{\prechaptername}{}
\renewcommand{\postchaptername}{}
和田 勇 への返信

Re: titlesec/titletocパッケージで「章番号のみ」を取り出したい

- Yuishin の投稿
ご提案ありがとうございます。
たしかに、手っ取り早く達成するならその手法です。
しかし、それだと「取り出す」わけではないため、どうしたものかと悩んでいました。

実際の動きでは、titletocは生成される *.toc の中の \numberline{...}
を読み取っているようです。
また、ltjsbookのpartでは *.toc に \numberline を生成しないようです。

さらに詳しく調べたところ、ltjsbook.clsのL988に重要なことが書かれていました。
(\def\@chapter の内部で、コメントアウトされています)

% {\if@english\thechapter\else\@chapapp\thechapter\@chappos\fi}%

「\numberline で実行される内容を変更すればよい」が正解とわかりました。
該当箇所を取り出して、改めて \def すれば解決です。

まとめると、
「titletocで使うための情報として\numberlineを適切に再定義する」
が正解でした。

回答ありがとうございました。
Yuishin への返信

Re: titlesec/titletocパッケージで「章番号のみ」を取り出したい

- ut の投稿

> たしかに、手っ取り早く達成するならその手法です。
………
> 「\numberline で実行される内容を変更すればよい」が正解とわかりました。

えーっと、そうなのでしょうか??? 手元の、

> \ProvidesClass{ltjsbook}
>  [2019/11/23 ltjsclasses ]

の関係しそうなところを見てみましたところ、

> \newcommand{\@chapapp}{\prechaptername}
> \newcommand{\@chappos}{\postchaptername}
………
> \def\@chapter[#1]#2{%
>  \ifnum \c@secnumdepth >\m@ne
>    \if@mainmatter
>      \refstepcounter{chapter}%
>      \typeout{\@chapapp\thechapter\@chappos}%
>      \addcontentsline{toc}{chapter}%
>        {\protect\numberline
>        % {\if@english\thechapter\else\@chapapp\thechapter\@chappos\fi}%
>        {\@chapapp\thechapter\@chappos}%
>        #1}%
>    \else\addcontentsline{toc}{chapter}{#1}\fi
>  \else

となっているので、「手っ取り早く」が「正解」なのではないでしょうか?

あと、

> (partではこうならないため、不思議に思っています)
………
> また、ltjsbookのpartでは *.toc に \numberline を生成しないようです。

とのことですが、ltjsbook.cls の該当箇所では、

> \def\@part[#1]#2{%
>  \ifnum \c@secnumdepth >-2\relax
>    \refstepcounter{part}%
>    \addcontentsline{toc}{part}{%
>      \prepartname\thepart\postpartname\hspace{1\zw}#1}%
>  \else
………
> \newcommand{\prepartname}{\if@english Part~\else 第\fi}
> \newcommand{\postpartname}{\if@english\else 部\fi}

となっているので、part の場合も、「第」や「部」が付くような気がするのですけれど…。

ut への返信

Re: titlesec/titletocパッケージで「章番号のみ」を取り出したい

- Yuishin の投稿
バージョンが異なるようです。
私の手元にあるltjsbookは

\ProvidesClass{ltjsbook}
[2020/05/30 ltjsclasses ]

となっています。
Yuishin への返信

Re: titlesec/titletocパッケージで「章番号のみ」を取り出したい

- ut の投稿

> バージョンが異なるようです。

あらら、失礼しました。私の手元のシステムはうんと久しぶりに更新した W32TeX [2020/07/19] だったので、結構新しいものと思い込んでいました。

いま、

> luatexja.tar.xz                08-Aug-2020 22:31  66M

をもらって来ましたら、ltjsbook.cls のバージョンは、確かに、

> \ProvidesClass{ltjsbook}
>  [2020/05/30 ltjsclasses ]

となっていました(すいません)。で、先の投稿で引用した部分に該当するコードは、以下のようになっています:

chapter:

> \newcommand{\@chapapp}{\prechaptername}
> \newcommand{\@chappos}{\postchaptername}
………
> \def\@chapter[#1]#2{%
>  \ifnum \c@secnumdepth >\m@ne
>    \if@mainmatter
>      \refstepcounter{chapter}%
>      \typeout{\@chapapp\thechapter\@chappos}%
>      \addcontentsline{toc}{chapter}%
>        {\protect\numberline
>        % {\if@english\thechapter\else\@chapapp\thechapter\@chappos\fi}%
>        {\@chapapp\thechapter\@chappos}%
>        #1}%
>    \else\addcontentsline{toc}{chapter}{#1}\fi
>  \else

part:

> \def\@part[#1]#2{%
>  \ifnum \c@secnumdepth >-2\relax
>    \refstepcounter{part}%
>    \addcontentsline{toc}{part}{%
>      \prepartname\thepart\postpartname\hspace{1\zw}#1}%
>  \else
………
> \newcommand{\prepartname}{\if@english Part~\else 第\fi}
> \newcommand{\postpartname}{\if@english\else 部\fi}

\ProvidesClass{ltjsbook} [2019/11/23 ltjsclasses ] と、特に違ってないように見えるのですが…。

ut への返信

Re: titlesec/titletocパッケージで「章番号のみ」を取り出したい

- Yuishin の投稿
いや、そもそも私が取ろうとしていた方針が少しまずかったようです。
ltjsbookのバージョンに依存する可能性がある箇所をrenewcommandをするよりも、
そこに頼らずに自分で実装したものを適用させるのが適切でした。

実を言うと、\numberline{...} によって番号部分のみが取り出されることが重要です。
目次のカスタマイズにおいて、番号部分のみを強調するデザインを意図していたためです。
貼り付けられたpartの部分\addcontentslineには \numberline{...} が含まれていないため、
こればかりは(どちらのバージョンであったとしても)カスタマイズしなければなりません。

もとの\tableofcontentsで参照される\l@chapterは、
*.tocにおいて「\numberline{第1章}」の形で書かれていることを前提としており、
このうち「1」のみを強調することはできません。
だから、titletocパッケージの \titlecontents{chapter}... でのカスタマイズを考えました。
titlesecパッケージのマニュアルには \thecontentslabel コマンドを活用するサンプルコードが掲載されています。
これは *.toc にある \numberline{...}を取り出す仕組みになっています(手動で*.tocをいじって確認しました)。
このコマンド名のせいで、てっきり本当に番号が取り出されているのかと勘違いしますが、番号を取り出しているわけではありません。

ltjsbookの仕様では「1」のみを\addnumberline で追加することを避けています。
ltjsbookでは\appendix によって「第1章」から「付録A」の形式に変わります。
一方、「第XX章」と「付録XX」はどちらもtocではchapterの扱いであり、
見分けがつかないことから、\addnumberline に「第1章」と全体を取り込んだのでしょう。

細部までカスタマイズするとなった時点で、
内部の機能に依存しない書きかたをするのが正解であり、
\prechapternameと\postchapternameを空にして、
改めて自分で所望のレイアウトに適用させるのが正解だと思いました。

失礼しました。