паракол и окружающая среда: размышления о том, как работает окружающая среда

паракол и окружающая среда: размышления о том, как работает окружающая среда

Я столкнулся с интересной проблемой. В моем представлении среды определяются именем, кодом для выполнения в начале и кодом для выполнения в конце.

Тем не менее, я пытаюсь сделать:

\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}

но это не работает.

Это звучит очень странно для меня, так как я думал, что начальный и конечный коды окружения выполняются в том месте, которое написано в определении. Этот небольшой пример показывает, что определение окружения делает что-то еще.

Как заставить мой код работать?

Другой вопрос: код не работает, если я помещаю \switchcolumn в конец кода env1. Что происходит?

Редактировать

Чтобы понять цель, взгляните наэтот вопросЯ спрашивал 2 дня назад. Та же проблема с markdownпакетом. Эти среды являются основой для реализации книги рецептов.

Я бы хотел начать paracolсреду в начале среды ingredientи закончить ее в конце среды preparation(в конце среды recipeтоже было бы нормально).

решение1

Я не думаю, что вы много выиграете, делая этот сплит. В любом случае, вы можете сделать это по-другому.

Почему ваш способ не работает? Потому что среды формируют группы, поэтому когда вы закрываете свой env1, большая часть настроек, сделанных вами, \begin{paracol}{2}забывается.

\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}

Я использовал его latinтолько для того, чтобы добиться хорошей расстановки переносов в узких столбцах.

Первая среда просто хранит текст, который используется во второй.

решение2

Вы можете сделать это (более или менее) с помощью пакета environ. Вы можете сохранить текст как глобальный макрос, savebox или список токенов (я думаю, \BODY — это список токенов).

\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}

Связанный контент