endfloatを使った状態でのカスタム環境

endfloatを使った状態でのカスタム環境

- 青子守歌 の投稿
返信数: 3
図表を一番最後に挿入するendfloat.styを使っているのですが、このパッケージを使うと、例えば常にセンタリングで表示させるカスタム環境
\newenvironment{cfigure}[1][\fps@figure]
{\begin{figure}[#1] \centering}
{\end{figure}}
というものを作成し、
\begin{cfigure}[p]
\includegraphics{fig.eps}
\caption{foobar}
\end{cfigure}
とすると、"TeX capacity exceeded"というエラーを吐いて正常に動きません。

色々調べてみると、endfloatパッケージの説明書の8.1"Modified figures and tables"に「\end{figure}を調べてるから無理」というような事が書かれています。
ですが、その後に「難しいけど出来なくはないよ」みたいなことも書かれているのですが、色々試してみましたが私の技量では出来ませんでした。

どうにかしてこのようなカスタム環境を使用する方法はないでしょうか?やはり素直に毎回\centeringを入力していくなどするしかないのでしょうか?
もしくは、endfloatを使わない代替方法があれば教えてください。

よろしくお願いします。
青子守歌 への返信

Re: endfloatを使った状態でのカスタム環境

- 匿 名 の投稿
その方法は、figure環境をcfigure環境に置き換えているだけで、手間はそれほど省略化できていないと思います。この程度の省略化でよいなら、例えば、
\newcommand{cincludegraphics}[1]{\centering\includegraphics{#1}}
としても同じように思いますが。未検証なので問題があれば申し訳ありません。
匿 名 への返信

Re: endfloatを使った状態でのカスタム環境

- 青子守歌 の投稿
あ、なるほど。
figure環境の方ではなくてincludegraphicsコマンドの方を置き換えてしまうという手もあるんですね!
\centeringを毎回打つのが面倒な(というか忘れることがないようにという)だけだったのでとりあえずそれで代用させてもらいます。

ただ、今のところそれほどクリティカルな状況ではないのですが、この先もっと複雑なカスタム環境が必要になったときやはり困る気がするので、引き続き修正方法を教えていただければと思います。
青子守歌 への返信

Re: endfloatを使った状態でのカスタム環境

- 匿 名 の投稿
次のサンプルのようなことをお考えですか?
# 結局,endfloat.sty が figure 環境に対して行っていることを
# ほぼそのまま cfigure 環境に適用しただけですが.

なお,既存の float とは全く別の系統の float も追加(例えば,「写真」用の
photo 環境も追加)して,その追加した環境もまた figure 環境などと同様に
文書末送りにしたい場合には,もう少し手を入れる箇所が増えます.

\documentclass{jarticle}
\usepackage{endfloat}

\makeatletter
\def\@tempa{\newenvironment{cfigure}[1][}
\expandafter\@tempa\fps@figure]
  {\begin{figure}[#1]\centering}
  {\end{figure}}
\def\@tempa{\newenvironment{cfigure*}[1][}
\expandafter\@tempa\fps@figure]
  {\begin{figure*}[#1]\centering}
  {\end{figure*}}

\let\@bcfig\cfigure%%% 「cfigure 環境の開始処理」を別名で保存し……
%%% \cfigure の定義の復元処理を \AtBeginDelayedFloats で設定
\AtBeginDelayedFloats{\let\cfigure\@bcfig}

%%% ファイル endfloat.sty における \figure の定義と同様に
%%% \cfigure/\cfigure* を再定義
\def\cfigure{%
    %%% figure 環境と cfigure 環境は同類なので「fff」(figure 環境を書き出す
    %%% ファイルの拡張子)と「postfig」(図の個数のカウンタ)は
    %%% ファイル endfloat.sty における \figure の定義から変更していません.
    \efloat@condopen{fff}
    \efloat@iwrite{fff}{\string\begin{cfigure}}%
    \if@domarkers%
      \addtocounter{postfig}{1}% % bj
      \figureplace%              % bj
    \fi%
    \def\@currenvir{efloat@float}%
    \begingroup%
    \let\do\ef@makeinnocent \dospecials%
    \ef@makeinnocent\^^L% and whatever other special cases
    \endlinechar`\^^M \catcode`\^^M=12 \ef@xcfigure}% (*)
\@namedef{cfigure*}{\cfigure}
{\catcode`\^^M=12 \endlinechar=-1 %
\gdef\ef@xcfigure#1^^M{\def\test{#1}% (*)
      \ifx\test\ef@endcfiguretest% (*)
          \efloat@foundend{fff}{cfigure}% (*)
      \else\ifx\test\ef@enddblcfiguretest% (*)
          \efloat@foundend{fff}{cfigure}% (*)
      \else%
          \efloat@iwrite{fff}{#1}%
          \let\next\ef@xcfigure% (*)
      \fi \fi \next}%
}%
{\escapechar=-1%
\xdef\ef@endcfiguretest{\string\\end\string\{cfigure\string\}}%      (*)
\xdef\ef@enddblcfiguretest{\string\\end\string\{cfigure*\string\}}%  (*)
}%
%%% (*) のところで,環境名の変更に応じた変更を追加
\makeatother

\begin{document}

\def\Text{これは,意味のないサンプルテキストです.
  これは,意味のないサンプルテキストです.
  これは,意味のないサンプルテキストです.
  これは,意味のないサンプルテキストです.
  これは,意味のないサンプルテキストです.\par}

\Text\Text\Text

\begin{cfigure}
  \fbox{図です}
  \caption{図の例}
\end{cfigure}

\Text\Text\Text

\begin{cfigure*}
  \fbox{これも図です}
  \caption{図の例}
\end{cfigure*}

\Text\Text\Text
\end{document}