Мне интересно использовать подход, описанный в следующем сообщении:
Перемещайте фигуры в документе с помощью простой команды
Вкратце, идея заключается в том, чтобы хранить маркированные окружения рисунков и таблиц в одном файле и размещать их в главном 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}