在本機上將圖形環境重新定義為圖形*以進行自動匯出

在本機上將圖形環境重新定義為圖形*以進行自動匯出

我正在使用基於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並使用圖像而不是規則,問題仍然存在。

我希望有一些想法如何解決這個問題。

其他本地重新定義的方法figurefigure*非常受歡迎。但在 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*figurefigure*figure*

我建議定義兩個新環境figure-figure+.figure-可以是普通的簡單副本figure,但figure+必須是figure*使用 offigure-而不是 的副本figure。此後,您可以重新定義figure為 usefigure-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}

在此輸入影像描述

相關內容