paracol 和环境:反思环境的工作方式

paracol 和环境:反思环境的工作方式

我面临一个有趣的问题。在我看来,环境由一个名称、一个在开始时执行的代码和一个在结束时执行的代码定义。

然而,我正在尝试做:

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

相关内容