编号时忽略特定行

编号时忽略特定行

这也可能是一个潜在的琐碎问题,但没有找到答案。编辑:它可能并不琐碎......

...

\usepackage{lineno}

...

\begin{linenumbers}
\begin{verbatim}

A
B

C

\end{verbatim}
\end{linenumbers}

...

当然会产生

1
2 A
3 B
4
5 C
6

但更理想的情况是


1 A
2 B
3
4 C

这样,要么第一行的编号为 0 且不可见,最后一行的编号也为 0,要么简单地从第 2 行开始编号并在最后一行之前结束。

问题:我可以重新定义哪些选项、设置哪些东西来实现这一点?

编辑。问题不是要逐字添加行号。有很多方法可以做到这一点。也没有评论。问题是不清楚如何重新定义环境,至少如何创建一个环境,使得第 1、第 N、第 T、第 Z、... 行(无论其中是否有文本)在编号时被跳过。在文档开始之前在定义中设置。每次调用环境时都一样。

答案1

我认为对于这个任务来说,删除lineno包并使用以下方法实现行号排版更容易verbatim。这是基于来自verbatim包装文档,第 5 页。编辑:我修改了解决方案以恢复关闭之前的编号;我认为这就是您想要的行为。

\usepackage{verbatim}

\makeatletter
\newif\ifprintlineno
\newcounter{reallineno} % the line number in the input
\newcounter{lineno} % the line number displayed

\newtoks\testlinenotoks
\testlinenotoks={\printlinenotrue}
\def\testlineno{\the\testlinenotoks}

\def\verbatim@processline{%
  \addtocounter{reallineno}{1}
  \testlineno
  \ifprintlineno
    \addtocounter{lineno}{1}
    \leavevmode\llap{\scriptsize\thelineno\hskip1em\hskip\@totalleftmargin}%
    \the\verbatim@line\par
  \else\the\verbatim@line\par\fi
}
\edef\verbatim@finish{\verbatim@finish
  \setcounter{lineno}{0}\setcounter{reallineno}{0}}
\makeatother

\newcommand\SuppressLineNoFromTo[2]{%
  \testlinenotoks=\expandafter{\the\testlinenotoks
  \ifnum\value{reallineno}>\numexpr#1-1\relax
  \ifnum\value{reallineno}<\numexpr#2+1\relax
    \printlinenofalse\fi\fi}}
\newcommand\SuppressLineNoAt[1]{%
  \testlinenotoks=\expandafter{\the\testlinenotoks
  \ifnum\value{reallineno}=#1
  \printlinenofalse\fi}}
\newcommand\ClearSuppressLineNo{\testlinenotoks={\printlinenotrue}}

这定义了三个命令:

  • \SuppressLineNoFromTo将在所有环境中禁止从行号#1到行号的行号#2verbatim
  • \SuppressLineNoAt#1将仅隐藏行号
  • \ClearSuppressLineNo如果要在不同环境中使用不同的规则集,则清除上面两个命令定义的所有规则

你可以用各种方式将它们组合起来。命令\verbatim@processline处理verbatim环境中每行的排版方式,\llap部分将行号设置到边距中,因此应该在那里进行调整。

以下是假设上述设置的示例:

\SuppressLineNoFromTo{5}{10}
\SuppressLineNoFromTo{15}{16}
\SuppressLineNoAt{1}

\begin{document}

\begin{verbatim}

A
B

C


D
E
F
G
H
I
J


\end{verbatim}
\end{document}

例子


旧答案:

我不知道这是否是你想要的,但是有了这个设置

\usepackage{lineno}
\usepackage{verbatim}

{\catcode`\%=13
\gdef\getnextchar#1\par{\setbox0 \hbox{\ifx%#1\gdef\nextchar{c}\else\ifx!#1\gdef\nextchar{!}\else\gdef\nextchar{?}\fi\fi}}
\gdef\ignorenext#1{}
\gdef\recat{\catcode`\%=13
  \long\def%##1\par{\getnextchar##1\par\if\nextchar c\%\fi\if\nextchar!\%\ignorenext##1\par\else
    {\nolinenumbers##1\par}\fi}}
\globaldefs=1 
\newenvironment{myverbatim}{\verbatim\recat%}{\endverbatim}}

myverbatim您将获得一个可进行以下工作的环境:

  • 注释字符%在输出中不可见,并抑制当前行的行号
  • 该组合%%会创建一个逐字注释,该注释将在输出中可见,行将没有数字
  • 该组合%!将创建一个注释,其中行将带有数字

例子:

\documentclass{article}
\usepackage{lineno}
\usepackage{verbatim}

{\catcode`\%=13
\gdef\getnextchar#1\par{\setbox0 \hbox{\ifx%#1\gdef\nextchar{c}\else\ifx!#1\gdef\nextchar{!}\else\gdef\nextchar{?}\fi\fi}}
\gdef\ignorenext#1{}
\gdef\recat{\catcode`\%=13
  \long\def%##1\par{\getnextchar##1\par\if\nextchar c\%\fi\if\nextchar!\%\ignorenext##1\par\else
    {\nolinenumbers##1\par}\fi}}
\globaldefs=1 
\newenvironment{myverbatim}{\verbatim\recat%}{\endverbatim}}

\begin{document}
\begin{linenumbers}
\begin{myverbatim}
%
A
B
%this input will be visible, the line does not have a number
just like this one %
C
%% this comment will show up, without line number
D %% like this one

E
%! this comment has a line number
F %! like this one
G

H
%
%
\end{myverbatim}
\end{linenumbers}
\end{document}

旧例子

答案2

更新

一种fancyvrb方法。

  • 实现过程有点长,但是相当一部分代码是解析逗号分隔的数字范围。
  • 提供了一个新fancyvrb选项,其用法与包提供的ignorenumberlines类似。highlightlinesfvextra
\documentclass{article}
\usepackage{etoolbox, fancyvrb} % or load package "fvextra" solely


\makeatletter

%% new fv option "ignorenumberlines", similar to "highlightlines" in fvextra pkg
\define@key{FV}{ignorenumberlines}{\def\FV@IgnoreLinesList{#1}}
\fvset{ignorenumberlines=}



%% parsing \FV@IgnoreLinesList, similar to "highlightlines"-related codes
%% For each line number <n>, let \FV@IgnoreLine:<n> to \relax.
\def\FV@IgnoreLinesPrep{%
  \ifx\FV@IgnoreLinesList\@empty
  \else
    \expandafter\FV@IgnoreLinesPrep@i
  \fi}

\def\FV@IgnoreLinesPrep@i{%
  \renewcommand{\do}[1]{%
    \ifstrempty{##1}{}{\FV@IgnoreLinesParse##1-\FV@Undefined}}%
  \expandafter\docsvlist\expandafter{\FV@IgnoreLinesList}}
\def\FV@IgnoreLinesParse#1-#2\FV@Undefined{%
  \ifstrempty{#2}%
   {\FV@IgnoreLinesParse@Single{#1}}%
   {\FV@IgnoreLinesParse@Range{#1}#2\relax}}

\def\FV@IgnoreLinesParse@Single#1{%
  \expandafter\let\csname FV@IgnoreLine:\detokenize{#1}\endcsname\relax}

\newcounter{FV@IgnoreLinesStart}
\newcounter{FV@IgnoreLinesStop}

\def\FV@IgnoreLinesParse@Range#1#2-{%
  \setcounter{FV@IgnoreLinesStart}{#1}%
  \setcounter{FV@IgnoreLinesStop}{#2}%
  \stepcounter{FV@IgnoreLinesStop}%
  \FV@IgnoreLinesParse@Range@Loop}

\def\FV@IgnoreLinesParse@Range@Loop{%
  \ifnum\value{FV@IgnoreLinesStart}<\value{FV@IgnoreLinesStop}\relax
    \expandafter\let\csname FV@IgnoreLine:\arabic{FV@IgnoreLinesStart}\endcsname\relax
    \stepcounter{FV@IgnoreLinesStart}%
    \expandafter\FV@IgnoreLinesParse@Range@Loop
  \fi}

\ifcsname FV@FormattingPrep@PreHook\endcsname % defined if fvextra is loaded
  \expandafter\g@addto@macro\expandafter\FV@FormattingPrep@PreHook
\else
  \expandafter\g@addto@macro\expandafter\FV@FormattingPrep
\fi
{\FV@IgnoreLinesPrep\setcounter{FancyVerbLineOffset}{0}}



\newcounter{FancyVerbLineOffset}

%% redefine
\def\FV@ListProcessLine#1{%
  \hbox to \hsize{%
    \kern\leftmargin
    \hbox to \linewidth{%
      %% skip ignored line number
      \ifcsname FV@IgnoreLine:\number\c@FancyVerbLine\endcsname
        \addtocounter{FancyVerbLineOffset}{-1}%
        \FV@LeftListFrame
        \FancyVerbFormatLine{#1}\hss
        \FV@RightListFrame
      \else
        \FV@LeftListNumber
        \FV@LeftListFrame
        \FancyVerbFormatLine{#1}\hss
        %% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on)
        %%      \FV@RightListFrame}%
        \FV@RightListFrame
        \FV@RightListNumber
        %% DG/SR modification end
      \fi
    }%
    \hss}}

\renewcommand{\theFancyVerbLine}{%
  \@arabic\numexpr\c@FancyVerbLine+\c@FancyVerbLineOffset\relax
}

\makeatother


\begin{document}
\begin{Verbatim}[numbers=left, ignorenumberlines={1-2}]
A1
A2
A3
A4
\end{Verbatim}

\begin{Verbatim}[numbers=right, ignorenumberlines={2,4}]
B1
B2
B3
B4
\end{Verbatim}
\end{document}

fancyvrb 方法跳过选定的行号

原始答案

您的不完整示例表明您想要使用类似逐字的环境,并在左侧显示行号。

因此我建议使用逐字特定的包,例如listingsfancyvrb。它们都具有丰富的可配置选项。选择其中一个,但不要同时选择两个。

(我个人更喜欢fancyvrb,因为它可以使用由包 扩展的全功能代码突出显示minted。)

\documentclass{article}
\usepackage{listings}
\usepackage{fancyvrb}


\begin{document}
\verb|listings| example
\lstset{basicstyle=\ttfamily, numbers=left, numberstyle=\tiny}
\begin{lstlisting}
A
B

C
\end{lstlisting}


\verb|fancyvrb| example
\fvset{numbers=left}
\begin{Verbatim}
A
B

C
\end{Verbatim}
\end{document}

使用列表或 fancyvrb 左行编号

PS:lineno该包主要用于打印文档每一行的行号,以便校对人员可以使用“更改第 n 页第 m 行的 xxx”来引用特定的文档位置。

答案3

铸造默认情况下会这样做。您可以找到有关此包的一些信息在这个问题中,主要的“困难”在于它需要--shell-escape编译文档的选项(查看这个问题学习如何自动化这个过程),以及安装一些外部包(虽然不太难,但这可能会成为采用它的障碍)。

以下文件:

% !TeX TXS-program:compile = txs:///pdflatex/[--shell-escape]
%  Need to be compiled with the --shell-escape option!
% E.g., pdflatex --shell-escape test.tex 
\documentclass{article}
\usepackage{minted}

\begin{document}
% I'm assuming you want to highlight text.
% For a list of possible languages, refer to
% minted's documentation, or open a command-line
% interface and run
%  pygmentize -L

\begin{minted}[linenos]{text}

A
B

C


\end{minted}
\end{document}

将产生

在此处输入图片描述

你甚至可以指定从哪个数字开始编号,例如

\begin{minted}[linenos, firstnumber=3]{text}

A
B

C


\end{minted}

这将产生

在此处输入图片描述

如果你想“手动选择”行号,这是可能的,但很困难。

相关内容