![编号时忽略特定行](https://linux22.com/image/407701/%E7%BC%96%E5%8F%B7%E6%97%B6%E5%BF%BD%E7%95%A5%E7%89%B9%E5%AE%9A%E8%A1%8C.png)
这也可能是一个潜在的琐碎问题,但没有找到答案。编辑:它可能并不琐碎......
...
\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
到行号的行号#2
verbatim
\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
类似。highlightlines
fvextra
\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}
原始答案
您的不完整示例表明您想要使用类似逐字的环境,并在左侧显示行号。
因此我建议使用逐字特定的包,例如listings
或fancyvrb
。它们都具有丰富的可配置选项。选择其中一个,但不要同时选择两个。
(我个人更喜欢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}
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}
这将产生
如果你想“手动选择”行号,这是可能的,但很困难。