외부 파일로부터 유동 환경을 유연하게 포함

외부 파일로부터 유동 환경을 유연하게 포함

나는 다음 교환에 설명된 접근 방식을 사용하는 데 관심이 있습니다.

간단한 명령으로 문서 내에서 그림을 이동하세요.

간단히 말해서, 레이블이 지정된 그림과 표 환경을 하나의 파일에 저장하고 해당 레이블을 참조하여 마스터 tex 파일에 배치함으로써 그림/표를 더 쉽게 이동하고 반복적인 포함 또는 포함을 더 쉽게 만드는 것이 아이디어입니다. 문서 전체에서 수치를 공유합니다.

가 작성한 코드egreg위에서 설명한 내용은 그림과 표에는 잘 작동하지만 더 이상 sidewaysfigure다음 환경 에서는 작동하지 않습니다.rotating 에서는 작동하지 않습니다 .질문 1: 옆모습을 수용하도록 코드를 조정할 수 있습니까?

이 질문을 독립적으로 만들기 위해 복사하겠습니다.egreg의 코드입니다. 내 취향에 맞게 원래 코드를 약간 수정했습니다.

코드를 .sty파일에 저장하고 \usepackage{floats}.

원래 코드에서는 사용자가 마스터 파일과 동일한 이름이지만 확장자를 가진 파일에 부동 소수점을 저장할 것으로 예상했습니다 .flo. 나는 부동 소수점을 사용/재사용하기 위해 여러 마스터 문서를 원했기 때문에 원본 코드에 대한 주요 변경 사항은 사용자가 .tex부동 소수점을 저장하는 파일의 이름을 지정할 수 있도록 허용하는 것이었습니다. 이는 명령을 사용하여 수행됩니다 . 여기서 부동 소수점은 마스터 파일과 동일한 디렉터리에 \loadfloats{figures}저장됩니다 .figures.tex

당연히 댓글을 환영합니다. 두 가지 질문이 더 있는데, 관련된 것으로 판명되면 별도로 질문할 수 있습니다.

질문 2 허용 목록에 맞게 코드를 조정할 수 있습니까?예를 들어 \loadfloats{figures,tables}, 장별 및/또는 별도의 그림과 표별로 부동 환경을 구성할 수 있습니다.

질문 3 동일한 접근 방식을 클래스에 이식하여 beamer적용 할 수 있습니까 frames?

이름이 3개 파일이 있습니다.float-template.tex(마스터 파일),floats.sty(egreg의 코드 이름이 바뀌고 패키지됨)피규어.텍스(떠다니는 환경). 게다가 이름이 붙은 이미지는자리 표시자표준 확장자는 다른 모든 항목과 동일한 디렉터리에 있어야 합니다.

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

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

피규어.텍스

    % 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에서는 "side caption"이라는 캡션이 있는 1/2" 너비의 그림으로 시작하는 외부 파일에 세 개의 그림을 정의합니다. 그런 다음 "caption1"이 있는 1" 너비의 그림과 "caption2"가 있는 2" 너비의 그림이 이어집니다. ". 그런 다음 MWE의 그림을 "캡션2", "캡션 1" "사이드 캡션" 순서로 기억하고 해당 레이블을 참조합니다.

sidewaysfigureMWE는 최종 수치에 사용할 수 있도록 편집되었습니다 .

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

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

여기에 이미지 설명을 입력하세요

관련 정보