私は、と Latex に基づくワークフローを使用して、pandoc
会社のレイアウトで論文を作成しています。書式設定の一部には、余白内に設定されたキャプションと、テキストと余白領域にまたがる画像の使用があります。どちらもパッケージで簡単に実現できますsidenotes
。環境を変更する大きな図が可能になりますfigure*
。
プレーンテキスト文書では、通常のfigure
とを切り替えることfigure*
はもちろん問題ありません。しかし、pandoc
マークダウンから Latex を経由して PDF に至る自動化されたワークフローを使用する必要があります。残念ながら、pandoc
には、スター付き環境と通常の環境を切り替える組み込みオプションがありません。そこで、グループ内にスター付きとしてマークされた図をラップし、その中で のfigure
ように動作するようにローカルに再定義する Lua フィルターを作成しました。 は常に通常のコマンドを出力するfigure*
ので、これは必要です。残念ながら、これを動作させることができません。以下は、出力になり得る短い Latex の例を含む MWE です。pandoc
figure
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.
graphicx
TeX の容量を拡大しても問題は解決しません。ルールの代わりに画像を読み込んで使用した場合も、問題は解決しません。
これを解決する方法についてのアイデアを期待しています。
figure
をローカルに再定義する他のアプローチも大歓迎です。ただし、この出力は でハードコードされているようなので、figure*
LaTeX ドキュメントでは環境自体を simple として入力することが必須です。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-
2 つの新しい環境とを定義することをお勧めします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}