我正在使用 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
如果你不使用任何特殊包,那么以下内容就足够了:
\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}