
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 floatrow
stö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 endfloat
sollte floatrow
immer 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 article
oder verwende.book
Antwort1
Interessanterweise konvertiert apa7 figure
in 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 efloat
Paket führt seine Neudefinitionen von figure
usw. figure*
innerhalb durch \efloat@AtBeginDocument
und wird normalerweise entweder als oder \efloat@AtBeginDocument
definiert . 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
\AtBeginDocument
floatrow
\AtBeginDocument
endfloat
Zum Glück ist die Definition von \efloat@AtBeginDocument
damit erledigt, \providecommand
da der Autor von efloat
bereits 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 efloat
Codedokumentation)
Die folgende Lösung definiert eine eigene Version von \efloat@AtBeginDocument
und speichert den Inhalt in einem Makro namens , \efloatredefinitions
das später angewendet werden könnte, insbesondere nachdem die Neudefinitionen des floatrow
Pakets 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 endfloat
Paket eine Option „storeredefinitions“ oder ähnliches bieten würde, die man \PassOptionsToPackage{storeredefinitions}{endfloat}
verwenden könnte, anstatt \efloat@AtBeginDocument
sie selbst zu definieren. Werde dem Autor endfloat
dazu eine E-Mail schreiben...