我正在使用该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=none
as 永远不会执行\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
。:)
我只是扩展了它以做其他事情。