为什么无字幕包装的字幕在盒子里面,有字幕的在外面呢?

为什么无字幕包装的字幕在盒子里面,有字幕的在外面呢?

我有以下代码,当 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使用\@captypefactsheet变为figure,然后使用\caption\caption检查\ifx \csname @float@c@\@captype \endcsname \relax哪个为真,因为从到\@captype重新定义并且不受包控制。因此包认为它不负责这个标题,因此将使用普通的标题代码。结果,标题将在框内排版,框外没有标题,因为包的行为就像根本没有内部一样。factsheetfigurefigurefloatfloatfloat\captionfactsheet

总的来说,您的代码使用了以下未记录的(!)事实:

  1. \captionfloat由包全局重新定义
  2. \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 在上面的评论中所表达的:“试图做正确的事情”),这在你的情况下意味着:“在浮动主体之外排版标题,在其顶部。”\captionfloat\caption

因此,在添加时,\restylefloat*{factsheet}您应该会看到有包和无包的相同行为caption

顺便说一句:你为​​什么要定义factsheet,为什么不简单地使用figureand\caption而不是factsheetand \captionof{figure}

相关内容