我面临一个有趣的问题。在我看来,环境由一个名称、一个在开始时执行的代码和一个在结束时执行的代码定义。
然而,我正在尝试做:
\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
。发生了什么?
编辑
要了解目的,请查看这个问题我两天前问过。这个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 包(或多或少)来做到这一点。你可以将文本存储为全局宏、保存框或标记列表(我相信 \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}