我有以下代码,当 caption 包处于非活动状态时,该代码可以正常工作。但是,使用 caption 时,“steckbrief”的标题会移出框外。caption 发生什么变化导致标题移到框外?
我之前将 boxedminipae 环境放入 \fs@my 块中,但这样会产生过满的框。删除 \fs@my 块会将标题置于事实表下方。
任何帮助均感激不尽。
亲切的问候
伯恩哈德
(此问题已在 comp.text.tex 上提出,但没有任何答案。)
\documentclass[fontsize=10pt,twoside,draft]{scrbook}
\usepackage[english,ngerman]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\selectlanguage{ngerman}
\usepackage[a4paper,textwidth=13.5cm,textheight=22cm]{geometry}
\usepackage{calc,boxedminipage2e,float, capt-of}
%\usepackage{caption}
\makeatletter
\newcommand\fs@my{%Caption im Rahmen
\let\@fs@capt\floatc@plain
\let\@fs@iftopcapt\iftrue%
\def\@fs@mid{}%
\def\@fs@pre{}%
\def\@fs@post{}%
}
\floatstyle{my}
\newfloat{factsheet}{hbtp}{los} % Steckbrief, Factsheet
\floatname{factsheet}{Factsheet}
\newlength{\figurewidth}\setlength{\figurewidth}{11.5cm}
\newcounter{stbr}
\newenvironment{FS}[3]%factsheet
{\begin{boxedminipage}{1\figurewidth}\centering%begindef
\captionof{figure}{\textbf{#2}}\label{fs:#3}%
\refstepcounter{stbr}
\begin{list}{}%
{\renewcommand\makelabel[1]{\bfseries\footnotesize{##1}\hfil}%
\settowidth\labelwidth{\makelabel{#1}}%
\setlength\leftmargin{\labelwidth+\labelsep}\footnotesize}%
}
{ \end{list}%enddefinition
\end{boxedminipage}%
}
\makeatother
\begin{document}
\begin{factsheet*}[b!]
\centering
\begin{FS}{Bildung und Ziel}%
{Thyrotropin"=Releasing Hormon}{trh}
\item [Gen]Chromosom: 3; Genort: 3q13.3-q21
\item [Sequenz]\textbf{p{EHP}-NH$_2$}
\item [Bildung und Ziel] TRH wird vor allem im{PVN} gebildet...
\end{FS}
\end{factsheet*}
\end{document}
答案1
如果没有caption
包,\captionof{figure}
则简单地扩展为\def\@captype{figure}\caption
。\caption
已被float
包重新定义。float
包作者已决定全局进行此重新定义。(另一种方法是\caption
仅在自己的环境中重新定义。)由于重新定义是全局的,因此 的新代码\caption
需要一些东西来检测它是否在由包控制的浮点数中调用float
。它使用以下代码:
\ifx \csname @float@c@\@captype \endcsname \relax
% no environment of the float package
\else
% environment controlled by the float package
\fi
那么在编译代码时会发生什么?环境factsheet
启动。\captionof
使用\@captype
从factsheet
变为figure
,然后使用\caption
。\caption
检查\ifx \csname @float@c@\@captype \endcsname \relax
哪个为真,因为从到\@captype
重新定义并且不受包控制。因此包认为它不负责这个标题,因此将使用普通的标题代码。结果,标题将在框内排版,框外没有标题,因为包的行为就像根本没有内部一样。factsheet
figure
figure
float
float
float
\caption
factsheet
总的来说,您的代码使用了以下未记录的(!)事实:
\caption
float
由包全局重新定义\caption
用于\@captype
区分普通浮动环境和由float
包控制的环境
如果包的实现float
仅在这两点之一上有所不同,那么您的标题将在框外排版,因为这是float
包的文档化操作方式。它在框内排版的唯一原因是(这是意外的行为!)使用\captionof
会使包的检查float
注定失败。(尝试使用\caption
而不是\captionof
,您会发现标题也不会在框内。)
请记住:您甚至已经告诉float
包将标题放在哪里factsheet
:\let\@fs@iftopcapt\iftrue
这意味着“将标题排版在浮动主体的顶部”。
如果你不想在浮动主体之外排版标题,则可以使用记录的(!)方式来告知包float
:
有一个 \restylefloat* 命令,它将重新设置现有浮动类型的样式,但不会让新的浮动样式接管 \caption 命令。在这种情况下,用户负责处理自己的标题。
\restylefloat*{factsheet}
因此,在之后添加\newfloat{factsheet}...
是记录的方式来告诉float
包您想要在浮动主体内部而不是外部排版标题。
到目前为止,我已经回答了“为什么标题排版在框内,这与包的记录和预期行为相反float
?”的问题。现在我想回答“为什么没有标题的标题在框内,而有标题的在框外?”。这很简单。由于包也caption
重新定义,它无法模拟包的每个内部实现细节(以及新代码必须使用的所有其他包)。相反,它试图模拟包的记录行为(或者如 cfr 在上面的评论中所表达的:“试图做正确的事情”),这在你的情况下意味着:“在浮动主体之外排版标题,在其顶部。”\caption
float
\caption
因此,在添加时,\restylefloat*{factsheet}
您应该会看到有包和无包的相同行为caption
。
顺便说一句:你为什么要定义factsheet
,为什么不简单地使用figure
and\caption
而不是factsheet
and \captionof{figure}
?