我目前正在研究一些与浮点相关的代码,发现标准浮点环境figure
并table
定义(除其他外)宏\def\ftype@figure{1}
和\def\ftype@table{2}
。
LaTeX 源文档source2e
将这些宏“描述”为:
\ftype@TYPE : The type number for floats of type TYPE.
这没什么意义。
这些宏唯一被使用的地方似乎是\@xfloat
标准浮点数使用的地方。它定义了一个count
寄存器的值(来自source2e
文档的伪代码):
\count\@currbox :=G 32*\ftype@TYPE + bits determined by PLACEMENT
我认为这与浮点数的放置和/或装箱过程有关。我研究了一些与浮点数相关的软件包,例如float
和,caption
并了解到每种新的浮点数类型都需要一个 2 的幂数,即下一个浮点数需要是 4,然后是 8 等等。这\count\@currbox
对我来说看起来像是一个位图。但是,我很难进一步理解它。
\ftype@<TYPE>
和 的确切原因和用法是什么\count\@currbox
?如果我定义自己的浮点数,那么如果我为每种新的浮点类型按指数增加它,可以吗?
答案1
每个浮动框都存储在框寄存器中\bx@A
,\bx@B
依此类推。每个框寄存器都对应一个计数器,该计数器中装有代表浮点类型和位置说明符的数字。因此,对于每个浮点数,LaTeX 可以知道位置说明符(、、或)是什么,并根据h
要输出的页面所施加的限制决定如何处理它们。前五位为说明符保留,然后是类型。t
b
p
!
例如,
\begin{figure}
a
\end{figure}
\begin{figure}[h]
b
\end{figure}
\begin{table}
c
\end{table}
我们得到
\count\bx@A=62
\count\bx@B=49
\count\bx@C=94
以二进制形式表示为 62 是111110
, 49 是110001
, 94 是1011110
。
在第一个中,我们看到h
没有指定,而tbp
(默认为文章):h
是位 0,t
是位 1,b
是位 2,p
是位 3。!
减去 16 确实\begin{figure}[!htbp]
得到 41,即101111
。因此,位 4 中的零表示“放宽约束”。
顺便说一下,\bx@A
是 252,\bx@B
是 251,等等。 插入类 254 和 253 分别是\@mpfootins
和\footins
。
答案2
只是想稍微扩展一下 egreg 所写的内容。
LaTeX 需要构建一种高效的方式来存储浮点标识符和位置标识符的标志。因此,LaTeX 团队将它们合并为一个位串。前 5 位保留给说明符,其余位保留给浮点数。
Position 76543210
Value 0010010
Bit Meaning
--- -----------
0 1 if the float may go where it appears in the text
1 1 if the float maytop of page
2 1 if the float may go on bottom of page
3 1 if the float may go on float page
4 1 umless the placement includes a !
5 float type figures
6 float type tables
为了添加不同的浮点类型,需要向左移动一个位置。算术左移 n 位相当于乘以 2^n,因此在本例中是 2 的幂。
类型 1=2^0 是数字,类型 2=2^1 是表格,类型 4=2^2 是代码,类型 8=2^3 是其他内容等等...
如果您要处理这类事情,Oberdiek 的flags
宏(现在称为)可能会很有用。PDF 使用类似的标志来为 pdf 对象设置属性。bitset
由于 TeX 的数字限制为 2^31-1,并且前 5 位由浮点标识符占用,因此剩余 26 种可用的浮点类型供冒险者使用。
答案3
我确信 LaTeX2e 源文档中还有很大的改进空间。但是,问题中给出的关于浮点型数字没有任何有用信息的说法并不完全正确。浮点型文档部分(在 ltfloats.dtx 中)以以下内容开头:
% \section{Floats}
%
% The different types of floats are identified by a \meta{type} name,
% which is the name of the counter for that kind of float. For
% example, figures are of type `figure' and tables are of type `table'.
% Each \meta{type} has associated a positive \meta{type number}, which
% is a power of two. E.g.,\\
% figures might be have type number~1, tables type number~2, programs
% type number~4, etc.
因此,即使没有给出理由或没有明确的文档说明算法如何使用这个数字,也要明确指出类型必须是 2 的幂。
Leslie 的伪代码中也有关于原始算法的(相当技术性的 :-) 文档,例如,
% \@bitor\NUM\LIST : Globally sets switch @test to the disjunction for
% all I of bit log2 \NUM of the float specifiers of all the
% floats in \LIST.
% I.e., @test is set to true iff there is at least one
% float in \LIST having bit log2 \NUM of its float specifier
% equal to 1.
%
% Note: log2 [(\count I)/32] is the bit number corresponding to the
% type of float I. To see if there is any float in \LIST having
% the same type as float I, you run \@bitor with
% \NUM = [(\count I)/32] * 32.
现在我的立场是,这不是一个可以(现在也是)在低层次上进行连接的领域,因此这样的技术部分不需要进一步的解释,除了提供信息,即必须为每种浮点类型提供具有特定特征的 4 个接口宏,例如,
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename\nobreakspace\thetable}
预计世界上另外 5 个会详细研究该算法的人是编写类似的程序包的人floats
,并且考虑到该算法的技术方面实际上并没有那么糟糕的记录。
现在,此网站上 @egreg 和 @Yiannis 的回答对 LaTeX2.09 和 LaTeX2e 中发生的情况进行了非常好的技术总结。