Локально переопределить среду figure как figure* для автоматического экспорта

Локально переопределить среду figure как figure* для автоматического экспорта

Я использую рабочий процесс на основе pandocLatex для создания документов с макетом моей компании. Частью форматирования являются подписи, размещенные внутри полей, а иногда и изображения, которые охватывают текст и область полей. Оба могут быть легко достигнуты с помощью пакета sidenotes. Он позволяет крупным фигурам изменять figure*среду.

В текстовом документе переключение между обычным figureи , figure*конечно, не проблема. Но мне приходится использовать автоматизированный рабочий процесс с pandocmarkdown через Latex в PDF. К сожалению, pandocне предлагает встроенной опции для переключения между звездной и обычной средой. Таким образом, я написал фильтр Lua, который оборачивает фигуры, помеченные как звездные, внутри группы и там локально переопределяет, figureчтобы действовать как figure*. Это необходимо, поскольку pandocвсегда выводит обычные figureкоманды. К сожалению, я не могу заставить это работать. Вот MWE с коротким примером Latex, который может быть выходом pandoc:

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

В журнале отображается следующее сообщение об ошибке:

! 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.

Увеличение емкости TeX не решает проблему. Проблема также сохраняется, если я загружаю graphicxи использую изображение вместо правила.

Я надеюсь на какие-нибудь идеи, как решить эту проблему.

Другие подходы к локальному переопределению figureas figure*также весьма приветствуются. Но обязательно, чтобы в документе Latex сама среда была типизирована как simple, figureпоскольку этот вывод как бы жестко закодирован в pandoc.

Редактировать

Благодаря решению @cabohas я заставил его работать. Вот фильтр Lua, который я использую с pandoc, например 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

решение1

Проблема в том, что sidenoteопределение figure*внутренне использует figure. Поэтому после переопределения figure*внутреннее использование также использует figure*. Это приводит к бесконечному циклу.

Я бы рекомендовал определить две новые среды figure-и figure+. figure-может быть простой копией обычного figure, но figure+должна быть копией figure*с использованием figure-вместо figure. После этого вы можете переопределить figureлибо использовать , figure-либо figure+, например, в зависимости от \if…переключателя. Кроме того, figure*следует также изменить на псевдоним 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}

введите описание изображения здесь

Связанный контент