試験ドキュメントクラスのソリューション環境内でテーブルを使用する

試験ドキュメントクラスのソリューション環境内でテーブルを使用する

solution私はドキュメントクラスの環境内でテーブル環境を使用しようとしていますexam。残念ながら、これは次のようには機能しません。これ質問はtablefloat でもあるためです。

ソリューション環境は内部的に\vboxを使用しているため、この環境内ではフロートは使用できません。フローティング環境テーブルを使用する代わりに、センター環境を使用できます。

これらは環境外で動作するため、ソリューションの外部で動作し、内部では に置き換えられるようにsolution変更する方法を探しています。\begin{table} ... \end{table}\begin{center}...\end{center}

幸いなことにこれ投稿では、環境内にいるかどうかを簡単に確認できることを示していますsolution。私はこれをテストしましたが、うまくいきました。
ただし、ドキュメントクラスに適合させる必要があるドキュメントはexam多数あり、他のドキュメントクラスでも使用されているため、理想的には新しい環境を作成するのではなく、table発生したのと同様に環境を適合させます。ここまたはfigureここ表形式環境へ。これがこれまでの私のコードです:
アップデート:理由は分かりませんが、\center代わりにを使用すると\begin{center}エラーがなくなり、オプションの引数を踏む方法も可能になります。table

\documentclass{exam}

\let\oldtable\table
\let\endoldtable\endtable

\renewenvironment{table}[1][h]
{\ifinner \center    \else  \oldtable[#1] \fi}
{\ifinner \endcenter \else  \endoldtable  \fi}

\begin{document}

\begin{questions} %error is no \question 
\printanswers

\question{Question featuring a table environment}

\begin{table}[h]
    \begin{tabular}{|ll|}
        Question & in  \\
        Question & part \\
    \end{tabular}
\end{table}


\begin{solution}
Solution featuring a table environment

    \begin{table}[h]
        \begin{tabular}{|ll|}
            Solution & in  \\
            Solution & part \\
        \end{tabular}
    \end{table}

\end{solution}

\end{questions}

\end{document}

しかし、パラメータをtable正しく処理していないのではないかと心配しています。これは、次のエラーにつながります: 不明な float オプション `['。\begin{table}[

このソリューションは「inner」の外側で動作し、のオプションの引数を処理できますtableが、が\ifinnertrueの場合、エラーが発生します。

余分な}、または忘れられた\endgroup。\end{table}

table環境に応じて適応する方法について、何か提案はありますか?

どうもありがとうございます。

答え1

解決策を見つけたので、他の誰かがこの問題に直面している場合に備えて、回答としてここに投稿します。(後から考えれば明らかな)問題は、\ifinner最初はフローティング環境なので動作するのですが、\table開始すると動作しなくなることです。そのため、\endcenterに到達できません。いくつかの代替案を試しましたが、最も簡単な方法は、ifinner変更されたtableに到達したかどうかをチェックするカスタム ブール値を定義し、これを使用してブール値を設定することです。 では、\endtableこのブール値を使用して、正しく終了するように処理できます。

\let\oldtable\table
\let\endoldtable\endtable
\newif\ifinsidefloatingenv  %set boolean for 
\insidefloatingenvfalse     %not necessary but to be sure its false

\renewenvironment{table}[1][h]
{\ifinner               \center \insidefloatingenvtrue     \else    \oldtable[#1]   \fi}
{\ifinsidefloatingenv   \endcenter \insidefloatingenvfalse \else    \endoldtable    \fi}

関連情報