Я столкнулся с интересной проблемой. В моем представлении среды определяются именем, кодом для выполнения в начале и кодом для выполнения в конце.
Тем не менее, я пытаюсь сделать:
\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}