根据位置对浮动进行不同的格式化

根据位置对浮动进行不同的格式化

我感兴趣的是更改浮动元素的格式,具体取决于它们是放置在页面的顶部、底部、中间还是浮动页面上。我知道有一个包可以做类似的事情,那就是凝缩乳胶,如果图形位于顶部或中间,则将悬挂标题放在全宽图形下方的边距中,如果图形位于底部,则将悬挂标题放在上方。不过,查看 tufte-latex 的代码,这是一个非常基本的检查(据我所知,当唯一的位置说明符是“b”时,标题恰好放在顶部)。当浮动元素放在浮动页面上时,悬挂标题看起来不正确。

理想情况下,我希望能够知道浮点数实际放置的位置,并执行类似

\if \finalfloatplacement t%
  % hang caption in margin below float
\fi
\if \finalfloatplacement h%
  % same as 't'; hang caption in margin below float
\fi
\if \finalfloatplacement b%
  % hang caption in margin above float
\fi
\if \finalfloatplacement p%
  % center caption below float
\fi

据推测这需要几次 LaTeX 运行才能确定立场。

答案1

为此,您必须深入研究 LaTeX 内部结构,但可以将图形保存四次(分别为 tbph 浮动区域设置),然后输出例程选择所需的框。

在这里的版本中,我没有重新定义整个输出例程,因此,虽然它确实选择了正确的框(我希望),但测试测量的输出例程的各种艺术不是重新定义。这意味着测量时,他们会看到一个包含所有四个选项的框,因此它的高度将为最大高度。除非设置有很大不同,否则这可能是可以接受的。在示例中,设置只是在措辞和颜色上略有不同。

此定义的命令\floatswitch必须是仅有的浮点数中的东西,否则事情就会出错。

在此处输入图片描述

\documentclass{article}
\usepackage{color}
\def\a{One two three four five six. }
\def\b{Apple, Pear, Banana, Orange. }
\def\c{\a\a\b\par\b\b\b\a\b\par\b\b\b\par}

\makeatletter

\def\floatswitch#1#2#3#4{%
  \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
  \edef\FS@ckpt{\cl@@ckpt}%
  \let\@elt\relax
\hbox to 3sp{%
\vbox{{\FS@ckpt#1\par}}%
\vbox{{\FS@ckpt#2\par}}%
\vbox{{\FS@ckpt#3\par}}%
\vbox{{\FS@ckpt#4\par}}%
\hss}\aftergroup\break}


\tracingonline2
\showboxdepth1
\showboxbreadth25
\errorcontextlines\maxdimen

\def\FS@checkswitch#1{%
\ifdim\wd#1=3sp %
\setbox\z@\box#1%
\begingroup
\vbadness\maxdimen
\setbox\z@\vsplit\z@ to \textheight
\setbox\z@\vbox{\unvbox\z@\global\setbox\@ne\lastbox}%
\setbox\z@\vbox{\unvbox\@ne\unskip\global\setbox\@ne\lastbox}
\setbox\z@\hbox{\unhbox\@ne\unskip
\FS@junk
\global\setbox\@ne\lastbox}%
\endgroup
\else
\global\setbox\@ne\box#1%
\fi}

\def\@comflelt#1{%
\FS@checkswitch#1%
\setbox\@tempboxa
      \vbox{\unvbox\@tempboxa\box\@ne\vskip\floatsep}}

\let\saved@cflt\@cflt
\def\@cflt{%
\def\FS@junk{\setbox\z@\lastbox\setbox\z@\lastbox\setbox\z@\lastbox}%
\saved@cflt}

\let\FS@junk\relax
\let\saved@cflb\@cflb
\def\@cflb{%
\def\FS@junk{\setbox\z@\lastbox\setbox\z@\lastbox}%
\saved@cflb}


\def\foo#1\box\@currbox#2!!{%
\def\@addtocurcol{%
#1%
\let\FS@junk\relax
\FS@checkswitch\@currbox
\box\@ne
#2}}%
\expandafter\foo\@addtocurcol!!

\def\@wtryfc #1{%
  \global\setbox\@outputbox\vbox{%
    \unvbox\@outputbox
    \vskip\@fpsep
\def\FS@junk{\setbox\z@\lastbox}%
\FS@checkswitch#1%
\box\@ne}}

\makeatother
\begin{document}

\c

\def\fig#1{%
\begin{figure}#1
\floatswitch{%
\color{red}\centering\fbox{$\frac{1}{2}$}
\caption{t floats are red}}
{%
\color{blue}\centering\fbox{$\frac{1}{2}$}
\caption{b floats are blue}}
{%
\color{green}\centering\fbox{$\frac{1}{2}$}
\caption{p floats are green}}
{%
\color{yellow}\centering\fbox{$\frac{1}{2}$}
\caption{h floats are yellow}}
\end{figure}%
}
\fig{}
\c
\fig{[!h]}
\fig{[b]}
\c
\fig{[p]}
\begin{figure}
\centering
\fbox{NO SWITCH}
\caption{no switch}
\end{figure}
\c

\end{document}

相关内容