Я использую рабочий процесс на основе pandoc
Latex для создания документов с макетом моей компании. Частью форматирования являются подписи, размещенные внутри полей, а иногда и изображения, которые охватывают текст и область полей. Оба могут быть легко достигнуты с помощью пакета sidenotes
. Он позволяет крупным фигурам изменять figure*
среду.
В текстовом документе переключение между обычным figure
и , figure*
конечно, не проблема. Но мне приходится использовать автоматизированный рабочий процесс с pandoc
markdown через 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
и использую изображение вместо правила.
Я надеюсь на какие-нибудь идеи, как решить эту проблему.
Другие подходы к локальному переопределению figure
as 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}