为什么我不能多次使用 \newfloat?

为什么我不能多次使用 \newfloat?

我发现漂浮包,它允许我指定\newfloat{program}{...}获取除 Table 和 Figure 之外的其他命名浮点数。但是,如果我尝试多次使用它,就会收到一个神秘的错误:

! You can't use `\def' after \the.  
\fs@plain ->\def   
                 \@fs@cfont {\rmfamily }\let \@fs@capt \floatc@plain \def \@...

它指向我尝试使用新浮点数之一的第一行 - 而不是我定义第二个浮点数的地方。但是,如果我删除\newfloat除一个之外的所有调用,一切都会按预期工作。

这是软件包的问题吗?如果是,是否有其他软件包可以做同样的事情(并且不依赖于此软件包)?


更新:这似乎与在 new floats 中使用包有关listings。以下代码会产生上述错误:

\documentclass{article}

\usepackage{floatrow}
\DeclareNewFloatType{program}{name=Program,fileext=lop,within=section}
\DeclareNewFloatType{output}{name=Output,fileext=loo,within=section}

\usepackage{listings}

\begin{document}

\begin{program}
\lstinputlisting{thisfile.tex}
\caption{some code}
\end{program}

\end{document}

如果我注释掉第二个\DeclareNewFloatType,或者在浮点数中做一些其他的事情(例如\begin{tabular}...\end{tabular}而不是\lstinputlisting{...}),代码就会正确编译。

答案1

您已经给出了几个答案,但我认为仔细分析可以指出一个具体问题。在 LaTeX2e 中,环境的工作方式是通过定义宏(称为\<name>和,\end<name>尽管后者是可选的)。这很重要,因为\output是 TeX 原语的名称,因此声明环境(称为)output将用新定义覆盖原语。

在大多数情况下,这不会显示出来,因为 LaTeX\output在您加载任何内容之前已经完成了它需要做的事情(它在内核中)。但是,该listings包想要改变的行为\output,这就是问题所在。新定义(对于环境)与旧定义(原始)根本不同,正是这一点导致了错误。

最终结果是您无法安全地调用环境output。在这里覆盖原语实在太冒险了。(戴上我的 LaTeX3 帽子,这就是我们计划用新的内部名称保存所有原语的原因,也是我们计划以更安全的方式实现环境的原因。)

答案2

listings软件包已经具备浮动程序的能力。尝试

\lstinputlisting[float,caption=some code]{thisfile.tex}

如果你希望它们被称为Programs 而不是Listings,那么你可以使用

\renewcommand\lstlistlistingname{Programs} % Header for the List of Listings
\renewcommand\lstlistingname{Program} % Caption label

要定义新的环境,您应该使用

\lstnewenvironment{program}{}{}

它与 LaTeX 的 类似\newenvironment。请参阅文档listings了解详细信息。正如 Joseph 所指出的,您不能将其用作output名称,因此您需要通过选择其他名称来解决这个问题。

答案3

尝试\DeclareNewFloatType命令浮行包(有关详细信息,请参阅文档第 63 页)。

\documentclass{article}

\usepackage{floatrow}
\DeclareNewFloatType{example}{name=Example,fileext=loe}
\DeclareNewFloatType{map}{name=Map,fileext=lom,within=section}

\begin{document}

\section{A section}

\begin{example}[!ht]
\caption{An example}
\end{example}

\begin{map}[!ht]
\caption{A map}
\end{map}

\end{document}

相关内容