Estou usando um fluxo de trabalho baseado em pandoc
lá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 sidenotes
pacote. Permite grandes figuras modificando o figure*
ambiente.
Em um documento de texto simples, alternar entre regular figure
e figure*
obviamente não é problema. Mas tenho que usar um fluxo de trabalho automatizado que vai pandoc
desde o markdown até o Latex e o PDF. Infelizmente, pandoc
nã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 figure
para agir como figure*
. Isto é necessário porque pandoc
sempre gera figure
comandos regulares. Infelizmente, não consigo fazê-lo funcionar. Aqui está um MWE com um pequeno exemplo de Latex que pode ser uma pandoc
saí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 graphicx
e usar uma imagem em vez de uma regra.
Espero algumas idéias de como resolver isso.
Outras abordagens para redefinir localmente figure
também figure*
são muito bem-vindas. Mas é obrigatório que no documento Latex o ambiente em si seja digitado como simples, figure
já 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 sidenote
definiçã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 figure
para 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}