paracol e ambientes: reflexão sobre o funcionamento dos ambientes

paracol e ambientes: reflexão sobre o funcionamento dos ambientes

Estou enfrentando um problema interessante. Na minha cabeça, os ambientes são definidos com um nome, um código para executar no início e um código para executar no final.

No entanto, estou tentando fazer:

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

mas isso não funciona.

Isso me parece muito estranho, pois pensei que os códigos inicial e final dos ambientes foram executados conforme está escrito na definição. Este pequeno exemplo mostra que a definição do ambiente faz outra coisa.

Como fazer meu código funcionar?

Outra dúvida: o código não funciona se eu colocar \switchcolumn no código final do env1. O que está acontecendo ?

Editar

Para entender o propósito, dê uma olhada emessa questãoEu perguntei há 2 dias. Esse foi o mesmo problema com o markdownpacote. Esses ambientes são a base para a implementação de um livro de receitas.

Eu gostaria de iniciar o paracolambiente no início do ingredientambiente e finalizá-lo no final do preparationambiente (eventualmente, no final do recipeambiente também estaria ok.

Responder1

Não acho que você ganhe muito fazendo essa divisão. De qualquer forma, você pode fazer isso de uma maneira diferente.

Por que o seu jeito não funciona? Como os ambientes formam grupos, quando você fecha o seu env1, grande parte da configuração feita por \begin{paracol}{2}é esquecida.

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

Eu costumava latinobter uma boa hifenização em colunas estreitas.

O primeiro ambiente armazena apenas o texto, que é utilizado no segundo.

Responder2

Você pode fazer isso (mais ou menos) usando o pacote environ. Você pode armazenar o texto como uma macro global, savebox ou lista de tokens (acredito que \BODY seja uma lista de tokens).

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

informação relacionada