外部ファイルからのフローティング環境の柔軟な組み込み

外部ファイルからのフローティング環境の柔軟な組み込み

私は次のやり取りで説明されているアプローチを使用することに興味があります:

簡単なコマンドで文書内の図を移動します

簡単に言えば、ラベル付きの図と表の環境を 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}

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

関連情報