
Estou tentando usar o ambiente de tabela dentro do solution
ambiente da exam
documentclass. Infelizmente isso não funciona conforme indicado emessepergunta, já que table
também é um carro alegórico.
O ambiente da solução utiliza internamente um \vbox e isso tem como consequência que floats não são permitidos dentro deste ambiente. Em vez de usar a tabela de ambiente flutuante você pode usar um ambiente central
Como eles funcionam fora do solution
ambiente, estou procurando uma maneira de modificar \begin{table} ... \end{table}
para agir como está fora da solução e por dentro se substitui por \begin{center}...\end{center}
.
Felizmente comoessepost mostra que é fácil descobrir se você está ou não dentro de um solution
ambiente. Eu testei isso e funciona.
No entanto, como os documentos que tenho que adaptar à exam
documentclass são numerosos e também são usados em outras documentclasses, o ideal seria não criar um novo ambiente, mas adaptar os table
ambientes de forma semelhante ao que aconteceuaquipara o figure
ouaquipara ambiente tabular. Este é o meu código até agora:
ATUALIZAR:Não sei por que, mas em \center
vez de \begin{center}
o erro desapareceu e também permite uma maneira de seguir o argumento opcional detable
\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}
Mas temo não estar manipulando o parâmetro table
correto, pois isso leva ao erro: Unknown float option `['. \begin{tabela}[
Esta solução funciona fora do "interno" e pode lidar com o argumento opcional de table
, no entanto, se \ifinner
for verdade, recebo o erro
Extra } ou esquecido \endgroup. \mesa final}
Alguém tem alguma sugestão de como se adaptar table
com base no meio ambiente?
Muito obrigado
Responder1
Encontrei uma solução e postei aqui como resposta se alguém estiver enfrentando esse problema. O problema (em retrospectiva, óbvio) é que \ifinner
funciona no começo, porque é um ambiente flutuante, mas assim que \table
começa não é mais. Portanto, \endcenter
não foi possível alcançá-lo. Eu tentei algumas alternativas e descobri que a maneira mais fácil é definir um booleano personalizado que verifica se o ifinner
modificado table
foi alcançado e usar isso para definir um booleano. No \endtable
this boolean pode então ser usado para terminar corretamente.
\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}