我昨天才开始使用 LaTeX,但遇到了一个令人沮丧的问题。我需要自动将大量源代码包含到我的文档中,并对其进行代码高亮、行编号、标记和索引。除了几点之外,我已经完成了大部分工作。首先,我使用的是不同的语言:PHP、JS、PostgreSQL、R 和 SAS。我发现这listings
不能正确处理/**/
SAS 注释,所以我决定使用这个SASnRdisplay
包,它似乎是包的一种“扩展” listings
。它们有很多共同之处。经过很多技巧,我终于对结果感到满意了。
我现在需要做的是创建一个列表列表,其中包含对 生成的列表listings
和 生成的列表的引用SASnRdisplay
,使用单一的通用编号。目前我基本上有两种编号:编号listings
和SASnRdisplay
编号。
我尝试过使用
\setcounter{lstlisting}{3}
但似乎不起作用。
下面是一个测试\lstlistoflistings
命令的示例(为简单起见,这里没有实现其他功能):
\documentclass[a4paper,twoside]{memoir}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{SASnRdisplay}
\begin{document}
\begin{lstlisting}[language=PHP, caption=First listing - using package ``listings'']
$var = "value";
\end{lstlisting}
\begin{lstlisting}[language=Java, caption=Second listing - using package ``listings'']
console.log('0123456789');
\end{lstlisting}
\begin{Rcode}[caption=Third listing - using package ``SASnRdisplay'']
df <- c(1,2,3)
\end{Rcode}
\begin{SAScode}[caption=Fourth listing - using package ``SASnRdisplay'']
/* comment */
PROC PRINT data=mydata; VAR v1; RUN;
\end{SAScode}
\lstlistoflistings
\end{document}
输出如下:
答案1
我看了源代码包的SASnRdisplay
。它定义了一个名为的宏\SNRletcountercounter
,该宏将覆盖包执行的列表的正常编号方案listings
:
% This is inspired from the memoir class, it enables us to alias the
% listings counter such that we can have different series
% It will locally make one counter behave like another counter
% it also handles the \the<counter>
\newcommand*{\SnRletcountercounter}[2]{%
\csletcs{c@#1}{c@#2}
\csletcs{the#1}{the#2}
\SnRHrefNumber{#2}
}
重新定义\SNRletcountercounter
以\@gobbletwo
取消该宏的效果并产生所需的输出。
\documentclass[a4paper,twoside]{memoir}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{SASnRdisplay}
\makeatletter
\let\SnRletcountercounter\@gobbletwo
\makeatother
\begin{document}
\begin{lstlisting}[language=PHP, caption=First listing - using package ``listings'']
$var = "value";
\end{lstlisting}
\begin{lstlisting}[language=Java, caption=Second listing - using package ``listings'']
console.log('0123456789');
\end{lstlisting}
\begin{Rcode}[caption=Third listing - using package ``SASnRdisplay'']
df <- c(1,2,3)
\end{Rcode}
\begin{SAScode}[caption=Fourth listing - using package ``SASnRdisplay'']
/* comment */
PROC PRINT data=mydata; VAR v1; RUN;
\end{SAScode}
\lstlistoflistings
\end{document}
答案2
Jubobs 解决方案 ( \let\SnRletcountercounter\relax
) 有效,但 SASnRdisplay 生成的每个列表之前可能会出现一个字符串“lstlistingRcode”。另一种方法是使用上次使用的计数器值更新列表计数器。如果最后一个列表来自包listings
,并且您想从包中添加列表SASnRdisplay
,则在两个列表之间添加以下行:
\setcounter{Rcode}{\value{lstlisting}}
否则添加以下行:
\setcounter{lstlisting}{\value{Rcode}}
如果Rcode
不起作用请尝试使用SAScode
。