endfloat, float - 与 newfloat 类型一起使用

endfloat, float - 与 newfloat 类型一起使用

有谁知道如何让该endfloat包使用(float 包)定义的新浮点类型来工作\newfloat,例如:

\newfloat{map}{htbp}{lom}
\floatname{map}{Map}
\restylefloat*{map}

\newfloat{photo}{htbp}{lop}
\floatname{photo}{Photo}

答案1

您需要包含\usepackge{float}才能使用\newfloat

但从文档来看包裹endfloat仅适用于figures并且tables它明确寻找这个名称:

由于对 figure 和 table 的重新定义实际上是如何实现的,因此使用这些环境名称至关重要。也就是说,你不能简单地定义一个调用 figure 或 table 的新环境,因为前者必须查找文字字符串


话虽如此,您可以调整它的\endlfoat作用,使其也能够处理photomap类型的浮点数(除了通常的figuretable)。下面我对其进行了调整,使其包括浮点数photo。您可以进一步增强它,使其也能够处理浮点数,方法是复制它,并用和替换map每个出现的浮点数(这是使用的 .aux 文件的扩展名)。photomappppmmm

长期解决方案是调整代码,使其endfloat能够处理任何类型的浮点数,但现在这应该足够了。

\documentclass{article}
\usepackage[demo]{graphicx}
\usepackage{float}
\usepackage{endfloat}

\newcommand{\lipsum}{Lorem ipsum dolor sit amet, consectetur adipiscing elit. In malesuada consequat mollis. Duis viverra vestibulum quam id vehicula. Donec vel tellus a orci adipiscing euismod. Suspendisse lacinia metus lorem. Vivamus pellentesque, lacus quis blandit tincidunt, elit nunc ullamcorper enim, ut laoreet metus risus sed neque. Sed ac nibh ante, pellentesque vehicula sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vel libero leo. Donec aliquam placerat arcu, et ultrices leo semper et. Curabitur dignissim, eros vitae dignissim porta, velit arcu vehicula tortor, vel blandit sapien magna in risus.}%

\newfloat{map}{htbp}{lom}
\floatname{map}{Map}
\restylefloat*{map}

\newfloat{photo}{htbp}{lop}
\floatname{photo}{Photo}

\makeatletter
\newif\if@photolist                % 
\newif\if@photohead

\@photolistfalse
\@photoheadfalse

\def\listofphotos{\@empty}
\newcounter{postphoto}
\efloat@newwrite{ppp}
\ef@newct{ppp}

\providecommand{\photoname}{Photo}
\newcommand{\photoplace}{%
   \begin{center}
     [\photoname~\thepostphoto\ about here.]
   \end{center}}

\let\@bphoto\photo
\def\photo{%
     \efloat@condopen{ppp}
     \efloat@iwrite{ppp}{\string\begin{photo*}}%
    \if@domarkers%
       \addtocounter{postphoto}{1}%
       \photoplace%
    \fi%
    \def\@currenvir{efloat@float}%
    \begingroup%
    \let\do\ef@makeinnocent \dospecials%
    \ef@makeinnocent\^^L% and whatever other special cases
    \endlinechar`\^^M \catcode`\^^M=12 \ef@xphoto}%
{\catcode`\^^M=12 \endlinechar=-1 %
 \gdef\ef@xphoto#1^^M{\def\test{#1}%
      \ifx\test\ef@endphototest
           \efloat@foundend{ppp}{photo*}
      \else\ifx\test\ef@enddblfiguretest
           \efloat@foundend{ppp}{photo*}
      \else%
          \efloat@iwrite{ppp}{#1}%
          \let\next\ef@xphoto%
      \fi \fi \next}%
}

{\escapechar=-1%
 \xdef\ef@endphototest{\string\\end\string\{photo\string\}}%
 \xdef\ef@enddblphototest{\string\\end\string\{photo*\string\}}%
}

\@namedef{photo*}{\photo}
\providecommand{\photosection}{Photos}

\newcommand{\processphotos@hook}{\@empty}
\def\AtBeginPhotos{\g@addto@macro\processphotos@hook}

\def\processphotos{%
 \expandafter\ifnum \csname @ef@pppopen\endcsname>0
  \immediate\closeout\efloat@postppp \ef@setct{ppp}{0}
  \clearpage                                                
  \if@photolist                                                      
    {\normalsize\listofphotos}                                   
    \clearpage
  \fi
  \if@photohead
     \section*{\photosection}
     \suppressfloats[t]
  \fi
  \markboth{\uppercase{\photosection}}{\uppercase{\photosection}}%
  \processphotos@hook \@input{\jobname.ppp}
 \fi}

\renewcommand{\processdelayedfloats}{{%
  \def\baselinestretch{1}\normalsize
   \let\figure\@bfig
   \let\table\@btab
   \let\photo\@bphoto
   \processdelayedfloats@hook
   \if@tablesfirst \processtables\processfigures
   \else \processfigures\processtables \fi
   \processphotos
   \processotherdelayedfloats}}
\makeatother


\begin{document}
\lipsum
\begin{photo}
    \centering
    \includegraphics{myPhoto}
    \caption{My Photo 1}
\end{photo}
\lipsum
\begin{photo}
    \centering
    \includegraphics{myPhoto}
    \caption{My Photo 2}
\end{photo}
\lipsum
\begin{figure}
    \centering
    \includegraphics{myFigure}
    \caption{My Figure}
\end{figure}
\lipsum
\begin{map}
    \centering
    \includegraphics{myMap}
    \caption{My Map}
\end{map}
\lipsum
\end{document}

答案2

当使用endfloat包 v2.5 时,可以使用它\DeclareDelayedFloat来使包知道新的浮动环境endfloat

\documentclass{book}
\usepackage[demo]{graphicx}

\usepackage{float,endfloat}

\newfloat{map}{tbp}{lomap}
\floatname{map}{Map}
\DeclareDelayedFloat{map}{Maps}

\begin{document}

\begin{map}
\centering
\includegraphics{x}
\caption{A map}
\end{map}

\end{document}

提问者目前正在测试版本 2.5(该版本还支持 longtables、threeparttables 等)。如果您也有兴趣测试此版本,请给我发电子邮件。

附录:版本 2.5 现已在 CTAN 以及 TeXlive 和 MikTeX 更新中提供。

答案3

如果你将新的浮点数限制为两个*(例如,maps 和photos ),并且你没有任何figures 或tables ,那么你可以欺骗endfloat认为您仅通过使用for和for (加上某些命令的适当重新定义)就可以使用maps 和s。photofiguremaptablephoto

首先你需要定义新的浮点数mapphoto使用float包裹接口。此外,您需要重新定义\listoffigures\listof{map}{List of Maps}\listoftables\listof{photo}{List of Photos}。然后,\begin{figure}[..] ... \end{figure}每当您需要时,使用map,以及\begin{table}[..] ... \end{table}每当您需要时,使用photo。您还需要使用\captionof{<newfloat>}[..]{...}来获取新浮点的标题。

下面是一个可以说明这一事实的最小工作示例:

\documentclass{article}
\usepackage[margin=2cm]{geometry}% http://ctan.org/pkg/geometry
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage[nomarkers]{endfloat}% http://ctan.org/pkg/endfloat
\usepackage{caption}% http://ctan.org/pkg/caption
\usepackage{float}% http://ctan.org/pkg/float
\begin{document}
% ========== MAP FLOAT ==========
\newfloat{map}{htbp}{lom}% \begin{map}[htbp]...\end{map}
\floatname{map}{Map}%
\makeatletter
\renewcommand{\listoffigures}{\listof{map}{List of \fname@map s}}
\makeatother
% ========== PHOTO FLOAT ==========
\newfloat{photo}{htbp}{lop}% \begin{photo}[htbp]...\end{photo}
\floatname{photo}{Photo}%
\makeatletter
\renewcommand{\listoftables}{\listof{photo}{List of \fname@photo s}}
\makeatother

\section{First section}
\lipsum[1]
\begin{figure}[p]
  \centering\includegraphics{map1}
  \captionof{map}[Beautiful]{This is a beautiful map.}
\end{figure}
\lipsum[2]
\begin{table}[p]
  \centering\includegraphics{photo1}
  \captionof{photo}[Amazing]{This is an amazing shot.}
\end{table}
\lipsum[3]
\begin{figure}[p]
  \centering\includegraphics{map2}
  \captionof{map}[Awesome]{This is an awesome map.}
\end{figure}
\lipsum[4]
\begin{table}[p]
  \centering\includegraphics{photo2}
  \captionof{photo}[Stunning]{This is a stunning picture.}
\end{table}
\lipsum[5]
\end{document}

geometry用于修改布局,而lipsum提供了虚拟文本。此外,demo传递给graphicx用于用 150pt x 100pt 黑色矩形替换所有图像(出于兼容性目的)。


*如果不是这种情况,那么就需要更多的技巧。这包括除了figureand之外使用新浮点数table(而不仅仅是替换)的可能性,或者使用两个以上的新浮点数,或者两者结合。

最后一种可能性在软件包作者的“愿望清单”中提到,尽管它尚未实现,并且可能不在当前维护者的领导下。

答案4

感谢 Jeffrey Goldberg 和 Axel Sommerfeldt,他们使得这两个包兼容,目前这很简单(从endfloat文档):

\usepackage{newfloat,endfloat}
\DeclareFloatingEnvironment{map}
\DeclareDelayedFloat{map}{Maps}

更完整的例子:

\usepackage{newfloat,endfloat}
\DeclareFloatingEnvironment[
    fileext=lsf,
    listname={List of Supplementary Figures},
    name=Supplementary Figure,
    placement=p,
]{supfig}
\DeclareDelayedFloat{supfig}{Supplementary Figures}

相关内容