Inclusão flexível de ambientes flutuantes de arquivos externos

Inclusão flexível de ambientes flutuantes de arquivos externos

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 sidewaysfigureambiente do rotatingpacote.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 .styarquivo 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 .floextensã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 .texarquivo que armazena os carros alegóricos. Isso é feito com o comando \loadfloats{figures}, onde os carros flutuantes são armazenados figures.texno 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 beamerclasse 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 boxhandlerpacote 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 \holdFiguresopçã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 sidewaysfigurena 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}

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

informação relacionada