根据要求,我为一本书的章节提供了两种不同的布局。第一种是第 1 章独有的,另一种是其他章节的布局。布局会影响章节、定义和段落的显示方式。我有代码来处理这个问题,放在一个小的类文件中。这是一个 MWE:
\documentclass[12pt,letterpaper]{book}
\usepackage{amsmath,amsfonts,amssymb,amsthm}
\usepackage{thmtools}
\usepackage{ifthen,calc}
\usepackage{blindtext}
\parindent=0mm
\newtheorem{teo}{Theorem}[section]
\newtheorem{axi}{Axiom}
\newtheorem{lem}{Lemma}
\newcounter{definition}
\declaretheoremstyle[%
spaceabove=6pt,%
spacebelow=6pt,%
headfont=\normalfont\bf,%
notefont=\normalfont\bf,
notebraces={{}{}},
bodyfont=\itshape,
headpunct={.}]{defistyle}
\declaretheorem[
name={Definition},
numberlike=definition,
style=defistyle]{defi}
\renewcommand\thesection
{\arabic{chapter}.\arabic{section}}
\makeatletter
\renewcommand\@seccntformat[1]{
{\csname the#1\endcsname}.\hspace{0.5em}}
\renewcommand\section{\@startsection
{section}{1}{0mm}
{6pt}
{1pt}
{\bfseries}}
\renewcommand\paragraph{\@startsection
{paragraph}{3}{0cm}
{6pt}
{1pt}
{\bfseries}}
\makeatother
\makeatletter
\newcommand{\capi}[1]{
\chapter{#1}
\ifthenelse{\value{chapter}=2}{
\renewcommand\section{\@startsection
{section}{1}{0mm}
{0pt}
{1pt}
{\Large}}
\@addtoreset{definition}{section}
\renewcommand{\thedefi}{\thesection.\arabic{definition}}
}{}}
\makeatother
\begin{document}
\capi{Some preliminaries}
\blindtext
\section{the first thing}
\blindtext[1]
\begin{defi}
The thing $1$ is real number. If $x$ is real then $x+1$ is real.
\end{defi}
\blindtext
\capi{Cool stuff}
\blindtext
\section{Complex things}
bla bla bla
\begin{defi}
We say that a number $x$ is complex if it is not really a number.
\end{defi}
\blindtext
\end{document}
如您所见,我处理每个章节不同样式的实际方法并不优雅。我将这本书分成几个文件,每个章节一个。当我查看这本书时,我通过命令选择我想看的章节。\includeonly
问题是,为了获得正确的章节、段落和定义的外观,我总是必须包含第 2 章。另外,我想避免为章节定义新命令。我的问题是:有没有办法改进这一点?
答案1
\capi
当不是第一章时,只需定义重新定义自身,这样测试和重新定义只需进行一次。
\makeatletter
\newcommand{\capi}{%
\ifnum\value{chapter}>0
\changesectionanddefi
\let\capi\chapter
\fi
\chapter
}
\def\changesectionanddefi{%
\renewcommand\section{\@startsection{section}{1}{0mm}{6pt}{1pt}{\Large}}%
\@addtoreset{definition}{section}%
\renewcommand{\thedefi}{\thesection.\arabic{definition}}%
}
\makeatother
你甚至可以做得更好:重新定义\chapter
以摆脱非标准\capi
命令:
\makeatletter
\let\leo@chapter\chapter
\renewcommand{\chapter}{
\ifnum\value{chapter}>0
\changesectionanddefi
\let\chapter\leo@chapter
\fi
\leo@chapter
}
\def\changesectionanddefi{%
\renewcommand\section{\@startsection{section}{1}{0mm}{6pt}{1pt}{\Large}}%
\@addtoreset{definition}{section}%
\renewcommand{\thedefi}{\thesection.\arabic{definition}}%
}
\makeatother
因此,不是\capi
这个,而是通常的\chapter
。
注意定义中的行尾。还请检查参数\@startsection
:您的代码无法正常工作。
答案2
您的问题是您使用了次优条件。条件不是章节计数器等于 2,而是计数器大于 1。然后条件适用于所有章节的所有部分。因此,您可以定义\section
根据条件更改其布局,而不是将重新定义放在命令\section
内部\chapter
。
缺点:每当处理一个部分时都会执行测试(而不是仅在第 2 章期间执行一次),但这不会对处理时间产生明显的影响。