一般问题
我需要重新定义带星号版本的\chapter
命令(即\chapter*
)在book
课堂上的工作方式。
我找到了未加星号的 \chapter 命令版本定义book
班级:
\def\@makechapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright \normalfont
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\huge\bfseries \@chapapp\space \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\Huge \bfseries #1\par\nobreak
\vskip 40\p@
}}
根据对这个SO答案该定义中应该有@ifstar
某个地方,但我找不到它。
\chapter
那么,星号版本是如何定义的以及在哪里定义的?
我的具体情况
为了大致说明为什么我需要这个,这里解释一下:
我有一份文件,要求章节标题由两部分组成:(1) 描述性章节编号(第一章等,因此不能使用常规\chapter
命令)和 (2) 编号下方的描述性标题,该标题可以很长。我能够将描述性标题推到章节编号下方,并使用以下宏根据我的需要设置其样式:
\documentclass[final]{book}
\usepackage{lipsum}
\def \mylongchapter#1#2{
\chapter*{\centering{\LARGE #1} \\* \textnormal{\Large #2}}
\addcontentsline{toc}{chapter}{#1: #2}
}
\begin{document}
\mylongchapter{Chapter One}{This Chapter Have Very Interesting and Long Title Below Chapter Number}
\lipsum[11-30]
\end{document}
这使:
我想控制两行章节标题之间的间距(屏幕截图上用红线标记的间距):
答案1
\@makeschapterhead
我通过添加\mycustomspacing[factor]`改变了 的定义,\centering inside and the custom spacing command
并将其全部应用于一个组中,因此外部间距不受影响!
我的代码使用了因子0.8
,它可以工作,但是从印刷的角度来看,它看起来并不好。
\documentclass{book}
\usepackage{blindtext}
\usepackage{etoolbox}
\usepackage{calc}
\usepackage{setspace}
\makeatletter
\newrobustcmd{\mynewstarredchapter}{%
\@ifnextchar[{\mynewstarredchapter@opt}{\mynewstarredchapter@noopt}%
}%
\newrobustcmd{\mynewunstarredchapter}{%
\@ifnextchar[{\mynewunstarredchapter@opt}{\mynewunstarredchapter@noopt}%
}%
\let\LaTeXStandardChapter\chapter%
\newrobustcmd{\mycustomspacing}[1][1.0]{%
\let\originalbaselineskip\baselineskip
\setlength{\baselineskip}{#1\originalbaselineskip}%
}%
\def\@makeschapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
{
\Huge \bfseries \centering\mycustomspacing[0.8]#1 \par\nobreak
}
\vskip 40\p@
}}
\newrobustcmd{\mynewunstarredchapter@opt}[2][]{%
\LaTeXStandardChapter[#1]{#2}%
}%
\newrobustcmd{\mynewunstarredchapter@noopt}[1]{%
\LaTeXStandardChapter{#1}%
}%
\newrobustcmd{\mynewstarredchapter@opt}[2][]{%
\LaTeXStandardChapter*{#2}%
}%
\newrobustcmd{\mynewstarredchapter@noopt}[1]{%
\LaTeXStandardChapter*{#1}%
}%
\renewcommand{\chapter}{%
\@ifstar{\mynewstarredchapter}{\mynewunstarredchapter}%
}%
\begin{document}
\tableofcontents
\chapter{First}
\chapter*{Starred First}
\blindtext
\chapter[Second]{2nd Chapter}
\blindtext
\chapter*[Well, useless so far]{2nd starred chapter}
\blindtext
\chapter*{This Chapter Have Very Interesting and Long Title Below Chapter Number}%
%\chapter*[Well, useless so far]{3nd starred chapter}
\blindtext
\end{document}
要求缩小版本,不带星号的重新定义......
\documentclass{book}
\usepackage{blindtext}
\usepackage{calc}
\usepackage{setspace}
\makeatletter
\newcommand{\mycustomspacing}[1][1.0]{%
\let\originalbaselineskip\baselineskip%
\setlength{\baselineskip}{#1\originalbaselineskip}%
}%
\def\@makeschapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
{%
\Huge \bfseries \centering\mycustomspacing[0.8]#1 \par\nobreak
}%
\vskip 40\p@
}}%
\makeatother
\begin{document}
\chapter*{This Chapter Have Very Interesting and Long Title Below Chapter Number}%
\blindtext
\end{document}
答案2
的定义\chapter
没有\@ifstar
:
% book.cls, line 360:
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
该\secdef
宏具有\@ifstar
;它是一个通用宏,也用于\part
;当\chapter
发现时,将执行某些操作(可能的\cleardoublepage
,设置页面样式,禁止页面顶部浮动,并声明章节标题后第一段不缩进),然后
\secdef\@chapter\@schapter
被执行。 的定义\secdef
是
% latex.ltx, line 5731:
\def\secdef#1#2{\@ifstar{#2}{\@dblarg{#1}}}
所以这里是\@ifstar
。基本上,当\chapter*{Title}
出现时,LaTeX 会找到
\secdef\@chapter\@schapter*{Title}
变成
\@ifstar{\@schapter}{\@dblarg{\@chapter}}*{Title}
由于*
如下,这变成
\@schapter{Title}
现在是什么\@schapter
?这里是
% book.cls, line 400:
\def\@schapter#1{\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}
所以这很清楚地表明,大部分工作是由 完成的\@makeschapterhead
。