Поэтому будет неправильно, если вы, решив отделять текст от иллюстраций линейкой, определите \botfigrule просто как \hrule: первое и второе условия при этом выполнены будут, а вот третье — нет, в результате чего LaTeX собьется со счета при решении вопроса о размещении иллюстраций. Формально правильным было бы такое решение:
\newcommand{\botfigrule}{\hrule\vspace{-0.4pt}(вспомним, что линейка, генерируемая командой \hrule, имеет по умолчанию толщину 0.4pt). Впрочем, формальной правильности мало: если вы опробуете такое определение на практике, то увидите, что линейка вплотную прилегает к иллюстрации, что никуда не годится. Правильно действовать, например, так:
\newcommand{\botfigrule}{\vspace{-3pt}\hrule \vspace{2.6pt}}Теперь мы проводим линейку не прямо по верхней кромке иллюстрации, а на три пункта выше; заключительное \vspace{2.6pt} нужно для того, чтобы в сумме получилось нулевое вертикальное смещение.
С \topfigrule и \dblfigrule вы сможете теперь разобраться самостоятельно.
В заключение отметим, что разделители, определяемые \topfigrule и ей подобными командами, не обязаны быть именно линейками: необходимо только при их определении учитывать три перечисленных выше обстоятельства.