Ich verwende einen Workflow auf Basis pandoc
von 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 sidenotes
Paket problemlos erreichen. Es ermöglicht große Abbildungen, die die figure*
Umgebung verändern.
In einem reinen Textdokument ist das Umschalten zwischen normal figure
und figure*
natürlich kein Problem. Aber ich muss einen automatisierten Workflow pandoc
von Markdown über Latex zu PDF verwenden. Leider pandoc
bietet 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, figure
damit sie wie wirken figure*
. Dies ist notwendig, da pandoc
immer 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 graphicx
anstelle einer Regel ein Bild lade und verwende.
Ich hoffe auf einige Ideen zur Lösung des Problems.
Andere Ansätze zur lokalen Neudefinition sind figure
ebenfalls figure*
sehr willkommen. Es ist jedoch obligatorisch, dass im Latex-Dokument die Umgebung selbst als einfach typisiert wird, figure
da 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 sidenote
Definition 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-
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}