本地将图形环境重新定义为图形*,以便自动导出

本地将图形环境重新定义为图形*,以便自动导出

我正在使用基于pandocLatex 的工作流程来制作具有我公司布局的论文。格式的一部分是设置在页边空白内的标题,有时使用跨越文本和页边空白区域的图像。两者都可以通过该软件包轻松实现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}

在此处输入图片描述

相关内容