如何在页边空白处对段落(和章节)进行编号?

如何在页边空白处对段落(和章节)进行编号?

我(仍然)尝试复制这个文件

章节和段落均已编号,位于页边距中(章节标题不将此视为页边距,但我可以忽略这一点)。它们左对齐。

到目前为止,Google 和 Play 已经发现了这些:

1) parano.sty
它可以让我自动编号段落,这很好。它对深度(即子段落)没有灵活性,我还没有测试过移动它的编号。

2) \paragraph{}
这是目前最接近的解决方案。使用\setcounter{secnumdepth}{5}它可以为段落添加数字。然后,此代码将所有数字放在边距中:

\makeatletter
\def\@seccntformat#1{\protect\makebox[0pt][r]{\csname the#1\endcsname\quad}}
\makeatother

[0pt]我可以通过增加和更改r为来使它们左对齐l,但我无法正确获得悬挂缩进(或将框移动到左边距)

此外,没有标题的 \paragraphs 会留下一些空间(大概是为了将文本与标题分开?),进一步阻止了我所追求的整齐对齐。

该解决方案(具有相同的限制)还允许我使用子段落,我最终会需要它。

答案1

看了链接的文档后,我发现了六个部分单元:章、节、带标题的编号小节、无标题的编号小节、带标题的编号小节和无标题的编号小节。所以问题是如何定义这六个部分单元。

下面的代码展示了使用标题安全包;底层思想是使用\llap\parboxes 来排版悬挂在边距上的数字。长度\titleindent允许您轻松控制悬挂缩进。

\paragraph已被更改,以便允许没有标题的编号小节,并且\subparagraph还被重新定义为允许编号小节。

下表显示了文档各部分单元之间的“词典”和用于排版的 LaTeX 命令:

  • 章节 ->\chapter

  • 章节 ->\section

  • 带标题的编号小节 ->\subsection

  • 无标题的带编号小节 ->\paragraph

  • 带标题的编号子部分 ->\subsubsection

  • 无标题的带编号子小节 ->\subparagraph

以下是代码(请随意进行必要的调整以满足您的要求):

\documentclass{book}
\usepackage{titlesec}
\usepackage{etoolbox}
\usepackage{lipsum}

\setcounter{secnumdepth}{5}
\renewcommand\thesection{\arabic{section}}

% this length controls tha hanging indent for titles
% change the value according to your needs
\newlength\titleindent
\setlength\titleindent{2cm}

\pretocmd{\paragraph}{\stepcounter{subsection}}{}{}
\pretocmd{\subparagraph}{\stepcounter{subsubsection}}{}{}

\titleformat{\chapter}[block]
  {\normalfont\huge\bfseries}{}{0pt}{\hspace*{-\titleindent}}

\titleformat{\section}
  {\normalfont\Large\bfseries}{\llap{\parbox{\titleindent}{\thesection\hfill}}}{0em}{}

\titleformat{\subsection}
  {\normalfont\large}{\llap{\parbox{\titleindent}{\thesubsection\hfill}}}{0em}{\bfseries}

\titleformat{\subsubsection}
  {\normalfont\normalsize}{\llap{\parbox{\titleindent}{\thesubsubsection}}}{0em}{\bfseries}

\titleformat{\paragraph}[runin]
  {\normalfont\large}{\llap{\parbox{\titleindent}{\thesubsection\hfill}}}{0em}{}

\titleformat{\subparagraph}[runin]
  {\normalfont\normalsize}{\llap{\parbox{\titleindent}{\thesubsubsection\hfill}}}{0em}{}

\titlespacing*{\chapter}{0pt}{0pt}{20pt}
\titlespacing*{\subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\titlespacing*{\paragraph}{0pt}{3.25ex plus 1ex minus .2ex}{0em}
\titlespacing*{\subparagraph}{0pt}{3.25ex plus 1ex minus .2ex}{0em}

\begin{document}

\chapter{Test chapter}
\section{Test Section}
\lipsum[2]
\subsection{Test Subsection}
\lipsum[2]
\paragraph{}% acts like a numbered subsection without title
\lipsum[2]
\subsubsection{Test Subsubsection}
\lipsum[2]
\subparagraph{}% acts like a numbered subsubsection without title
\lipsum[2]

\end{document}

enter image description here

以前的方法假设您不会使用\paragraph\subparagraph标准格式;另一个(也许更明智的)选择是定义两个全新的分段单元;当然,这需要一些额外的工作,但现在您将拥有标准分段单元加上两个新的分段单元。

以下代码说明了此方法的定义\subsectionwt(对于没有标题的编号小节)和\subsubsectionwt(对于没有标题的编号小节);它还为目录做出了必要的规定。

新的“词典”现在是:

  • 章节 ->\chapter

  • 章节 ->\section

  • 带标题的编号小节 ->\subsection

  • 无标题的带编号小节 ->\subsectionwt

  • 带标题的编号子部分 ->\subsubsection

  • 无标题的带编号子小节 ->\subsubsectionwt

  • 段落 ->\paragraph

  • 子段落 ->\subparagraph

示例代码:

\documentclass{book}
\usepackage{titlesec,titletoc}
\usepackage{etoolbox}
\usepackage{lipsum}

\setcounter{secnumdepth}{5}
\renewcommand\thesection{\arabic{section}}

% this length controls tha hanging indent for titles
% change the value according to your needs
\newlength\titleindent
\setlength\titleindent{2cm}

% counters for the new sectional units
\newcounter{subsectionwt}
\newcounter{subsubsectionwt}

% definition of the new sectional units with the representation of the counters
\titleclass{\subsectionwt}{straight}[\subsubsection]
\renewcommand{\thesubsectionwt}{\thesection.\arabic{subsectionwt}}

\titleclass{\subsubsectionwt}{straight}[\subsectionwt]
\renewcommand{\thesubsubsectionwt}{\thesubsection.\arabic{subsubsectionwt}}

% \subsection must increase the subsectionwt counter
% and \subsectionwt must increase the subsection counter
% Analogous treatment for \subsubsection and \subsubsectionwt
\pretocmd{\subsectionwt}{\stepcounter{subsection}}{}{}
\pretocmd{\subsection}{\stepcounter{subsectionwt}}{}{}
\pretocmd{\subsubsectionwt}{\stepcounter{subsubsection}}{}{}
\pretocmd{\subsubsection}{\stepcounter{subsubsectionwt}}{}{}

% format for the sectional units
\titleformat{\chapter}[block]
  {\normalfont\huge\bfseries}{}{0pt}{\hspace*{-\titleindent}}

\titleformat{\section}
  {\normalfont\Large\bfseries}{\llap{\parbox{\titleindent}{\thesection\hfill}}}{0em}{}

\titleformat{\subsection}
  {\normalfont\large}{\llap{\parbox{\titleindent}{\thesubsection\hfill}}}{0em}{\bfseries}

\titleformat{\subsectionwt}[runin]
  {\normalfont\large}{\llap{\parbox{\titleindent}{\thesubsectionwt\hfill}}}{0em}{\bfseries}

\titleformat{\subsubsection}
  {\normalfont\normalsize}{\llap{\parbox{\titleindent}{\thesubsubsection}}}{0em}{\bfseries}

\titleformat{\subsubsectionwt}[runin]
  {\normalfont\normalsize}{\llap{\parbox{\titleindent}{\thesubsubsectionwt}}}{0em}{\bfseries}

\titlespacing*{\chapter}{0pt}{0pt}{20pt}
\titlespacing*{\subsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\titlespacing*{\subsectionwt}{0pt}{3.25ex plus 1ex minus .2ex}{0em}
\titlespacing*{\subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\titlespacing*{\subsubsectionwt}{0pt}{3.25ex plus 1ex minus .2ex}{0em}

% numbered entries without title shouldn't go to the ToC
\titlecontents{subsectionwt}[]{}{}{}{}
\titlecontents{subsubsectionwt}[]{}{}{}{}

\begin{document}

\tableofcontents

\chapter{Test chapter}
\section{Test Section}
\lipsum[2]
\subsection{Test Subsection}
\lipsum[2]
\subsectionwt{}% for numbered subsections without title
\lipsum[2]
\subsubsection{Test Subsubsection}
\lipsum[2]
\subsubsectionwt{}% for numbered subsubsections without title
\lipsum[2]

\end{document}

答案2

对于 KOMA-Script 类,您不需要额外的包。在 KOMA-Script 类中,章节标题的数量由\partformat\chapterformat\sectionformat\subsectionformat……打印\subparagraphformat。所以我的第一个建议是重新定义这些命令:

\documentclass{scrreprt}
\usepackage{blindtext}

\setcounter{secnumdepth}{\paragraphnumdepth}% To show the result for all
                                            % levels down to paragraph

\newcommand*{\numberinmargin}[1]{%
  \makebox[0pt][r]{#1\autodot\hskip\marginparsep}}

\renewcommand*{\chapterformat}{\numberinmargin{\thechapter}}
\renewcommand*{\sectionformat}{\numberinmargin{\thesection}}
\renewcommand*{\subsectionformat}{\numberinmargin{\thesubsection}}
\renewcommand*{\subsubsectionformat}{\numberinmargin{\thesubsubsection}}
\renewcommand*{\paragraphformat}{\numberinmargin{\theparagraph}}

\begin{document}
\chapter{A Chapter Title}
\blindtext
\section{A Section Title}
\blindtext
\subsection{A Subsection Title}
\blindtext
\subsubsection{A Subsubsection Title}
\blindtext
\paragraph{A Paragraph Title}
\blindtext
\end{document}

right aligned numbers

您可以使用的另一种定义来将数字左对齐\numberinmargin,例如:

\newcommand*{\numberinmargin}[1]{%
  \makebox[0pt][r]{%
    \makebox[\marginparwidth][l]{#1\autodot}%
    \hskip\marginparsep
  }%
}

将导致:

left aligned chapter … paragraph

但是如果你使用相同的代码\subparagraph

\setcounter{secnumdepth}{\subparagraphnumdepth}
\renewcommand*{\subparagraphformat}{\numberinmargin{\thesubparagraph}}

在文件序言中和

\subparagraph{A Subparagraph Title}
\blindtext

在正文中你会发现它不起作用:

failure

为什么会失败?的默认设置\subparagraph是缩进标题。因此\makebox[0pt][r]{…},从当前位置开始打印内容(= 数字)的,现在不是从文本区域的左边缘打印,而是从缩进位置打印。

我们可以通过删除缩进来解决这个问题:

\RedeclareSectionCommand[indent=0pt]{subparagraph}

subparagraph without indent

但是如果我们想尊重缩进,那也可以为其他部分级别进行配置,我们必须向下一步进入 KOMA-Script 的较低级别界面并重新定义\sectionlinesformat\sectioncatchphraseformat

\sectionlinesformat用于格式化打印显示的节级的节标题。默认情况下,这些是\section\subsection\subsubsection。默认定义(在 KOMA-Script 手册中给出)是:

\newcommand{\sectionlinesformat}[4]{%
  \@hangfrom{\hskip #2#3}{#4}%
}

第一个参数是节级的名称,即section,,,subsectionsubsubsection第二个参数是缩进。第三个参数是给出的数字\…format,第四个参数是标题文本。\@hangfrom用于格式化多行标题的悬挂标题。假设我们想要边距中的数字,但文本区域中的缩进,我们可以移动#2' to the front still using the redefined\…format` 命令:

\renewcommand{\sectionlinesformat}[4]{%
  #3\@hangfrom{\hskip #2}{#4}%
}

\sectioncatchpraseformat用于在文本中打印为标语的章节标题。通常用于\paragraph\subparagraph。默认类似于\sectionlinesformat但没有\@hangfrom

\newcommand{\sectioncatchphraseformat}[4]{%
  \hskip #2#3#4%
}

重新定义也类似:

\renewcommand{\sectioncatchphraseformat}[4]{%
  #3\hskip #2#4%
}

让我们再次使用右对齐版本\numbersinmargin

\documentclass{scrreprt}
\usepackage{blindtext}

\setcounter{secnumdepth}{\subparagraphnumdepth}% To show the result for all
                                               % levels down to subparagraph

\newcommand*{\numberinmargin}[1]{%
  \makebox[0pt][r]{%
    \makebox[\marginparwidth][r]{#1\autodot}%
    \hskip\marginparsep
  }%
}

\renewcommand*{\chapterformat}{\numberinmargin{\thechapter}}

\renewcommand*{\sectionformat}{\numberinmargin{\thesection}}
\renewcommand*{\subsectionformat}{\numberinmargin{\thesubsection}}
\renewcommand*{\subsubsectionformat}{\numberinmargin{\thesubsubsection}}
\renewcommand*{\paragraphformat}{\numberinmargin{\theparagraph}}
\renewcommand*{\subparagraphformat}{\numberinmargin{\thesubparagraph}}
\makeatletter% because of @ in \@hangfrom
\renewcommand{\sectionlinesformat}[4]{%
  #3\@hangfrom{\hskip #2}{#4}%
}
\makeatother% switch back from \makeatletter
\renewcommand{\sectioncatchphraseformat}[4]{%
  #3\hskip #2#4%
}

\begin{document}
\chapter{A Chapter Title}
\blindtext
\section{A Section Title}
\blindtext
\subsection{A Subsection Title}
\blindtext
\subsubsection{A Subsubsection Title}
\blindtext
\paragraph{A Paragraph Title}
\blindtext
\subparagraph{A Subparagraph Title}
\blindtext
\end{document}

indent of subparagraph

如您所见,\subparagraph标题现在缩进,而不会干扰数字的位置。

如果您还想处理带有前缀行的章节标题(请参阅chapterprefixKOMA-Script 手册中的选项)或部分标题,则需要额外的定义。例如,对于前缀行,您可以像上面一样将数字移动到边距,但术语Chapter保留在文本区域中:

\renewcommand*{\chapterformat}{%
  \numberinmargin{\thechapter}\chapappifchapterprefix{}%
}

如果您现在添加选项chapterprefix\documentclass您将获得:

chapter with prefix line

我要说的是:我不喜欢这个结果并建议不要使用chapterprefix

对于部分标题,您可以做类似的事情,但我也不喜欢结果,所以我不会显示它。

答案3

如果章节编号位于标题下方,请输入\parbox[b]@GonzaloMedina 的答案。要增加子章节的缩进,请参阅以下答案所有 ((sub)sub) 部分均自动按合法样式缩进

相关内容