Paracol und Umgebungen: Reflexionen über die Funktionsweise von Umgebungen

Paracol und Umgebungen: Reflexionen über die Funktionsweise von Umgebungen

Ich stehe vor einem interessanten Problem. Meiner Meinung nach werden die Umgebungen durch einen Namen, einen am Anfang auszuführenden Code und einen am Ende auszuführenden Code definiert.

Dennoch versuche ich Folgendes:

\documentclass[]{article}

\usepackage{paracol}
\usepackage{lipsum}

\newenvironment{env1}{%
    \begin{paracol}{2}%
}{}

\newenvironment{env2}{%
    \switchcolumn
}{%
    \end{paracol}%
}

\begin{document}

\begin{env1}
    \lipsum[1]
\end{env1}

\begin{env2}
    \lipsum[1]
\end{env2}

\end{document}

aber das funktioniert nicht.

Das klingt für mich sehr seltsam, da ich dachte, dass die Anfangs- und Endcodes der Umgebungen an der Stelle ausgeführt werden, an der es in der Definition steht. Dieses kleine Beispiel zeigt, dass die Umgebungsdefinition etwas anderes macht.

Wie bringe ich meinen Code zum Laufen?

Andere Frage: Der Code funktioniert nicht, wenn ich \switchcolumn am Ende des Codes einfüge env1. Was ist los?

Bearbeiten

Um den Zweck zu verstehen, werfen Sie einen Blick aufdiese FrageIch habe vor 2 Tagen gefragt. Das war das gleiche Problem mit dem markdownPaket. Diese Umgebungen sind die Grundlage für eine Rezeptbuchimplementierung.

Ich möchte die paracolUmgebung am Anfang der ingredientUmgebung starten und am Ende der Umgebung beenden (eventuell wäre auch preparationam Ende der Umgebung ok).recipe

Antwort1

Ich glaube nicht, dass Sie durch diese Aufteilung viel gewinnen. Sie können es aber auch anders machen.

Warum funktioniert Ihre Methode nicht? Weil Umgebungen Gruppen bilden, werden beim Schließen Ihres env1viele der von vorgenommenen Einstellungen \begin{paracol}{2}vergessen.

\documentclass[]{article}
\usepackage[latin]{babel}

\usepackage{paracol,environ}
\usepackage{lipsum}

\NewEnviron{env1}{\global\let\envone\BODY}
\newenvironment{env2}{%
  \paracol{2}\envone\switchcolumn
}{\endparacol}


\begin{document}

\begin{env1}
    \lipsum[1]
\end{env1}

\begin{env2}
    \lipsum[1]
\end{env2}

\end{document}

Ich habe es latinnur verwendet, um eine gute Silbentrennung in schmalen Spalten zu erreichen.

Die erste Umgebung speichert nur den Text, der in der zweiten verwendet wird.

Antwort2

Sie können dies (mehr oder weniger) mithilfe des Umgebungspakets tun. Sie können den Text als globales Makro, Savebox oder Tokenliste speichern (ich glaube, \BODY ist eine Tokenliste).

\documentclass[]{article}

\usepackage{paracol}
\usepackage{environ}
\usepackage{lipsum}

\newsavebox{\mycolumn}

\NewEnviron{env1}{%
    \global\setbox\mycolumn=\vbox{\hsize=\dimexpr 0.5\textwidth-0.5\columnsep\relax
      \BODY}%
}

\NewEnviron{env2}{%
    \begin{paracol}{2}%
    \unvbox\mycolumn
    \switchcolumn
    \BODY
    \end{paracol}%
}

\begin{document}
\sloppy% for lipsum in particular

\begin{env1}
    \lipsum[1]
\end{env1}

\begin{env2}
    \lipsum[1]
\end{env2}

\end{document}

verwandte Informationen