はじめまして、現在大学1年生でTeXを勉強している者です。以下トラブルの内容になります。技術系の質問を初めて行うので、内容および質問の仕方が稚拙であったら申し訳ございません。
要望:デフォルトではchapterの上下余白が大きいので狭めたい
問題:ltjsbook.clsやltjsclasses.dtxで[1]を参考にchapterの上下余白設定について変更を行ったが、その変更が適用されない
環境:OSはWindows11 pro、LuaLaTeXを使用
[状況詳細]
LuaLaTeXなので文書クラスにはltjsbookを用いております。以下、余白設定やchapterなどのカスタマイズに関するプリアンブルのソースコードです(抜粋)。
---
\documentclass[a4paper]{ltjsbook} %文書クラス(lualatex用、ドライバ指定必要なし)
\usepackage[top=15mm, bottom=15mm, left=10mm, right=10mm]{geometry} %用紙余白設定
\usepackage{tikz} %図
\usetikzlibrary{calc}
\usepackage{tcolorbox} %ボックス
\tcbuselibrary{xparse,hooks,skins,breakable,theorems,listingsutf8}
\usepackage{varwidth} %可変幅ミニページ
\usepackage[explicit]{titlesec} %見出し書式変更
\usepackage{ascolorboxlua} %独自パッケージ
%---文章スタイルの定義---
%chapter環境
\titleformat{\chapter}[display]{\bfseries \Large}{}{10pt}{%
\begin{ascolorbox17}{\uuline{第{\Huge \thechapter} 章} {\large \blacktriangleright \blacktriangleright \blacktriangleright} }
\rightline{\LARGE #1}
\end{ascolorbox17}%
}
%chapterのデフォルトでついてくるページ番号なくす
\makeatletter %@を英文字に(マクロのため)
\def\plainifnotempty{%
\thispagestyle{plainfoot}% 元は plainhead
}
\makeatother %@をその他の文字に
%chapterの上下余白変更-->ltjsbook.clsを参照
---
また、ltjsbook.clsの変更ですが、基本的に[1]に示したような変更しかしておりません。以下抜粋です(1006~1032行の部分になります)。※が変更部分です
---
\def\@makechapterhead#1{%
\vspace*{0\Cvs}% 欧文は50pt。2から0に変更済み※
{\parindent \z@ \raggedright \normalfont
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\huge\headfont \@chapapp\thechapter\@chappos
\par\nobreak
\vskip \Cvs % 欧文は20pt
\fi
\fi
\interlinepenalty\@M
\Huge \headfont #1\par\nobreak
\vskip \Cvs}} % 欧文は40pt。3から1に変更済み※
\def\@schapter#1{%
\chaptermark{#1}%
\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}\@afterheading
\fi}
\def\@makeschapterhead#1{%
\vspace*{0\Cvs}% 欧文は50pt。2から0に変更済※
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
\Huge \headfont #1\par\nobreak
\vskip 1\Cvs}} % 欧文は40pt。3から1に変更済※
---
またltjsclasses.dtxの方にも同様の部分がありましたので、同様に変更しております。
以上が本トラブルの詳細になります。
[怪しい部分]
・途中で、ascolorboxという外部のパッケージを用いております。具体的には、ascolorboxをそのまま用いるとzwが\zwでないなどでエラーが吐かれますので、lualatex用にそういったフォーマットを整えて新規パッケージとした(ascolorboxlua)うえで、chapterでascolorboxにより提供されるtcolorboxで作成された独自のデザインの枠を用いています。[2]に出典を記します。なお新規パッケージといえども大枠はほとんど変更していないため、今回の件が手を加えたことに起因しているとは思えないです。
・悪さをしている原因として一番考えられそうだと私が考えているのはtitlesecです。(titlesecの動作機序を調べたのですが、サイトの内容を読んでも理解力がなくいまいちよく理解できませんでした。)
[分からないこと]
・実はclsなどtexの深部ファイルの変更はあまり行っていませんが、文書自体がデフォルト状態から相当カスタマイズを進めてしまっているので、読み込んでいるパッケージなどがとても多い状況です(デザインに凝ろうとして素人が中途半端に手を出した結果です)。上にあげた以外で悪さをしそうなパッケージ(e.g. ヘッダー・フッターの編集に係るpackage)などがあれば、ご教示いただきたいです。
・dtxファイルについての説明を検索したのですが、パッケージ本体という説明のみで詳しい仕様がわかりませんでした。コンパイルする際はどのように参照されるかなどの仕組みが知りたいです。
サイトを調べても解決せず困っております。長文失礼いたしました。
(参考サイト)
[1]http://nohzen.blog76.fc2.com/blog-entry-118.html (20230224訪問)
[2]https://github.com/Yasunari/ascolorbox (20230224訪問)
# 直接的な回答でなくて申し訳ないのですけれど…。
・ コマンドの(再)定義の優先順について
仮に \somecs というコントロールシーケンスがあるとして、それは、
通常は、以下のどこかで定義されているはずです(定義されていな
いのに未定義エラーにならないコントロールシーケンスもあるのです
が、それはここでは考えないことにします):
(1)TeX のプリミティブ
(2)LaTeX のカーネル
(3)class ファイル(+ clo ファイル)
(4)パッケージ
(5)プリアンブル
(6)\begin{document} 以降
(1)は、定義ではなくて、TeX のコマンドそのものです。
しかし、その(1)でさえも、(2)~(6)で再定義が可能です。
そして、より後ろで再定義されたものが有効になります。
既定のコマンドの挙動を変更したいという場合は、(2)や(3)で
定義されているコマンドを、(4)や(5)(場合によっては(6))
で再定義(上書き)するということになります。
なお、一般のユーザーが変更してよいのは、(5)や(6)において
であって、(2)~(4)を勝手に書き替えてはいけません。
(既存のパッケージの中味を書き替えて、パッケージ名を変更した
上で自分用のパッケージにするということは、一応可能ですけれど)
また、(2)~(4)では、@ をコントロールシーケンス名に含める
ことが出来ますが、(5)と(6)では、\makeatletter で @ のカテ
ゴリーコードを 11 に変更しないと、@ をコントロールシーケンス
名に含めることが出来ません。
(逆に、(5)や(6)におけるカスタマイズであっても、コントロ
ールシーケンス名に @ が含まれていないのであれば、\makeatletter
を宣言する必要はありません)
今回の例では、\@makechapterhead や \@makeschapterhead を変更
しようとされていますが、これらは、(3)で定義されているもの
です。
これらの挙動に変更を加えたい場合、普通に考えれば、(4)を利用
して変更をするか、(5)で自分で書き換えるかのいずれかという選
択肢になるのですが、質問者の方は、(3)を書き換えてしまった上
で、(4)を読み込んでいます。
つまり、\@makechapterhead 等の定義は、元々(3)でなされていた
のですけれど、それを書き替えて(3')、その後に(4)を読み込ん
で更に書き替えているので、有効になっているのは(4)による定義
ということになります。(それを「悪さ」と呼ぶかどうかですが…)
・ dtx ファイルについて
dtx ファイルは、タイプセット時には、参照はされていません。
dtx は、コードとその解説をひとつにまとめたもので、docstrip
を使うと、dtx から sty が取り出せて、latex で処理すると、sty
についてのドキュメントがタイプセット出来る、という仕組みに
なっています(ということは、いろんなところに書かれていると
思われるのですけれど…)。
dtx を書き替えても、タイプセットには何も影響は及ばないものの、
コードとドキュメントのソースですので、勝手に書き替えていいわ
けではありません。
# titlesec パッケージには \titlespacing というコマンドも用意
# されているようですが、なぜそれを使わずに ltjsbook.cls (や
# ltjsclasses.dtx)を直接書き替えてしまわれたのでしょう…?
・ コマンドの(再)定義の優先順について
仮に \somecs というコントロールシーケンスがあるとして、それは、
通常は、以下のどこかで定義されているはずです(定義されていな
いのに未定義エラーにならないコントロールシーケンスもあるのです
が、それはここでは考えないことにします):
(1)TeX のプリミティブ
(2)LaTeX のカーネル
(3)class ファイル(+ clo ファイル)
(4)パッケージ
(5)プリアンブル
(6)\begin{document} 以降
(1)は、定義ではなくて、TeX のコマンドそのものです。
しかし、その(1)でさえも、(2)~(6)で再定義が可能です。
そして、より後ろで再定義されたものが有効になります。
既定のコマンドの挙動を変更したいという場合は、(2)や(3)で
定義されているコマンドを、(4)や(5)(場合によっては(6))
で再定義(上書き)するということになります。
なお、一般のユーザーが変更してよいのは、(5)や(6)において
であって、(2)~(4)を勝手に書き替えてはいけません。
(既存のパッケージの中味を書き替えて、パッケージ名を変更した
上で自分用のパッケージにするということは、一応可能ですけれど)
また、(2)~(4)では、@ をコントロールシーケンス名に含める
ことが出来ますが、(5)と(6)では、\makeatletter で @ のカテ
ゴリーコードを 11 に変更しないと、@ をコントロールシーケンス
名に含めることが出来ません。
(逆に、(5)や(6)におけるカスタマイズであっても、コントロ
ールシーケンス名に @ が含まれていないのであれば、\makeatletter
を宣言する必要はありません)
今回の例では、\@makechapterhead や \@makeschapterhead を変更
しようとされていますが、これらは、(3)で定義されているもの
です。
これらの挙動に変更を加えたい場合、普通に考えれば、(4)を利用
して変更をするか、(5)で自分で書き換えるかのいずれかという選
択肢になるのですが、質問者の方は、(3)を書き換えてしまった上
で、(4)を読み込んでいます。
つまり、\@makechapterhead 等の定義は、元々(3)でなされていた
のですけれど、それを書き替えて(3')、その後に(4)を読み込ん
で更に書き替えているので、有効になっているのは(4)による定義
ということになります。(それを「悪さ」と呼ぶかどうかですが…)
・ dtx ファイルについて
dtx ファイルは、タイプセット時には、参照はされていません。
dtx は、コードとその解説をひとつにまとめたもので、docstrip
を使うと、dtx から sty が取り出せて、latex で処理すると、sty
についてのドキュメントがタイプセット出来る、という仕組みに
なっています(ということは、いろんなところに書かれていると
思われるのですけれど…)。
dtx を書き替えても、タイプセットには何も影響は及ばないものの、
コードとドキュメントのソースですので、勝手に書き替えていいわ
けではありません。
# titlesec パッケージには \titlespacing というコマンドも用意
# されているようですが、なぜそれを使わずに ltjsbook.cls (や
# ltjsclasses.dtx)を直接書き替えてしまわれたのでしょう…?
返信ありがとうございます。また、確認が大変遅れてしまい申し訳ございません。
(4)にあたる\titlespacingを用いたところ、無事解決いたしました。
コマンドの優先順位についての内容、大変参考になりました。
\titlespacingを用いずにltjsbook.cls(およびltjsclasses.dtx)を直接書き換えてしまった経緯ですが、個人的に私はデフォルトの余白設定があまり好みではなく、また各文書で特に(プリアンブルなどでの個別の記述なしに)統一したいという思いがあり、一時的にltjsbook.clsを書き換えてみて挙動を観察しよう、と思い立ったことがきっかけでした。動作確認後は、レイアウトを変更できた場合は変更したものを新たな(独自の)clsファイルとして保存し自分専用の文書クラスを作成したうえで、ltjsbook.clsは元に戻す予定でおりました。マクロなどが用いられているTeXの深部のファイルに関しては私は全くもって知識がなく、学習の一環ととらえて軽々しく書き換えてしまっておりました(もちろんこれは著作権的にアウトな行動だとは、事前に把握しておりました。以後慎みます。大変申し訳ございません)。
dtxファイルに関しましても、大変勉強になりました。動作ファイルではなく、ソースファイルなのですね。私は数日間検索しdtxファイルに関する情報を探したのですが、そういった情報にはたどり着けませんでした。こちらも私の能力不足が原因です。申し訳ございませんでした。
これは余談にはなりますが、パッケージなどを用いずに、またプリアンブルに個別に記述することなく文書スタイルを変更するには、どのような手が用いることができるのでしょうか。やはりclsファイルをすべて自作するほかに方法はないのでしょうか。
(4)にあたる\titlespacingを用いたところ、無事解決いたしました。
コマンドの優先順位についての内容、大変参考になりました。
\titlespacingを用いずにltjsbook.cls(およびltjsclasses.dtx)を直接書き換えてしまった経緯ですが、個人的に私はデフォルトの余白設定があまり好みではなく、また各文書で特に(プリアンブルなどでの個別の記述なしに)統一したいという思いがあり、一時的にltjsbook.clsを書き換えてみて挙動を観察しよう、と思い立ったことがきっかけでした。動作確認後は、レイアウトを変更できた場合は変更したものを新たな(独自の)clsファイルとして保存し自分専用の文書クラスを作成したうえで、ltjsbook.clsは元に戻す予定でおりました。マクロなどが用いられているTeXの深部のファイルに関しては私は全くもって知識がなく、学習の一環ととらえて軽々しく書き換えてしまっておりました(もちろんこれは著作権的にアウトな行動だとは、事前に把握しておりました。以後慎みます。大変申し訳ございません)。
dtxファイルに関しましても、大変勉強になりました。動作ファイルではなく、ソースファイルなのですね。私は数日間検索しdtxファイルに関する情報を探したのですが、そういった情報にはたどり着けませんでした。こちらも私の能力不足が原因です。申し訳ございませんでした。
これは余談にはなりますが、パッケージなどを用いずに、またプリアンブルに個別に記述することなく文書スタイルを変更するには、どのような手が用いることができるのでしょうか。やはりclsファイルをすべて自作するほかに方法はないのでしょうか。
# 以下、英語の情報ばかりになってしまい、申し訳ないですが…:
* * *
> パッケージなどを用いずに、またプリアンブルに個別に記述する
> ことなく文書スタイルを変更するには、どのような手が用いるこ
> とができるのでしょうか。
パッケージも読み込まず、プリアンブルでの変更もせずに文書スタ
イルを自分好みに設定となりますと、クラスファイル内で定義する
しかないですよね…。
でも、それでは、クラスファイルを丸々自作する他に手がないのか
といいますと、必ずしもそうとも言い切れません。
ひとつ考えられる方法としては、既存のクラスファイルを \LoadClass
で読み込んだ上で必要な修正を加えた、自分用のクラスファイルを
作る、というやり方があります。
あと、もうひとつの方法としては、「パッケージなどを用いずに」
というご要望からは外れてしまいますが、必要な各種パッケージの
読み込みとそれぞれの設定とをひとつの自分用のパッケージにまと
めてしまう、というやり方も考えられます。
(1)\LoadClass を使って新たなクラスファイルを作成している例
・ tufte-latex パッケージ
・ suftesi パッケージ
※ どちらのパッケージも、既存の book.cls や article.cls を
\LoadClass しています。
※ これらでは汎用性を持たせるために多くのオプションを用意し
ているせいで一見すると複雑に思えますが、自分用のクラスフ
ァイルであれば必要な変更だけ行えばいいので、ずっと簡単に
済ませることができます。
※ \LoadClass の解説としては、例えば:
・ The LaTeX Companion, 2nd, 2004, "A.4 Package and class
file structure"
・ Jim Hefferon, "Minutes in Less Than Hours: Using LaTeX
Resources," The PracTeX Journal, 2005
https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf
※※ The LaTeX Companion, 2nd は The LaTeX Project のページで
第 3 章、第 4 章、付録 B が公開されていますが、付録 A は買
わないと読めません。ただ、近々第 3 版が出るという噂なので、
今から第 2 版を購入するのはちょっと躊躇しますよね…。
(2)既存のパッケージをまとめてひとつのパッケージにしている例
・ ClassicThesis パッケージ
※ こちらも汎用性を考慮しているせいで少し複雑に見えますが、要
は、\RequirePackage でパッケージを読み込んで、そのパッケー
ジ用の設定をして、また \RequirePackage して、設定をして、を
繰り返しているだけです。
* * *
> 私は数日間検索しdtxファイルに関する情報を探したのですが、
> そういった情報にはたどり着けませんでした。
まず、紙の本として、日本語の文献で一番言及されるのは奥村先生
の『美文書作成入門』だと思われますが、その第 8 版(2020 年)
ですと、「第 15 章 スタイルファイルの作り方」に dtx ファイル
の説明があります。
次に、web 上での解説でしたら、一例を挙げるとしますと:
・ Documented LaTeX sources (dtx files)
https://texfaq.org/FAQ-dtx
とかでしょうか(今検索したら 7 件目にリストアップされていた
のですが、英語なのでスルーされたのかも知れません)。
※ この The TeX FAQ というページは、UK TeX Users' Group に
よる "The UK TeX FAQ" という紙での情報(1994--2014)が元
になっています。
* * *
> パッケージなどを用いずに、またプリアンブルに個別に記述する
> ことなく文書スタイルを変更するには、どのような手が用いるこ
> とができるのでしょうか。
パッケージも読み込まず、プリアンブルでの変更もせずに文書スタ
イルを自分好みに設定となりますと、クラスファイル内で定義する
しかないですよね…。
でも、それでは、クラスファイルを丸々自作する他に手がないのか
といいますと、必ずしもそうとも言い切れません。
ひとつ考えられる方法としては、既存のクラスファイルを \LoadClass
で読み込んだ上で必要な修正を加えた、自分用のクラスファイルを
作る、というやり方があります。
あと、もうひとつの方法としては、「パッケージなどを用いずに」
というご要望からは外れてしまいますが、必要な各種パッケージの
読み込みとそれぞれの設定とをひとつの自分用のパッケージにまと
めてしまう、というやり方も考えられます。
(1)\LoadClass を使って新たなクラスファイルを作成している例
・ tufte-latex パッケージ
・ suftesi パッケージ
※ どちらのパッケージも、既存の book.cls や article.cls を
\LoadClass しています。
※ これらでは汎用性を持たせるために多くのオプションを用意し
ているせいで一見すると複雑に思えますが、自分用のクラスフ
ァイルであれば必要な変更だけ行えばいいので、ずっと簡単に
済ませることができます。
※ \LoadClass の解説としては、例えば:
・ The LaTeX Companion, 2nd, 2004, "A.4 Package and class
file structure"
・ Jim Hefferon, "Minutes in Less Than Hours: Using LaTeX
Resources," The PracTeX Journal, 2005
https://tug.org/pracjourn/2005-4/hefferon/hefferon.pdf
※※ The LaTeX Companion, 2nd は The LaTeX Project のページで
第 3 章、第 4 章、付録 B が公開されていますが、付録 A は買
わないと読めません。ただ、近々第 3 版が出るという噂なので、
今から第 2 版を購入するのはちょっと躊躇しますよね…。
(2)既存のパッケージをまとめてひとつのパッケージにしている例
・ ClassicThesis パッケージ
※ こちらも汎用性を考慮しているせいで少し複雑に見えますが、要
は、\RequirePackage でパッケージを読み込んで、そのパッケー
ジ用の設定をして、また \RequirePackage して、設定をして、を
繰り返しているだけです。
* * *
> 私は数日間検索しdtxファイルに関する情報を探したのですが、
> そういった情報にはたどり着けませんでした。
まず、紙の本として、日本語の文献で一番言及されるのは奥村先生
の『美文書作成入門』だと思われますが、その第 8 版(2020 年)
ですと、「第 15 章 スタイルファイルの作り方」に dtx ファイル
の説明があります。
次に、web 上での解説でしたら、一例を挙げるとしますと:
・ Documented LaTeX sources (dtx files)
https://texfaq.org/FAQ-dtx
とかでしょうか(今検索したら 7 件目にリストアップされていた
のですが、英語なのでスルーされたのかも知れません)。
※ この The TeX FAQ というページは、UK TeX Users' Group に
よる "The UK TeX FAQ" という紙での情報(1994--2014)が元
になっています。
ut様
大変詳しく返信してくださり、本当にありがとうございます。
まず、クラスファイルを逐一自作しなくても汎用スタイルを実現できる件、大変参考になりました。確かにオプションは他のパッケージと比較して多いなぁとは思いましたが、クラスファイルの自作よりかは格段にやりやすいとも思いました。少し勉強して使いこなせるよう頑張りたいと思います。本当にありがとうございます。
dtxファイルに関しては、私が英語で検索をかけるのを失念しておりました。確かに、TeX関連の内容は英語でしっかりと検索にかけるべきでした。奥村先生の『美文書作成入門』ですが、名前は存じ上げていましたがまだ購入していないので、購入して暇なときに読んでしっかり勉強しようと思います。この度はお手数おかけしてしまい大変申し訳ありませんでした。
最後に、ここまで丁寧に対応してくださり本当にありがとうございます。
大変詳しく返信してくださり、本当にありがとうございます。
まず、クラスファイルを逐一自作しなくても汎用スタイルを実現できる件、大変参考になりました。確かにオプションは他のパッケージと比較して多いなぁとは思いましたが、クラスファイルの自作よりかは格段にやりやすいとも思いました。少し勉強して使いこなせるよう頑張りたいと思います。本当にありがとうございます。
dtxファイルに関しては、私が英語で検索をかけるのを失念しておりました。確かに、TeX関連の内容は英語でしっかりと検索にかけるべきでした。奥村先生の『美文書作成入門』ですが、名前は存じ上げていましたがまだ購入していないので、購入して暇なときに読んでしっかり勉強しようと思います。この度はお手数おかけしてしまい大変申し訳ありませんでした。
最後に、ここまで丁寧に対応してくださり本当にありがとうございます。
一点だけ気になったので、こちらについてだけ。
「もちろんこれは著作権的にアウト」
個人でどのように使用するかということについては著作者の権利は及ばないので、
自分で使うものを改変するのは著作権を侵害するものではないと思います。
ただ、ファイル名を変えずに中身を改変したものを使っていると、
忘れたころにこのような掲示板で作業の前提が違って混乱したり、
身近な人とのやり取りでうっかりファイルが流出したりするリスクがあります。
最初に自分用に別名でコピーしたものに手を入れて使うことにしても、
既存のものをそのまま改変することに比べて特に余計な手間がかかるわけでもないので、
そちらを選択しない法はないということですね。
「もちろんこれは著作権的にアウト」
個人でどのように使用するかということについては著作者の権利は及ばないので、
自分で使うものを改変するのは著作権を侵害するものではないと思います。
ただ、ファイル名を変えずに中身を改変したものを使っていると、
忘れたころにこのような掲示板で作業の前提が違って混乱したり、
身近な人とのやり取りでうっかりファイルが流出したりするリスクがあります。
最初に自分用に別名でコピーしたものに手を入れて使うことにしても、
既存のものをそのまま改変することに比べて特に余計な手間がかかるわけでもないので、
そちらを選択しない法はないということですね。