问题

问题

与本网站上的类似问题类似,例如:

更改章节标题

我想定义一个自定义的、类似于节的结构 -- \unit-- 类似于节。但是,我实际上希望它具有subsection默认article类中的字体大小和上下间距(因为它在我的文档中处于子节级别)。我还希望它\subunit位于其下方。

现在我知道我可以用或任何其他方式修改\section和,但我对此不太感兴趣,因为我想保留和并拥有另一组独立的结构,和。\subsectiontitlesec\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和的定义中得出的结果\@sectlatex.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}

相关内容