使用列表和 SASnRdisplay 获取单个目录

使用列表和 SASnRdisplay 获取单个目录

我昨天才开始使用 LaTeX,但遇到了一个令人沮丧的问题。我需要自动将大量源代码包含到我的文档中,并对其进行代码高亮、行编号、标记和索引。除了几点之外,我已经完成了大部分工作。首先,我使用的是不同的语言:PHP、JS、PostgreSQL、R 和 SAS。我发现这listings不能正确处理/**/SAS 注释,所以我决定使用这个SASnRdisplay包,它似乎是包的一种“扩展” listings。它们有很多共同之处。经过很多技巧,我终于对结果感到满意了。

我现在需要做的是创建一个列表列表,其中包含对 生成的列表listings和 生成的列表的引用SASnRdisplay,使用单一的通用编号。目前我基本上有两种编号:编号listingsSASnRdisplay编号。

我尝试过使用 \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

相关内容