lstlisting 环境中的自定义行号

lstlisting 环境中的自定义行号

我正在使用该lstlisting环境来显示代码并且效果很好,但是对于我当前的应用程序,我需要类似以下内容:

 line 1;    
 3.1: line 2;     
 line 3;     
 3.1.5: line 4;     
 line 5;

例如,我想在某些行上添加数字,我必须决定这些数字。我知道我可以像上面的框一样直接输入它们,但这样看起来会很糟糕,因为行不再匹配。我阅读了 lstlisting 文档,但没有出现类似情况。这里有没有只有经验丰富的用户才知道的解决方法?

答案1

我认为,如果没有编号系统,你就无法不进行一些手工劳动。但是,你可以巧妙地listings使用其他值。作为参考,它是保存当前行号的
计数器。lstnumber

因此解决方案是使用计数器进行条件检查并插入正确的格式或引用。

我创建了一个宏,它可以收集行号信息并在到达行号时插入正确的格式。

% Save the original way of printing the number
\let\othelstnumber=\thelstnumber
\def\createlinenumber#1#2{
    \edef\thelstnumber{%
        \unexpanded{%
            \ifnum#1=\value{lstnumber}\relax
              #2%
            \else}%
        \expandafter\unexpanded\expandafter{\thelstnumber\othelstnumber\fi}%
    }
    \ifx\othelstnumber=\relax\else
      \let\othelstnumber\relax
    \fi
}

该宏将连续存储您希望用计数器替换的任何信息lstnumber

因此调用:

\createlinenumber{105}{3.1}
\createlinenumber{107}{3.1.5}

将全局将第 105 行和第 107 行分别更改为 3.1、3.1.5。

因此

\documentclass{article}
\usepackage{listings}
\begin{document}
% Save the original way of printing the number
\let\othelstnumber=\thelstnumber
\def\createlinenumber#1#2{
    \edef\thelstnumber{%
        \unexpanded{%
            \ifnum#1=\value{lstnumber}\relax
              #2%
            \else}%
        \expandafter\unexpanded\expandafter{\thelstnumber\othelstnumber\fi}%
    }
    \ifx\othelstnumber=\relax\else
      \let\othelstnumber\relax
    \fi
}

\bgroup
\createlinenumber{105}{3.1}
\createlinenumber{107}{3.1.5}
\begin{lstlisting}[numbers=left,firstnumber=100,numberstyle=\ttfamily]
  begin { empty lines }








  end; { empty lines }
\end{lstlisting}
\egroup

\end{document}

将产生:

输出

请注意,和的使用\bgroup\egroup没有被全局改变。

仅限手动选择的线路

如果你不想显示任何其他的,你只需要告诉TeX丢弃它们。请注意,你不能使用numbers=noneas 永远不会执行\thelstnumber
因此代码如下所示:

\def\createlinenumber#1#2{
    \edef\thelstnumber{%
        \unexpanded{%
            \ifnum#1=\value{lstnumber}\relax
              #2%
            \fi}%
        \ifx\thelstnumber\relax\else
        \expandafter\unexpanded\expandafter{\thelstnumber}%
        \fi
    }
}

但是上面的方法需要在第一次使用前进行初始化。然后您必须添加:\let\thelstnumber\relax在第一次执行之后\bgroup但在第一次执行之前\createlinenumber

作为奖励信息。这原本是为一位朋友的论文设计的,他希望将其007打印在页面上7。因此我当然将其用在了页面上\thepage。:)
我只是扩展了它以做其他事情。

相关内容