我正在使用基於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*
使用 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}