如何创建两个具有各自计数器的 lstlisting 环境?
例如如果我使用
\lstnewenvironment{algorithm}[2]{
\renewcommand\lstlistingname{Algorithm}
\lstset{ ... }
} {}
\lstnewenvironment{program}[2]{
\renewcommand\lstlistingname{Program}
\lstset{ ... }
} {}
进而
\begin{algorithm}{Algorithm caption}{alg-label}
...
\end{algorithm}
\begin{program}{Program caption}{prg-label}
...
\end{program}
然后他们将共享计数器,例如
Algorithm 1.1
...
Program 1.2
...
我希望对于不同的列表环境,计数是独立的。
我还使用 caption 包来创建漂亮的标题。我已经尝试了很多方法,但都没有成功。我发现唯一能指示如何更改计数器/文件扩展名的方法是通过 ie \DeclareCaptionType[fileext=alg]{algorithm},但问题是这个命令已经定义了一个新环境,所以我不知道如何将它与新的 listings 环境和 caption 包一起使用。例如,我使用以下设置:
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox[cmyk]{0.43, 0.35, 0.35,0.01}{\parbox{\textwidth}{\hspace{15pt}#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white, singlelinecheck=false, margin=0pt, font={bf,footnotesize}}
答案1
\newcounter{algorithm}
\lstnewenvironment{algorithm}[2]{
\renewcommand\lstlistingname{Algorithm}
\setcounter{lstlisting}{\value{algorithm}}
\lstset{ ... }
} {\addtocounter{algorithm}{1}}
\newcounter{program}
\lstnewenvironment{program}[2]{
\renewcommand\lstlistingname{Program}
\setcounter{lstlisting}{\value{program}}
\lstset{ ... }
} {\addtocounter{program}{1}}
然后执行以下操作:
\begin{algorithm}{Algorithm caption}{alg-label}
...
\end{algorithm}
\begin{algorithm}{Another algorithm caption}{another-alg-label}
...
\end{algorithm}
\begin{program}{Program caption}{prg-label}
...
\end{program}
结果是:
Algorithm 1.1
...
Algorithm 1.2
...
Program 1.1
...
答案2
也许您应该尝试手动调用命令setcounter
来改变计数器lstlisting
:
\setcounter{lstlisting}{value}
因此,您将能够为每个新环境重新初始化计数器。
然后,您可以做更复杂的事情,例如使用标签的值自动调用 setcounter。
答案3
并非一切都fraktalek 的回答已明确显示。我无法使用提供的代码并复制他的输出。具体来说,缺少标题和(我假设)标签。
我发现这个答案这对我有帮助,我注意到 中有一个标题字段lstset
。因此,这是一个完整的工作示例,其中包含两个自定义 中的标题和标签lstnewenvironment
。
\documentclass[11pt, english, letterpaper]{article}
\usepackage[utf8]{inputenc}
\usepackage[scaled=0.9]{couriers} % Typewriter font which supports bold
\usepackage[scaled]{helvet}
\usepackage{listings}
\newcounter{algorithm}
\lstnewenvironment{algorithm}[2]{
\renewcommand\lstlistingname{Algorithm}
\setcounter{lstlisting}{\value{algorithm}}
\lstset
{
language=C,
basicstyle=\ttfamily,
frame = tb,
caption={[#1]{#1}}, % <------------- NOTICE
label={#2}, % <------------- NOTICE
}
}{\addtocounter{algorithm}{1}}
\newcounter{program}
\lstnewenvironment{program}[2]{
\renewcommand\lstlistingname{Program}
\setcounter{lstlisting}{\value{program}}
\lstset
{
language=Python,
basicstyle=\ttfamily,
frame = tb,
caption={[#1]{#1}},
label={#2},
}
}{\addtocounter{program}{1}}
\begin{document}
Text before, referencing Algorithm \ref{alg-label}.
\begin{algorithm}{Something descriptive}{alg-label}
#include <stddef.h>
\end{algorithm}
\begin{algorithm}{Something descriptive}{alg-label2}
char * foo(unsigned char bar);
\end{algorithm}
\begin{program}{Something descriptive}{prog-label}
def foo(bar: int) -> str:
print(bar)
\end{program}
Text after, referencing Algorithm \ref{alg-label2} and Program \ref{prog-label}.
\end{document}
由此产生...