Estou interessado em usar a abordagem descrita na seguinte troca:
Mova as figuras em um documento com um comando simples
Em poucas palavras, a ideia é armazenar ambientes de figuras e tabelas rotulados em um arquivo e posicioná-los em seu arquivo master tex por referência ao seu rótulo, facilitando assim a movimentação de figuras/tabelas e tornando mais fácil fazer inclusões repetidas ou para compartilhar números entre documentos.
O código escrito poregrégiae descrito acima funciona bem para figuras e tabelas, mas não funciona mais com o sidewaysfigure
ambiente do rotating
pacote.Pergunta 1: O código pode ser adaptado para aceitar uma figura lateral?
Para tornar esta pergunta independente, vou copiaregrégiacódigo de. Modifiquei um pouco o código original para personalizá-lo ao meu gosto.
Eu armazeno o código em um .sty
arquivo e o chamo com \usepackage{floats}
.
O código original esperava que o usuário armazenasse os carros alegóricos em um arquivo com o mesmo nome do arquivo mestre, mas com uma .flo
extensão. Descobri que queria que vários documentos mestres usassem/reutilizassem os carros alegóricos, então a principal alteração que fiz no código original foi permitir que o usuário especificasse o nome do .tex
arquivo que armazena os carros alegóricos. Isso é feito com o comando \loadfloats{figures}
, onde os carros flutuantes são armazenados figures.tex
no mesmo diretório do arquivo mestre.
Comentários são bem-vindos, naturalmente. Tenho mais duas perguntas, que posso fazer separadamente, caso elas estejam envolvidas.
Questão 2 O código pode ser adaptado para permitir listas?por exemplo \loadfloats{figures,tables}
, como se pode querer organizar ambientes flutuantes por capítulo e/ou separar figuras e tabelas
Questão 3 A mesma abordagem pode ser transportada para a beamer
classe e aplicada a ela frames
?
Existem 3 arquivos nomeadosfloats-template.tex(o arquivo mestre),flutua.sty(egrégiacódigo do renomeado e empacotado), efiguras.tex(os ambientes flutuantes). Além disso, uma imagem chamadaespaço reservadocom extensões padrão é esperado no mesmo diretório que todo o resto.
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}
flutua.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
figuras.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}
Responder1
Como na resposta que mencionei em meu comentário, usei meu boxhandler
pacote como ponto de partida e o modifiquei criando as macros \storeFigure[label]{caption}{content}
e \recallFigure[htbp]{label}
.
Com boxhandler
, figuras (e tabelas) são criadas com macros, não com ambientes. O pacote oferece opções flexíveis de legendas. Isenção de responsabilidade: claramente, as opções de armazenamento e recall não devem ser usadas em conjunto com a \holdFigures
opção de pacote.
No meu MWE, defino três figuras em um arquivo externo começando com uma figura de 1/2" de largura com a legenda "legenda lateral". Em seguida, crio uma figura de 1" de largura com "caption1" seguida por uma figura de 2" de largura com "caption2". ". A seguir relembro as figuras do MWE na ordem "legenda2", "legenda 1" "legenda lateral", referenciando-as por seus rótulos.
O MWE foi EDITADO para permitir a utilização sidewaysfigure
na figura final.
\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}