Für den automatischen Export die Figure-Umgebung lokal als Figure* neu definieren

Für den automatischen Export die Figure-Umgebung lokal als Figure* neu definieren

Ich verwende einen Workflow auf Basis pandocvon Latex, um Dokumente mit dem Layout meines Unternehmens zu erstellen. Teil der Formatierung sind Bildunterschriften, die innerhalb des Randes gesetzt werden, und manchmal Bilder, die Text und Randbereich überspannen. Beides lässt sich mit dem sidenotesPaket problemlos erreichen. Es ermöglicht große Abbildungen, die die figure*Umgebung verändern.

In einem reinen Textdokument ist das Umschalten zwischen normal figureund figure*natürlich kein Problem. Aber ich muss einen automatisierten Workflow pandocvon Markdown über Latex zu PDF verwenden. Leider pandocbietet keine integrierte Option zum Umschalten zwischen markierter und normaler Umgebung. Daher habe ich einen Lua-Filter geschrieben, der als markiert markierte Zahlen in eine Gruppe einschließt und dort lokal neu definiert, figuredamit sie wie wirken figure*. Dies ist notwendig, da pandocimmer normale Befehle ausgibt figure. Leider kann ich es nicht zum Laufen bringen. Hier ist ein MWE mit einem kurzen Latex-Beispiel, das eine Ausgabe sein könnte 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}

Das Protokoll zeigt die folgende Fehlermeldung:

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

Das Erweitern der Kapazität von TeX löst das Problem nicht. Das Problem besteht auch weiterhin, wenn ich graphicxanstelle einer Regel ein Bild lade und verwende.

Ich hoffe auf einige Ideen zur Lösung des Problems.

Andere Ansätze zur lokalen Neudefinition sind figureebenfalls figure*sehr willkommen. Es ist jedoch obligatorisch, dass im Latex-Dokument die Umgebung selbst als einfach typisiert wird, figureda diese Ausgabe in gewisser Weise fest codiert ist pandoc.

Bearbeiten

Dank @cabohas Lösung habe ich es zum Laufen gebracht. Hier ist der Lua-Filter, den ich mit Pandoc verwende 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

Antwort1

Das Problem besteht darin, dass die sidenoteDefinition von figure*intern verwendet figure. Nach der Neudefinition figure*verwendet die interne Verwendung also auch figure*. Dies führt zu einer Endlosschleife.

figure-Ich würde empfehlen, zwei neue Umgebungen und zu definieren figure+. figure-kann eine einfache Kopie des normalen sein figure, figure+muss aber eine Kopie von sein, wobei von anstelle von figure*verwendet wird . Danach können Sie neu definieren, um entweder oder zu verwenden , z. B. abhängig von einem Schalter. Zusätzlich sollte auch geändert werden, um ein Alias ​​von zu sein :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}

Bildbeschreibung hier eingeben

verwandte Informationen