与本网站上的类似问题类似,例如:
我想定义一个自定义的、类似于节的结构 -- \unit
-- 类似于节。但是,我实际上希望它具有subsection
默认article
类中的字体大小和上下间距(因为它在我的文档中处于子节级别)。我还希望它\subunit
位于其下方。
现在我知道我可以用或任何其他方式修改\section
和,但我对此不太感兴趣,因为我想保留和并拥有另一组独立的结构,和。\subsection
titlesec
\section
\subsection
\unit
\subunit
所以我所做的就是简单地采用的标准\subsection
定义article.cls
:
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\bfseries}}
并用它来定义unit
。 和 也同样\subsubsection
如此\subunit
:
\makeatletter
\newcounter{unit}
\newcounter{subunit}[unit]
\renewcommand{\theunit}{\arabic{unit}}
\renewcommand{\thesubunit}{\theunit.\arabic{subunit}}
\newcommand\unit{\@startsection{unit}{1}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\bfseries}}
\newcommand\subunit{\@startsection{subunit}{2}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\bfseries}}
\let\unitmark\@gobble
\let\subunitmark\@gobble
\makeatother
我对自己感到非常满意,但后来我决定修改我对unit
(仅)的定义,将单词 Unit 放在数字前面,后面加上冒号,即:
第一单元:正常工作
这绝对是我希望在其他地方实现的功能,而且我认为我不是唯一一个。如果你不想使用课程的完整章节风格,那么能够轻松地按照练习 1、问题 1 甚至第 1 章的思路制作章节标题就太好了report
。
因此,我所要做的就是深入研究其内部结构\@startsection
并重新实现它们,对我决定的参数进行硬编码并摆脱所有不必要的\if \fi
,因为我没有定义超通用结构,而是定义特定的实例。
这让我想到了这一点:
\newcommand\unit[1]{%
\par
\@tempskipa -3.25ex \@plus -1ex \@minus -.2ex\relax
\@tempskipa -\@tempskipa \@afterindentfalse
\addpenalty\@secpenalty\addvspace\@tempskipa
\refstepcounter{unit}%
\begingroup
\normalfont\large\bfseries{%
\@hangfrom{\hskip \z@\relax Unit~\theunit:\space}%
\interlinepenalty \@M #1\@@par}%
\endgroup
\@xsect{1.5ex \@plus .2ex}}
这是从\@startsection
和的定义中得出的结果\@sect
latex.ltx
\def\@startsection#1#2#3#4#5#6{%
\if@noskipsec \leavevmode \fi
\par
\@tempskipa #4\relax
\@afterindenttrue
\ifdim \@tempskipa <\z@
\@tempskipa -\@tempskipa \@afterindentfalse
\fi
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty\addvspace\@tempskipa
\fi
\@ifstar
{\@ssect{#3}{#4}{#5}{#6}}%
{\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
\def\@sect#1#2#3#4#5#6[#7]#8{%
\ifnum #2>\c@secnumdepth
\let\@svsec\@empty
\else
\refstepcounter{#1}%
\protected@edef\@svsec{\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup
#6{%
\@hangfrom{\hskip #3\relax\@svsec}%
\interlinepenalty \@M #8\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}%
\else
\def\@svsechd{%
#6{\hskip #3\relax
\@svsec #8}%
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}}%
\fi
\@xsect{#5}}
而且,正如我所说的,输入价值观并摆脱不必要的\if
语句和我不会使用的替代方案。
问题
问题是,新版本\unit
在标题上方产生了多余的垂直空间,如果您比较两者的输出就会发现这一点。
左侧输出代码
\documentclass[12pt]{article}
\pagestyle{plain}
\usepackage[margin=1.8cm]{geometry}
\geometry{a4paper}
\usepackage[parfill]{parskip}
\usepackage{amsmath}
\makeatletter
\newcounter{unit}
\newcounter{subunit}[unit]
\renewcommand{\theunit}{\arabic{unit}}
\renewcommand{\thesubunit}{\theunit.\arabic{subunit}}
\newcommand\unit{\@startsection{unit}{1}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\bfseries}}
% \newcommand\unit[1]{%
% \par
% \@tempskipa -3.25ex \@plus -1ex \@minus -.2ex\relax
% \@tempskipa -\@tempskipa \@afterindentfalse
% \addpenalty\@secpenalty\addvspace\@tempskipa
% \refstepcounter{unit}%
% \begingroup
% \normalfont\large\bfseries{%
% \@hangfrom{\hskip \z@\relax Unit~\theunit:\space}%
% \interlinepenalty \@M #1\@@par}%
% \endgroup
% \@xsect{1.5ex \@plus .2ex}}
\newcommand\subunit{\@startsection{subunit}{2}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\bfseries}}
\let\unitmark\@gobble
\let\subunitmark\@gobble
\makeatother
\title{Log Book}
\date{}
\begin{document}
\maketitle
\section*{Activity Log}
\unit{Normal Working}
\subunit{Shift handover}
A good shift handover includes discussion of the past, present and future: what
has happened, what is happening now, what might happen in future.
\end{document}
右侧输出的代码
\documentclass[12pt]{article}
\pagestyle{plain}
\usepackage[margin=1.8cm]{geometry}
\geometry{a4paper}
\usepackage[parfill]{parskip}
\usepackage{amsmath}
\makeatletter
\newcounter{unit}
\newcounter{subunit}[unit]
\renewcommand{\theunit}{\arabic{unit}}
\renewcommand{\thesubunit}{\theunit.\arabic{subunit}}
% \newcommand\unit{\@startsection{unit}{1}{\z@}%
% {-3.25ex \@plus -1ex \@minus -.2ex}%
% {1.5ex \@plus .2ex}%
% {\normalfont\large\bfseries}}
\newcommand\unit[1]{%
\par
\@tempskipa -3.25ex \@plus -1ex \@minus -.2ex\relax
\@tempskipa -\@tempskipa \@afterindentfalse
\addpenalty\@secpenalty\addvspace\@tempskipa
\refstepcounter{unit}%
\begingroup
\normalfont\large\bfseries{%
\@hangfrom{\hskip \z@\relax Unit~\theunit:\space}%
\interlinepenalty \@M #1\@@par}%
\endgroup
\@xsect{1.5ex \@plus .2ex}}
\newcommand\subunit{\@startsection{subunit}{2}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\bfseries}}
\let\unitmark\@gobble
\let\subunitmark\@gobble
\makeatother
\title{Log Book}
\date{}
\begin{document}
\maketitle
\section*{Activity Log}
\unit{Normal Working}
\subunit{Shift handover}
A good shift handover includes discussion of the past, present and future: what
has happened, what is happening now, what might happen in future.
\end{document}
答案1
在清理过程中\@startsection
,存在以下条件:
\if@nobreak
\everypar{}%
\else
\addpenalty\@secpenalty\addvspace\@tempskipa
\fi
计算结果为真,因此\everypar{}
。在您的代码中,您使用了 false 分支,因此存在差异。
\@startsection
但我建议你重新考虑你的方法。首先,剥离和其下属部分将hyperref
无法与你新定义的部分(hyperref
补丁\@startsection
)一起工作。
相反,您可以重新定义\theunit
并\thesubunit
以所需的格式打印章节标题:
\renewcommand{\theunit}{Unit~\arabic{unit}:\space}
\renewcommand{\thesubunit}{Subunit~\arabic{unit}.\arabic{subunit}:\space}
此外,如果您想要\quad
之后的空格\thesection
但不想要 之后的空格\theunit
,您可以重新定义\@seccntformat
以检查这一点,并借助 的一点帮助expl3
(没有 也可以做到expl3
,但为什么呢?;-)
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \StrCaseF \str_case:nnF
\ExplSyntaxOff
\renewcommand{\@seccntformat}[1]{%
\csname the#1\endcsname
\StrCaseF{#1}{{unit}{}{subunit}{}}{\quad}% To remove \quad from \unit and \subunit
}
这样,输出看起来就像您想要的那样:
完整代码:
\documentclass[12pt]{article}
\pagestyle{plain}
\usepackage[margin=1.8cm]{geometry}
\geometry{a4paper}
\usepackage[parfill]{parskip}
\usepackage{amsmath}
\makeatletter
\newcounter{unit}
\newcounter{subunit}[unit]
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN \StrCaseF \str_case:nnF
\ExplSyntaxOff
\renewcommand{\theunit}{Unit~\arabic{unit}:\space}
\renewcommand{\thesubunit}{Subunit~\arabic{unit}.\arabic{subunit}:\space}
\renewcommand{\@seccntformat}[1]{%
\csname the#1\endcsname
\StrCaseF{#1}{{unit}{}{subunit}{}}{\quad}% To remove \quad from \unit and \subunit
}
\newcommand\unit{\@startsection{unit}{1}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\bfseries}}
\newcommand\subunit{\@startsection{subunit}{2}{\z@}%
{-3.25ex \@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\bfseries}}
\let\unitmark\@gobble
\let\subunitmark\@gobble
\makeatother
\title{Log Book}
\date{}
\pagenumbering{gobble}
\begin{document}
\maketitle
\section*{Activity Log}
\unit{Normal Working}
\subunit{Shift handover}
A good shift handover includes discussion of the past, present and future: what
has happened, what is happening now, what might happen in future.
\end{document}