我有兴趣使用以下交流中描述的方法:
简而言之,这个想法是将标记的图形和表格环境存储在一个文件中,并根据其标签将它们放置在主 tex 文件中,从而更容易移动图形/表格,并更容易重复包含或跨文档共享图形。
代码由埃格尔并且上面描述的方法适用于图形和表格,但不再适用于包sidewaysfigure
的环境rotating
。问题 1:代码是否可以适应于接受侧向图形?
为了让这个问题独立,我将复制埃格尔的代码。我对原始代码进行了一些修改,以使其符合我的喜好。
我将代码存储在一个.sty
文件中并用 调用它\usepackage{floats}
。
原始代码要求用户将浮点数存储在与主文件同名但带有扩展名的文件中.flo
。我发现我想要几个主文档来使用/重复使用浮点数,因此我对原始代码所做的主要更改是允许用户指定存储浮点数的文件的名称.tex
。这是通过命令完成的\loadfloats{figures}
,其中浮点数存储在figures.tex
与主文件相同的目录中。
当然,欢迎提出意见。我还有两个问题,如果它们涉及,我可能会单独提出。
问题 2 代码可以适应允许列表吗?例如\loadfloats{figures,tables}
,人们可能希望按章节和/或单独的图表来组织浮动环境
问题3 是否可以将相同的方法移植到课堂beamer
并应用于frames
?
有 3 个文件名为浮动模板.tex(主文件),floats.sty(埃格尔的代码重命名和打包),以及图形.tex(浮动环境)。此外,还有一个名为占位符具有标准扩展名的文件应与其他文件位于同一目录中。
浮动模板.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
图形.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
,图形(和表格)是用宏而不是环境创建的。该软件包提供了灵活的字幕选项。免责声明:显然,存储和调用选项不应与软件包的选项一起使用\holdFigures
。
在我的 MWE 中,我在一个外部文件中定义了三个图形,首先是 1/2 英寸宽的图形,标题为“侧面标题”。然后我创建一个 1 英寸宽的图形,标题为“caption1”,然后创建一个 2 英寸宽的图形,标题为“caption2”。然后我按照“caption2”、“caption 1”和“侧面标题”的顺序调用 MWE 中的图形,并通过它们的标签引用它们。
sidewaysfigure
MWE 已被编辑以允许在最终图形上使用。
\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}