禁用节标题中的行号

禁用节标题中的行号

我正在使用 lineno 包对文档中的行进行编号。默认情况下,lineno 会尝试对所有内容进行编号,包括节标题。我想禁用节标题上的行编号,最好以自动方式禁用,这样我就不需要手动编辑文档中的每个节标题。

lineno 手册提供以下方法来禁用行号:

\nolinenumbers
... text ...
\linenumbers

\begin{nolinenumbers}
... text ...
\end{nolinenumbers}

除了我需要\section{...}在文档中的每个调用周围手动添加此代码外,这可以正常工作。

假设我可以\renewcommand{\section}自动完成此操作,但我不确定正确的方法 (TM) 是什么。以下简单的代码似乎可以工作,但我不确定这样做是否不会遇到一些令人讨厌的边缘情况。除其他事项外,除了要使它正常工作之外,我还需要重新定义\subsection和。\subsubsection\section

\let\oldsection\section
\renewcommand{\section}[1]{\nolinenumbers \oldsection{#1} \linenumbers}

有没有更强大和/或更优雅的方法来做到这一点?

答案1

如果你不使用任何特殊包,那么以下内容就足够了:

enter image description here

\documentclass{article}
\usepackage{etoolbox,lineno}% http://ctan.org/pkg/{etoolbox,lineno}
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\makeatletter
% \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
\patchcmd{\@startsection}{\@ifstar}{\nolinenumbers\@ifstar}{}{}
\patchcmd{\@xsect}{\ignorespaces}{\linenumbers\ignorespaces}{}{}
\makeatother
\linenumbers
\begin{document}
\section{A section} \lipsum[2]
\subsection{Another section} \lipsum[2]
\subsubsection{Final section} \lipsum[2]
\end{document}

有两个补丁是通过etoolbox

  • 第一个插入\nolinenumbers作为其中的一部分\@startsection-在\par发出后立即调用,以确保章节标题行中没有行号;
  • 第二个\linenumbers在章节标题设定后立即插入。

这些插入的特定位置将允许所有类型的未编号部分单元(带星号或不带星号),尽管在某些情况下效果不会可见(例如,默认情况下\paragraph\subparagraph),因为插入部分的文本紧跟在标题之后。

答案2

对 Werner 的出色回答进行一些补充,以防您使用titlesec,而 Werner 的补丁对此不起作用。

首先,简单介绍一下使用\nolinenumbers\linenumbers。实际上,在我自己的包或类中,我通常有以下内容:

\newif\ifLNturnsON
\def\LocallyStopLineNumbers{\LNturnsONfalse%
    \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers}
\def\ResumeLineNumbers{\ifLNturnsON\linenumbers\fi}

\LocallyStopLineNumbers和比和\ResumeLineNumbers更好,因为它们检测行号是否已经打开,因此如果用户在 时尚未启用行号,则在禁用行号后将不会启用它。\nolinenumbers\linenumbers\ResumeLineNumbers\LocallyStopLineNumbers

使用titlesec,您可以添加\LocallyStopLineNumbers到格式的开头和[\LocallyStopLineNumbers]结尾。在下面的示例中,我包含了一组模仿默认样式的完整格式(代码是从titlesec,“8.2. 标准类“)。当然你也可以用类似的方法修改自己的风格。

\documentclass{article}
\usepackage{lineno}
\usepackage{lipsum}

\usepackage{titlesec}

\newif\ifLNturnsON
\def\LocallyStopLineNumbers{\LNturnsONfalse%
    \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers}
\def\ResumeLineNumbers{\ifLNturnsON\linenumbers\fi}

\makeatletter

\titleformat{\chapter}[display]
{\LocallyStopLineNumbers\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge}[\ResumeLineNumbers]
\titleformat{\section}
{\LocallyStopLineNumbers\normalfont\Large\bfseries}{\thesection}{1em}{}[\ResumeLineNumbers]
\titleformat{\subsection}
{\LocallyStopLineNumbers\normalfont\large\bfseries}{\thesubsection}{1em}{}[\ResumeLineNumbers]
\titleformat{\subsubsection}
{\LocallyStopLineNumbers\normalfont\normalsize\bfseries}{\thesubsubsection}{1em}{}[\ResumeLineNumbers]
\titleformat{\paragraph}[runin]
{\LocallyStopLineNumbers\normalfont\normalsize\bfseries}{\theparagraph}{1em}{}[\ResumeLineNumbers]
\titleformat{\subparagraph}[runin]
{\LocallyStopLineNumbers\normalfont\normalsize\bfseries}{\thesubparagraph}{1em}{}[\ResumeLineNumbers]
\titlespacing*{\chapter}     {0pt}{50pt}{40pt}
\titlespacing*{\section}     {0pt}{3.5ex plus 1ex minus .2ex}{2.3ex plus .2ex}
\titlespacing*{\subsection}   {0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\titlespacing*{\subsubsection}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
\titlespacing*{\paragraph}   {0pt}{3.25ex plus 1ex minus .2ex}{1em}
\titlespacing*{\subparagraph} {\parindent}{3.25ex plus 1ex minus .2ex}{1em}

\makeatother

\linenumbers

\begin{document}
\section{A section} \lipsum[2]
\subsection{Another section} \lipsum[2]
\subsubsection{Final section} \lipsum[2]
\end{document}

enter image description here

相关内容