布尔测试浮点数是否已被移动?

布尔测试浮点数是否已被移动?

是否可以创建一个布尔值来知道浮点数是否保持内联或是否已被移动?

在我的情况下,浮动将是一个已知大小的光栅图像。有时它会适合内联代码编写的位置,有时它会浮动到下一页的顶部。没有其他情况。单列,仅双面。我在自定义文档类中使用 LuaLaTeX 进行编译,但我可以更简单地说明我的问题。在这个 MWE 中,我曾经\@float使它独立于任何特定的包:

\documentclass{article}
\newif \ifthisthingmoved % true if float is moved away from ordinary inline
\makeatletter
\def\ftype@figure{0} % not sure why, but seems to be necessary
\setlength\intextsep{0pt}
\setlength\textfloatsep{0pt}
\setlength\floatsep{0pt}
\newenvironment{fitme}
{\@float{figure}[!ht]}
{\end@float\par}
\makeatother
\usepackage{lipsum}
\begin{document}
\lipsum[1-4] % vary the number of paragraphs
\begin{fitme}
% Here is where I wish to test \ifthisthingmoved.
\rule{200pt}{200pt}
\end{fitme}
\lipsum
\end{document}

在上面,使用显示的值,规则将移动到第二页。所以,我希望\ifthisthingmoved是真的(然后我会用它做一些事情)。我假设第一页在移动的对象定位到第二页之前就已经发货了,所以(希望)异步布局不会成为问题。

答案1

下面使用\label-\ref系统来存储环境放置的位置和结束位置的页面fitme。如果这两个标签的页码相同,则假定浮动没有移动。

在此处输入图片描述

\documentclass{article}

\usepackage{refcount}
\usepackage{lipsum}

\newcounter{moved}

\newif\ifthisthingmoved % true if float is moved away from ordinary inline
\newcommand{\movedtrue}{\let\ifthisthingmoved\iftrue}
\newcommand{\movedfalse}{\let\ifthisthingmoved\iffalse}

\newenvironment{fitme}
  {\stepcounter{moved}%
   \label{moved-start-\themoved}%
   \begin{figure}[!ht]%
     \label{moved-end-\themoved}
     \ifnum\getpagerefnumber{moved-start-\themoved}=\getpagerefnumber{moved-end-\themoved}
       \movedfalse
     \else
       \movedtrue
     \fi}
     }
  {\end{figure}}

\begin{document}

\lipsum[1-4] % vary the number of paragraphs

\begin{fitme}
  \ifthisthingmoved
    Moving along \ldots !
  \fi

  \rule{200pt}{200pt}
\end{fitme}

\lipsum

\end{document}

可以使用以下方法稍微简化一下条件:

\newcommand{\ifthisthingstayed}{%
  \ifnum\getpagerefnumber{moved-start-\themoved}=\getpagerefnumber{moved-end-\themoved}}
\newcommand{\ifthisthingmoved}{\ifthisthingstayed\else}

然而,这不允许使用

\ifthisthingmoved
  % <this thing moved>
\else
  % <this thing did not move>
\fi

然而,从原始问题来看这似乎并不是一个要求。


这可能可以扩展以检查当前页面上的位置(使用\pdflastyposzref如果页码savepos相同,则比较浮动块 (模块) 是否移动到其放置的位置 (顶部[t][b]底部)。

相关内容