Redefinir localmente o ambiente de figura como figura* para exportação automatizada

Redefinir localmente o ambiente de figura como figura* para exportação automatizada

Estou usando um fluxo de trabalho baseado em pandoclátex para produzir papéis com o layout da minha empresa. Parte da formatação são legendas definidas dentro da margem e, às vezes, usando imagens que abrangem o texto e a área da margem. Ambos podem ser facilmente alcançados com o sidenotespacote. Permite grandes figuras modificando o figure*ambiente.

Em um documento de texto simples, alternar entre regular figuree figure*obviamente não é problema. Mas tenho que usar um fluxo de trabalho automatizado que vai pandocdesde o markdown até o Latex e o PDF. Infelizmente, pandocnão oferece nenhuma opção integrada para alternar entre o ambiente marcado com estrela e o normal. Assim, escrevi um filtro Lua que agrupa figuras marcadas como estreladas dentro de um grupo e lá redefine localmente figurepara agir como figure*. Isto é necessário porque pandocsempre gera figurecomandos regulares. Infelizmente, não consigo fazê-lo funcionar. Aqui está um MWE com um pequeno exemplo de Latex que pode ser uma pandocsaída:

% !TeX lualatex
\documentclass{article}
\usepackage{sidenotes}
\usepackage[outer=4cm]{geometry}
\usepackage{blindtext}
\begin{document}
\blindtext
\begingroup
\RenewEnvironmentCopy{figure}{figure*}
\begin{figure}
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure}
\endgroup
\end{document}

O log mostra a seguinte mensagem de erro:

! TeX capacity exceeded, sorry [save size=200000].
\tl_set:Nn ..._set:Ne #1{\__kernel_exp_not:w {#2}}
                                                  
l.11 \rule
        {\linewidth}{2ex}
If you really absolutely need more capacity,
you can ask a wizard to enlarge me.

Ampliar a capacidade do TeX não resolve o problema. O problema também persiste se eu carregar graphicxe usar uma imagem em vez de uma regra.

Espero algumas idéias de como resolver isso.

Outras abordagens para redefinir localmente figuretambém figure*são muito bem-vindas. Mas é obrigatório que no documento Latex o ambiente em si seja digitado como simples, figurejá que essa saída está meio codificada em pandoc.

Editar

Graças à solução @cabohas consegui fazer funcionar. Aqui está o filtro Lua que uso com pandoc como pandoc -s -L path/to/filter.lua file.md -o file.tex:

if FORMAT:match 'latex' then
   function Figure (elem)
      local starred = elem.content[1].content[1].attributes['starred']
      if starred and starred == "true" then
         return {
            pandoc.RawInline('latex', '\\defaultwidefiguretrue'),
            elem,
            pandoc.RawInline('latex', '\\defaultwidefigurefalse')
         }
      else
         return elem
      end
   end
end

Responder1

O problema é que a sidenotedefinição de figure*uso interno usa figure. Então, depois de redefinir figure*, o uso interno também usa figure*. Isso resulta em um loop infinito.

Eu recomendaria definir dois novos ambientes figure-e figure+. figure-pode ser uma cópia simples do normal figure, mas figure+deve ser uma cópia figure*com uso de figure-em vez de figure. Depois disso, você pode redefinir figurepara usar figure-ou figure+, por exemplo, dependendo de uma \if…opção. Além disso, figure*também deve ser alterado para ser um alias de figure+:

\documentclass{article}
\usepackage{sidenotes}
\usepackage[outer=4cm]{geometry}
\usepackage{blindtext}
\NewEnvironmentCopy{figure-}{figure}
\makeatletter
\NewDocumentEnvironment{figure+}{ O{htbp} }
{
    \begin{figure-}[#1]
        \begin{autoadjustwidth}{}{-\@sidenotes@extrawidth}
        \captionsetup{style=widefigure}
}
{
        \end{autoadjustwidth}
    \end{figure-}
}
\makeatother  
\newif\ifdefaultwidefigure
\RenewDocumentEnvironment{figure}{ O{htbp} }
{
  \ifdefaultwidefigure
    \def\figureenvtype{figure+}%
  \else
    \def\figureenvtype{figure-}%
  \fi
  \begin{\figureenvtype}[#1]%
}
{
  \end{\figureenvtype}
}
\RenewEnvironmentCopy{figure*}{figure+}
\begin{document}
\blindtext
\defaultwidefigurefalse% first example not wide
\begin{figure}
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure}

\blindtext
\defaultwidefiguretrue% second example wide
\begin{figure}
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure}

\blindtext
\begin{figure*}% third example wide by used environment
\rule{\linewidth}{2ex}
\sidecaption{some text}
\end{figure*}


\end{document}

insira a descrição da imagem aqui

informação relacionada