私は次のやり取りで説明されているアプローチを使用することに興味があります:
簡単に言えば、ラベル付きの図と表の環境を 1 つのファイルに保存し、ラベルを参照してマスター tex ファイルに配置するというアイデアです。これにより、図や表の移動が容易になり、繰り返し挿入したり、ドキュメント間で図を共有したりすることが容易になります。
書いたコードはエグレ上記の方法は図や表には適していますが、パッケージsidewaysfigure
の環境では機能しなくなりましたrotating
。質問 1: 横向きの図形を受け入れるようにコードを調整できますか?
この質問を自己完結的なものにするために、私はコピーしますエグレのコードです。自分の好みに合わせて、元のコードを少し変更してカスタマイズしました。
コードを.sty
ファイルに保存し、 で呼び出します\usepackage{floats}
。
元のコードでは、ユーザーがマスター ファイルと同じ名前で拡張子が付いたファイルにフロートを保存することを想定していました.flo
。フロートを使用/再利用するには複数のマスター ドキュメントが必要であることがわかったので、元のコードに加えた主な変更は、ユーザーが.tex
フロートを保存するファイルの名前を指定できるようにすることでした。これは、コマンドを使用して実行され、フロートはマスター ファイルと同じディレクトリに\loadfloats{figures}
保存されます。figures.tex
もちろん、コメントは大歓迎です。あと 2 つ質問がありますが、関係がある場合は別途質問するかもしれません。
質問 2 コードは許可リストに適合できますか?例えば\loadfloats{figures,tables}
、フローティング環境を章ごとに整理したり、図や表を分けたりしたい場合など
質問 3 同じアプローチをbeamer
クラスに移植して適用することはできますかframes
?
3つのファイルがありますフロートテンプレート.tex(マスターファイル)、フロート.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}
フロート.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 では、外部ファイルで 3 つの図を定義します。まず、キャプション「サイド キャプション」が付いた 1/2 インチ幅の図を作成します。次に、「キャプション 1」が付いた 1 インチ幅の図を作成し、続いて「キャプション 2」が付いた 2 インチ幅の図を作成します。次に、MWE で図を「キャプション 2」、「キャプション 1」、「サイド キャプション」の順序で呼び出し、ラベルで参照します。
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}