Redefinir localmente el entorno de figuras como figura* para exportación automatizada

Redefinir localmente el entorno de figuras como figura* para exportación automatizada

Estoy usando un flujo de trabajo basado en pandocLatex para producir papeles con el diseño de mi empresa. Parte del formato son títulos colocados dentro del margen y, a veces, utilizan imágenes que abarcan el texto y el área del margen. Ambos se pueden lograr fácilmente con el sidenotespaquete. Permite grandes figuras modificando el figure*entorno.

En un documento de texto plano, cambiar entre regular figurey, figure*por supuesto, no es un problema. Pero tengo que usar un flujo de trabajo automatizado pandocdesde Markdown hasta Latex y PDF. Desafortunadamente, pandocno ofrece ninguna opción integrada para cambiar entre el entorno normal y el destacado. Por lo tanto, escribí un filtro Lua que envuelve las figuras marcadas como destacadas dentro de un grupo y allí las redefine localmente figurepara que actúen como figure*. Esto es necesario ya que pandocsiempre genera comandos regulares figure. Desafortunadamente, no puedo hacerlo funcionar. Aquí hay un MWE con un breve ejemplo de Latex que podría ser un pandocresultado:

% !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}

El registro muestra el siguiente mensaje de error:

! 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 la capacidad de TeX no resuelve el problema. El problema también persiste si cargo graphicxy uso una imagen en lugar de una regla.

Espero algunas ideas sobre cómo resolver esto.

Otros enfoques para redefinir localmente figuretambién figure*son muy bienvenidos. Pero es obligatorio que en el documento Latex el entorno en sí se escriba como simple figureya que esta salida está codificada en formato pandoc.

Editar

Gracias a la solución @cabohas logré que funcionara. Aquí está el filtro Lua que uso con 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

Respuesta1

El problema es que la sidenotedefinición de figure*usos internos figure. Entonces, después de redefinir figure*, el uso interno también usa figure*. Esto da como resultado un bucle infinito.

Recomendaría definir dos nuevos entornos figure-y figure+. figure-Puede ser una copia simple del normal figure, pero figure+tiene que ser una copia figure*con el uso de figure-en lugar de figure. Después de esto, puede redefinir figureuse figure-o figure+, por ejemplo, dependiendo de un \if…modificador. Además, figure*también se debe cambiar para que sea un 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}

ingrese la descripción de la imagen aquí

información relacionada