Rendern Sie Bildunterschriften über Abbildungen mit \caption unter \includegraphics, während Sie endfloat verwenden

Rendern Sie Bildunterschriften über Abbildungen mit \caption unter \includegraphics, während Sie endfloat verwenden

Hintergrund: Meine TeX-Datei wird aus R Markdown generiert und Bildunterschriften werden automatisch unter den eingefügten Abbildungen platziert. Hier ist ein minimales Beispiel dafür, wie meine generierte TeX-Datei aussieht:

\documentclass[man]{apa7}
\title{Test}

\begin{document}
\maketitle

Lorem ipsum

\begin{figure}
The figure
\caption{The caption.}
\end{figure}

\end{document}

Problem: Bildunterschriften müssen gerendert werdenüberdie zugehörige Abbildung (gemäß APA-Richtlinien) ohne sich zu bewegen \caption.

Was ich versucht habefloatrow: Ich verstehe, dass Bildunterschriften über der Abbildung ohne Änderung des Codes über das Paket und gerendert werden können \floatsetup[figure]{style=plaintop}. Das Laden floatrowstört jedoch endfloat, das von geladen wird apa7. Insbesondere werden Abbildungen nicht mehr am Ende des Dokuments platziert, sondern an Ort und Stelle gerendert:

\documentclass[man]{apa7}
\usepackage{floatrow}
\floatsetup[figure]{style=plaintop}

\title{Test}

\begin{document}
\maketitle

Lorem ipsum

\begin{figure}
The figure
\caption{The caption.}
\end{figure}

\end{document}

Laut der Dokumentation von endfloatsollte floatrowimmer vor endfloat(und damit vor apa7) geladen werden. Daher versuche ich, floatrowüber zu laden \RequirePackage{}, aber das führt zu Fehlern. Ich kann einige davon beheben, indem ich zwei Längen aufhebe, aber das führt zu folgendem Fehler, den ich nicht lösen kann:

! Missing \endcsname inserted.
<to be read again> 
                   \@classoptionslist 
l.1453 \ProcessOptionsWithKV{floatrow}

Hier ist das minimal reproduzierbare Beispiel:

\RequirePackage{floatrow}
\let\abovecaptionskip\undefined
\let\belowcaptionskip\undefined

\documentclass{apa7}

\begin{document}

Lorem ipsum

\end{document}

Beachten Sie, dass ich trotz der Fehlermeldung eine gerenderte PDF-Datei erhalte, die wie erwartet aussieht. Dies ist auch nicht spezifisch für apa7; ich erhalte denselben Fehler, wenn ich die Dokumentklasse articleoder verwende.book

Antwort1

Interessanterweise konvertiert apa7 figurein figure*. Die Grundidee besteht jedenfalls darin, Bildunterschrift und Abbildung in separaten Saveboxen zu speichern und ihre Reihenfolge umzukehren.

\documentclass[man]{apa7}
%\documentclass{article}
%\usepackage{endfloat}
\usepackage{lipsum}% MWE only

% udbox is a \vbox version of lrbox
\makeatletter
\def\udbox#1{%
  \edef\reserved@a{%
  \endgroup
  \setbox#1\vbox{%
  \begingroup\aftergroup}%
  \def\noexpand\@currenvir{\@currenvir}%
  \def\noexpand\@currenvline{\on@line}}%
  \reserved@a
  \@endpefalse
  \color@setgroup
  \ignorespaces}
\def\endudbox{\unskip\color@endgroup}
\makeatother

\newsavebox{\mycaptionbox}
\newsavebox{\myfigurebox}

\makeatletter
\let\normalmakecaption=\@makecaption
\def\@makecaption#1#2{\def\test{figure}%
  \ifx\@captype\test \global\setbox\mycaptionbox=\vbox{\normalmakecaption{#1}{#2}}%
  \else \normalmakecaption{#1}{#2}%
  \fi}
\makeatother

\let\normalfigure=\figure
\let\endnormalfigure=\endfigure

\renewenvironment{figure}[1][tbp]{\normalfigure
  \begin{udbox}{\myfigurebox}}%
{\end{udbox}\unvbox\mycaptionbox
  \unvbox\myfigurebox\endnormalfigure}

\expandafter\let\expandafter\normalfigurestar\csname figure*\endcsname
\expandafter\let\expandafter\endnormalfigurestar\csname endfigure*\endcsname

\renewenvironment{figure*}[1][tbp]{\normalfigurestar
  \begin{udbox}{\myfigurebox}}%
{\end{udbox}\unvbox\mycaptionbox
  \unvbox\myfigurebox\endnormalfigurestar}

\title{Test}

\begin{document}
\maketitle

Lorem ipsum

\begin{figure}
\lipsum[1]
\caption{The caption.}
\end{figure}

\end{document}

Antwort2

Das efloatPaket führt seine Neudefinitionen von figureusw. figure*innerhalb durch \efloat@AtBeginDocumentund wird normalerweise entweder als oder \efloat@AtBeginDocumentdefiniert . In diesem Fall würden beide die Neudefinitionen zu früh durchführen, da das Paket seine Neudefinitionen durchführt . Der Trick, um Ihre Situation zu lösen, besteht also darin, die vom Paket durchgeführten Neudefinitionen noch weiter zu verzögern.\@iden\AtBeginDocumentfloatrow\AtBeginDocumentendfloat

Zum Glück ist die Definition von \efloat@AtBeginDocumentdamit erledigt, \providecommandda der Autor von efloatbereits im Sinn hatte, dem Benutzer die Möglichkeit zu geben, den genauen Zeitpunkt der Neudefinition selbst zu bestimmen: „(Hinweis: \efloat@AtBeginDocument wird mit \providecommand definiert, sodass Dokumentklassen und Pakete es bei Bedarf vordefinieren können.)“ (Zitat aus der efloatCodedokumentation)

Die folgende Lösung definiert eine eigene Version von \efloat@AtBeginDocumentund speichert den Inhalt in einem Makro namens , \efloatredefinitionsdas später angewendet werden könnte, insbesondere nachdem die Neudefinitionen des floatrowPakets bereits abgeschlossen sind.

% Store the code of efloat re-definitions into \efloatredefinitions
% (This code must be defined before the efloat package is loaded.)
\makeatletter
\newcommand\efloatredefinitions{}
\newcommand\efloat@AtBeginDocument{\g@addto@macro\efloatredefinitions}
\makeatother

\documentclass[man]{apa7}

\usepackage{floatrow}
\floatsetup[figure]{style=plaintop}

% Do the efloat re-definitions after the re-definitions of floatrow were done
%\show\efloatredefinitions
\AtBeginDocument{\efloatredefinitions} % or simply \efloatredefinitions after \begin{document}

\title{Test}

\begin{document}
\maketitle

Lorem ipsum

\begin{figure}
The figure
\caption{The caption.}
\end{figure}

\end{document}

PS: Es wäre schön, wenn das endfloatPaket eine Option „storeredefinitions“ oder ähnliches bieten würde, die man \PassOptionsToPackage{storeredefinitions}{endfloat}verwenden könnte, anstatt \efloat@AtBeginDocumentsie selbst zu definieren. Werde dem Autor endfloatdazu eine E-Mail schreiben...

verwandte Informationen