我正在使用基于pandoc
Latex 的工作流程来制作具有我公司布局的论文。格式的一部分是设置在页边空白内的标题,有时使用跨越文本和页边空白区域的图像。两者都可以通过该软件包轻松实现sidenotes
。它允许修改figure*
环境中的大数字。
在纯文本文档中,在常规figure
和之间切换figure*
当然没有问题。但我必须使用pandoc
从 markdown 到 Latex 再到 PDF 的自动化工作流程。不幸的是,pandoc
没有提供在星号和常规环境之间切换的内置选项。因此,我编写了一个 Lua 过滤器,它将标记为星号的图形包装在一个组内,并在其中本地重新定义figure
为像一样运行figure*
。这是必要的,因为pandoc
总是输出常规figure
命令。不幸的是,我无法让它工作。这是一个带有简短 Latex 示例的 MWE,它可以作为输出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
也非常欢迎其他方法来局部重新定义figure*
。但在 Latex 文档中,环境本身必须键入为简单,figure
因为此输出在 中是硬编码的pandoc
。
编辑
感谢 @cabohas 的解决方案,我让它工作了。这是我与 pandoc 一起使用的 Lua 过滤器,例如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}