Ich bin daran interessiert, den im folgenden Austausch beschriebenen Ansatz zu verwenden:
Verschieben Sie Abbildungen in einem Dokument mit einem einfachen Befehl
Kurz gesagt besteht die Idee darin, beschriftete Abbildungs- und Tabellenumgebungen in einer Datei zu speichern und sie in Ihrer Master-Tex-Datei durch Verweisen auf ihre Beschriftung zu positionieren. Auf diese Weise wird das Verschieben von Abbildungen/Tabellen und das wiederholte Einfügen oder die gemeinsame Nutzung von Abbildungen über mehrere Dokumente hinweg vereinfacht.
Der Code geschrieben vonegregund wie oben beschrieben funktioniert gut für Abbildungen und Tabellen, funktioniert aber nicht mehr mit der sidewaysfigure
Umgebung des rotating
Pakets.Frage 1: Kann der Code angepasst werden, um eine seitliche Figur zu akzeptieren?
Um diese Frage in sich geschlossen zu machen, werde ich kopierenegreg's Code. Ich habe den Originalcode ein wenig geändert, um ihn meinem Geschmack anzupassen.
Den Code speichere ich in einer .sty
Datei und rufe ihn mit auf \usepackage{floats}
.
Der ursprüngliche Code sah vor, dass der Benutzer die Floats in einer Datei mit demselben Namen wie die Masterdatei, aber mit einer .flo
Erweiterung, speichert. Ich stellte fest, dass ich mehrere Masterdokumente verwenden/wiederverwenden wollte, daher bestand die wichtigste Änderung, die ich am ursprünglichen Code vornahm, darin, dem Benutzer zu ermöglichen, den Namen der .tex
Datei anzugeben, in der die Floats gespeichert sind. Dies geschieht mit dem Befehl \loadfloats{figures}
, wobei die Floats figures.tex
im selben Verzeichnis wie die Masterdatei gespeichert werden.
Kommentare sind natürlich willkommen. Ich habe noch zwei weitere Fragen, die ich möglicherweise separat stelle, wenn sie relevant sind.
Frage 2: Kann der Code an Zulassungslisten angepasst werden?Beispielsweise \loadfloats{figures,tables}
wenn man schwebende Umgebungen nach Kapiteln organisieren und/oder Abbildungen und Tabellen trennen möchte
Frage 3: Kann der gleiche Ansatz auf die beamer
Klasse portiert und angewendet werden frames
?
Es gibt 3 Dateien mit dem Namenfloats-template.tex(die Masterdatei),floats.sty(egregCode umbenannt und verpackt) undfiguren.tex(die schwebenden Umgebungen). Außerdem wurde ein Bild mit dem NamenPlatzhaltermit Standarderweiterungen wird im selben Verzeichnis wie alles andere erwartet.
floats-template.tex
\documentclass{article}
\usepackage{lipsum}% \lipsum prints random text
\usepackage{floats}% provides the \includefloat and \loadfloat commands
\loadfloat{figures}% stores labeled figure environments
\usepackage{rotating}% provides \sidewaysfigure environment
\begin{document}
\section{Lorem}
\lipsum[5]
\includefloat{fig:test1}
\section{Dolor}
\lipsum[5]
\includefloat{fig:test2}
\section{Final section}
\lipsum[5]
\includefloat{fig:test3}
\end{document}
floats.sty
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{floats}[2014/12/12 custom LaTeX style]
% https://tex.stackexchange.com/questions/118323/
%move-figures-around-in-a-document-with-a-simple-command/
\RequirePackage{environ}%
\AtBeginDocument{%
\begingroup
\InputIfFileExists{\thefloats.tex}{\setupprefloats}{}%
\endgroup
}
\makeatletter
\newcommand{\loadfloat}[1]{%
\newcommand{\thefloats}{#1}%
}
\newcommand{\setupprefloats}{%
\let\figure\relax\let\endfigure\relax
\let\table\relax\let\endtable\relax
\prefloat@rename{figure}\prefloat@rename{table}%
}
\newcommand{\prefloat@rename}[1]{%
\NewEnviron{#1}{%
\let\label\prefloat@label
\renewcommand\caption[2][]{####2}%
\setbox\z@=\vbox{\BODY}
\toks@=\expandafter{\BODY}
\expandafter\xdef\csname prefloat@\theprefloat@label\endcsname{%
\noexpand\begin{#1}\the\toks@\noexpand\end{#1}}%
}%
}
\newcommand{\prefloat@label}[1]{%
\gdef\theprefloat@label{#1}%
}
\newcommand{\includefloat}[1]{%
\expandafter\show\csname prefloat@#1\endcsname
\@nameuse{prefloat@#1}%
}
\makeatother
\endinput
figuren.tex
% A multi-paragraph \caption[short]{long} without a short caption option produces an error
\begin{figure}[thbp]
\centering%
\includegraphics[width=\textwidth]{placeholder}%
\caption[test]{\lipsum[2]}
\label{fig:test1}
\end{figure}
\begin{figure}[thbp]
\centering%
\includegraphics[width=\textwidth]{placeholder}%
\caption[test]{\lipsum[2]}
\label{fig:test2}
\end{figure}
% OFFENDING PIECE OF CODE
%\begin{sidewaysfigure}
% \includegraphics[width=\textwidth]{placeholder}%
% \caption[test]{\lipsum[2]}
% \label{fig:test3}
%\end{sidewaysfigure}
Antwort1
Wie in der Antwort, auf die ich in meinem Kommentar verwiesen habe, habe ich mein boxhandler
Paket als Ausgangspunkt verwendet und es durch Erstellen der Makros \storeFigure[label]{caption}{content}
und geändert \recallFigure[htbp]{label}
.
Mit boxhandler
werden Abbildungen (und Tabellen) mit Makros und nicht mit Umgebungen erstellt. Das Paket bietet flexible Beschriftungsoptionen. Haftungsausschluss: Die Speicher- und Abrufoptionen sollten eindeutig nicht in Verbindung mit den \holdFigures
Optionen des Pakets verwendet werden.
In meinem MWE definiere ich drei Abbildungen in einer externen Datei, beginnend mit einer 1/2" breiten Abbildung mit der Überschrift „Seitenüberschrift“. Dann erstelle ich eine 1" breite Abbildung mit „Überschrift1“, gefolgt von einer 2" breiten Abbildung mit „Überschrift2“. Dann rufe ich die Abbildungen im MWE in der Reihenfolge „Überschrift2“, „Überschrift 1“ „Seitenüberschrift“ ab und verweise sie anhand ihrer Beschriftungen.
Das MWE wurde BEARBEITET, um die Verwendung sidewaysfigure
in der endgültigen Abbildung zu ermöglichen.
\documentclass{article}
\usepackage{lipsum}
\usepackage[demo]{graphicx}
\usepackage{boxhandler, filecontents, rotating}
\begin{filecontents}{myfigures.tex}
% DEFINE ALL FIGURES AT THE BEGINNING
\storeFigure{fig:test3}{side caption}
{\includegraphics[width=0.5in]{testfig}}
\storeFigure{fig:test1}{caption1}
{\includegraphics[width=1in]{file1}}
\storeFigure{fig:test2}{caption2}
{\includegraphics[width=2in]{file2}}
\end{filecontents}
\makeatletter
\newcommand\storeFigure[3]{\@StoreFigure[#1]{#2}{#3}{\WrapperText}{\wrapper}}
\newcommand\@StoreFigure[5][]{%
\addtocounter{FigureIndex}{1}%
\setlength\DeadMargin\FigureDeadMargin%
\def\FigureBoxLabel{fig\roman{FigureIndex}}%
\def\FigureCaptionLabel{figcap\roman{FigureIndex}}%
\def\FigCaptionWidthLabel{figcapwdth\roman{FigureIndex}}%
\def\FigureWrapper{figwrap\roman{FigureIndex}}%
\def\WrapperStatus{figwrapstatus\roman{FigureIndex}}%
\expandafter\SaveCBox\csname\FigureBoxLabel\endcsname{#3}%
\expandafter\def\csname\FigureCaptionLabel\endcsname{#2\label{#1}}%
\expandafter\newlength\csname\FigCaptionWidthLabel\endcsname%
\expandafter\setlength\csname\FigCaptionWidthLabel\endcsname%
\CaptionBoxWidth%
\expandafter\edef\csname\FigureWrapper\endcsname{#4}%
\expandafter\edef\csname\WrapperStatus\endcsname{#5}%
%% After storing figure, reset wrapper to default value
\global\def%
\WrapperText{\noexpand\WrapperTextStyle\WrapperTextDefault}%
\expandafter\def\csname FigureRefLabel\roman{FigureIndex}\endcsname{#1}%
}
\newcounter{loopfigindex}
\newcommand\recallFigure[2][ht]{%
\setcounter{loopfigindex}{0}%
\whiledo{\value{loopfigindex} < \value{FigureIndex}}{%
\stepcounter{loopfigindex}%
\ifthenelse{\equal{#2}{\csname FigureRefLabel\roman{loopfigindex}\endcsname}}{%
%% \FigureBoxLabel: : figi, figii, figiii, figiv, etc.
%% \FigureCaptionLabel : figcapi, figcapii, figcapiii, figcapiv, etc.
%% \FigCaptionWidthLabel: figcapwdthi, figcapwdthii, figcapwdthiii,etc.
\def\FigureBoxLabel{fig\roman{loopfigindex}}%
\def\FigureCaptionLabel{figcap\roman{loopfigindex}}%
\def\FigCaptionWidthLabel{figcapwdth\roman{loopfigindex}}%
\def\FigureWrapper{figwrap\roman{loopfigindex}}%
\def\WrapperStatus{figwrapstatus\roman{loopfigindex}}%
\ReciteFigure[#1]{\csname\FigureCaptionLabel\endcsname}%
{\csname\FigureBoxLabel\endcsname}%
{\csname\FigCaptionWidthLabel\endcsname}%
{\csname\FigureWrapper\endcsname}%
{\csname\WrapperStatus\endcsname}%
}{}}%
}
\newcommand\recallsidewaysFigure[2][ht]{%
\setcounter{loopfigindex}{0}%
\whiledo{\value{loopfigindex} < \value{FigureIndex}}{%
\stepcounter{loopfigindex}%
\ifthenelse{\equal{#2}{\csname FigureRefLabel\roman{loopfigindex}\endcsname}}{%
%% \FigureBoxLabel: : figi, figii, figiii, figiv, etc.
%% \FigureCaptionLabel : figcapi, figcapii, figcapiii, figcapiv, etc.
%% \FigCaptionWidthLabel: figcapwdthi, figcapwdthii, figcapwdthiii,etc.
\def\FigureBoxLabel{fig\roman{loopfigindex}}%
\def\FigureCaptionLabel{figcap\roman{loopfigindex}}%
\def\FigCaptionWidthLabel{figcapwdth\roman{loopfigindex}}%
\def\FigureWrapper{figwrap\roman{loopfigindex}}%
\def\WrapperStatus{figwrapstatus\roman{loopfigindex}}%
\begin{sidewaysfigure}
\centering
\usebox{\csname\FigureBoxLabel\endcsname}
\caption{\csname\FigureCaptionLabel\endcsname}
\end{sidewaysfigure}
% \ReciteFigure[#1]{\csname\FigureCaptionLabel\endcsname}%
% {\csname\FigureBoxLabel\endcsname}%
% {\csname\FigCaptionWidthLabel\endcsname}%
% {\csname\FigureWrapper\endcsname}%
% {\csname\WrapperStatus\endcsname}%
}{}}%
}
\makeatother
\renewcommand\nextFigure[1][]{}% COMMENT THIS OUT TO PLACE FIGURES INLINE
\begin{document}
\input{myfigures.tex}
Figures were created in the order \ref{fig:test1} then \ref{fig:test2}. That they
show up here as numbers means that the labeling worked.
\section{Lorem}
\lipsum[5]
\recallFigure[ht]{fig:test2}
\lipsum[3]
\section{Dolor}
\lipsum[1]
\recallFigure[ht]{fig:test1}
\section{Final section}
\lipsum[2]
\recallsidewaysFigure{fig:test3}
\lipsum[4-7]
\end{document}