我想在宏中建立一种新的浮点类型。在此过程中要设置的参数之一是 \ftype@TYPE,其中 TYPE 是浮点类型:图形、表格等等。我知道,\ftype@figure = 1 和 \ftype@table = 2 通常已在类(例如 report.cls)中设置,并且我知道,每个后续浮点类型都会获得一个数字,该数字是前一个浮点类型的两倍,因此下一个浮点类型将是 4,然后是 8,然后是 16,依此类推。
但我不知道的是:在宏内部如何找出已经在使用的最高浮点类型数字——以避免使用两次?
答案1
不幸的是 latex 并没有提供很好的解决方案。实际上,该float
包提供了一个标准\newfloat
分配器,但它必须猜测初始状态,如果你在除 和 之外的浮点数figure
定义之后加载它table
,那么它们将被 覆盖\newfloat
。
如果你不想强制float
加载,那么我建议
a) 测试是否\newfloat
已定义,如果是,则使用它。
b)如果未定义,则将值设置为 1,然后测试常见的嫌疑人,并在每次定义时将值加倍,以获得自由数字,因此也许测试\c@figure\c@table\c@listings\c@algorithm
listings
包中有一个更简单的版本,它实现了同样的想法
\AtBeginDocument{%
\@ifundefined{c@float@type}%
{\edef\ftype@lstlisting{\ifx\c@figure\@undefined 1\else 4\fi}}
{\edef\ftype@lstlisting{\the\c@float@type}%
\addtocounter{float@type}{\value{float@type}}}%
}
因此,如果\newfloat
在序言中定义了,它将使用该分配中的下一个空闲数字,否则希望获得最好的结果并使用 1 或 4,具体取决于数字是否定义。