Гибкое включение плавающих сред из внешних файлов

Гибкое включение плавающих сред из внешних файлов

Мне интересно использовать подход, описанный в следующем сообщении:

Перемещайте фигуры в документе с помощью простой команды

Вкратце, идея заключается в том, чтобы хранить маркированные окружения рисунков и таблиц в одном файле и размещать их в главном tex-файле по ссылке на их метку, что упрощает перемещение рисунков/таблиц и упрощает создание повторяющихся включений или совместное использование рисунков в разных документах.

Код, написанныйэгреги описанный выше способ хорошо работает для рисунков и таблиц, но больше не работает со sidewaysfigureсредой пакета rotating.Вопрос 1: Можно ли адаптировать код для приема боковой фигуры?

Чтобы сделать этот вопрос самодостаточным, я скопируюэгрегКод. Я немного изменил исходный код, чтобы настроить его по своему вкусу.

Я сохраняю код в .styфайле и вызываю его с помощью \usepackage{floats}.

Исходный код ожидал, что пользователь сохранит плавающие элементы в файле с таким же именем, как и у главного файла, но с .floрасширением. Я обнаружил, что мне нужно, чтобы несколько главных документов использовали/повторно использовали плавающие элементы, поэтому основное изменение, которое я внес в исходный код, состояло в том, чтобы разрешить пользователю указывать имя файла, в котором .texхранятся плавающие элементы. Это делается с помощью команды \loadfloats{figures}, где плавающие элементы хранятся figures.texв том же каталоге, что и главный файл.

Комментарии приветствуются, естественно. У меня есть еще два вопроса, которые я могу задать отдельно, если они окажутся связанными.

Вопрос 2 Можно ли адаптировать код для включения списков разрешений?например \loadfloats{figures,tables}, если вы хотите организовать плавающую среду по главам и/или отдельным рисункам и таблицам

Вопрос 3 Можно ли перенести тот же подход на beamerкласс и применить к frames?

Есть 3 файла с именамиfloats-template.tex(главный файл),поплавки.sty(эгрегкод переименован и упакован), ицифры.tex(плавающие среды). Кроме того, изображение под названиемзаполнительсо стандартными расширениями ожидается в том же каталоге, что и все остальное.

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}

поплавки.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

цифры.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}

решение1

Как и в ответе, на который я сослался в своем комментарии, я использовал свой boxhandlerпакет в качестве отправной точки и модифицировал его, создав макросы \storeFigure[label]{caption}{content}и \recallFigure[htbp]{label}.

С boxhandler, рисунки (и таблицы) создаются с помощью макросов, а не окружений. Пакет предоставляет гибкие возможности подписей. Отказ от ответственности: очевидно, что опции store и recall не должны использоваться вместе с опцией пакета \holdFigures.

В своем MWE я определяю три рисунка во внешнем файле, начиная с рисунка шириной 1/2 дюйма с подписью «side caption». Затем я создаю рисунок шириной 1 дюйм с «caption1», за которым следует рисунок шириной 2 дюйма с «caption2». Затем я вызываю рисунки в MWE в порядке «caption2», «caption 1» «side caption», ссылаясь на них по их меткам.

MWE был ОТРЕДАКТИРОВАН, чтобы разрешить использование sidewaysfigureна окончательном рисунке.

\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}

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Связанный контент