Estoy usando un flujo de trabajo basado en pandoc
Latex 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 sidenotes
paquete. Permite grandes figuras modificando el figure*
entorno.
En un documento de texto plano, cambiar entre regular figure
y, figure*
por supuesto, no es un problema. Pero tengo que usar un flujo de trabajo automatizado pandoc
desde Markdown hasta Latex y PDF. Desafortunadamente, pandoc
no 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 figure
para que actúen como figure*
. Esto es necesario ya que pandoc
siempre genera comandos regulares figure
. Desafortunadamente, no puedo hacerlo funcionar. Aquí hay un MWE con un breve ejemplo de Latex que podría ser un pandoc
resultado:
% !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 graphicx
y uso una imagen en lugar de una regla.
Espero algunas ideas sobre cómo resolver esto.
Otros enfoques para redefinir localmente figure
también figure*
son muy bienvenidos. Pero es obligatorio que en el documento Latex el entorno en sí se escriba como simple figure
ya 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 sidenote
definició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 figure
use 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}