自動エクスポートのために、図環境をローカルで図*として再定義します。

自動エクスポートのために、図環境をローカルで図*として再定義します。

私は、と Latex に基づくワークフローを使用して、pandoc会社のレイアウトで論文を作成しています。書式設定の一部には、余白内に設定されたキャプションと、テキストと余白領域にまたがる画像の使用があります。どちらもパッケージで簡単に実現できますsidenotes。環境を変更する大きな図が可能になりますfigure*

プレーンテキスト文書では、通常のfigureとを切り替えることfigure*はもちろん問題ありません。しかし、pandocマークダウンから Latex を経由して PDF に至る自動化されたワークフローを使用する必要があります。残念ながら、pandocには、スター付き環境と通常の環境を切り替える組み込みオプションがありません。そこで、グループ内にスター付きとしてマークされた図をラップし、その中で のfigureように動作するようにローカルに再定義する Lua フィルターを作成しました。 は常に通常のコマンドを出力するfigure*ので、これは必要です。残念ながら、これを動作させることができません。以下は、出力になり得る短い Latex の例を含む MWE です。pandocfigurepandoc

% !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.

graphicxTeX の容量を拡大しても問題は解決しません。ルールの代わりに画像を読み込んで使用した場合も、問題は解決しません。

これを解決する方法についてのアイデアを期待しています。

figureをローカルに再定義する他のアプローチも大歓迎です。ただし、この出力は でハードコードされているようなので、figure*LaTeX ドキュメントでは環境自体を simple として入力することが必須です。figurepandoc

編集

@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-figurefigurefigure-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}

ここに画像の説明を入力してください

関連情報