我发现漂浮包,它允许我指定\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}
如果你希望它们被称为Program
s 而不是Listing
s,那么你可以使用
\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}