我正在使用“listings”包来编写代码片段(XML、RDF、Java 等),我希望它们具有相同的 Figure 环境计数器。
例如,
Listing 1: blablabla
Listing 2: blebleble
Figure 3: bliblibli
Listing 4: blobloblo
Figure 5: blublublu
这样做的目的是将“Listing”标签更改为“Figure”。但我需要两个环境共享同一个计数器。我该怎么做?
提前致谢。
答案1
您可以让figure
环境与 共享计数器lstlisting
。但是,您应确保lstlisting
环境也是浮动的,否则数字可能不一致,数字可能会出现在数字较低的列表之前。
\documentclass{article}
\usepackage{listings}
\makeatletter
\AtBeginDocument{%
\let\c@figure\c@lstlisting
\let\thefigure\thelstlisting
\let\ftype@lstlisting\ftype@figure % give the floats the same precedence
}
\makeatother
\begin{document}
\begin{lstlisting}[caption=A listing,float]
a=1
\end{lstlisting}
\begin{lstlisting}[caption=Another,float]
b=2
\end{lstlisting}
\begin{figure}
F
\caption{A figure}
\end{figure}
\begin{lstlisting}[caption=Again,float]
c=3
\end{lstlisting}
\end{document}
感谢大卫卡莱尔 (David Carlisle) 注意到调整的必要性\ftype@lstlisting
。
如果你也想table
共享计数器,请添加类似的指令。
\documentclass{article}
\usepackage{listings}
\makeatletter
\AtBeginDocument{%
\let\c@figure\c@lstlisting
\let\thefigure\thelstlisting
\let\c@table\c@lstlisting
\let\thetable\thelstlisting
\let\ftype@lstlisting\ftype@figure % give the floats the same precedence
\let\ftype@table\ftype@figure % give the floats the same precedence
}
\makeatother
\begin{document}
\begin{lstlisting}[caption=A listing,float]
a=1
\end{lstlisting}
\begin{lstlisting}[caption=Another,float]
b=2
\end{lstlisting}
\begin{figure}
F
\caption{A figure}
\end{figure}
\begin{table}
G
\caption{A table}
\end{table}
\begin{lstlisting}[caption=Again,float]
c=3
\end{lstlisting}
\end{document}
答案2
另一种策略是使用coupled counters
特征xassocnt
,建立一组计数器,如果组成员之一增加,则这些计数器将同样增加。这适用于“任意”数量的计数器。
这个\let\ftype@lstlisting\ftype@figure
技巧是从 egreg 的答案中“偷”来的——这样的功能并不包含在内xassoccnt
(但是......也许有一天会被添加)
\documentclass{article}
\usepackage{listings}
\usepackage{xassoccnt}
\DeclareCoupledCountersGroup{figuretablelistings}
% Only needed since listings defines the lstlisting at the begin of the document, not in the preamble
\makeatletter
\AtBeginDocument{%
\DeclareCoupledCounters[name=figurelistings]{figure,table,lstlisting}
\let\ftype@lstlisting\ftype@figure % give the floats the same precedence
}
\makeatother
\begin{document}
\begin{lstlisting}[caption=A listing,float]
a=1
\end{lstlisting}
\begin{lstlisting}[caption=Another,float]
b=2
\end{lstlisting}
\begin{figure}
F
\caption{A figure}
\end{figure}
\begin{table}
\centering
\begin{tabular}{ll}
\hline
\TeX & \LaTeXe \tabularnewline
\hline
ConTeXt & Lua\LaTeX \tabularnewline
\hline
\end{tabular}
\caption{A Table}
\end{table}
\begin{lstlisting}[caption=Again,float]
c=3
\end{lstlisting}
\end{document}