一般问题

一般问题

一般问题

我需要重新定义带星号版本的\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

相关内容