如何使图形和列表共享其计数器

如何使图形和列表共享其计数器

我正在使用“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}

在此处输入图片描述

相关内容