Discussion:
Uma sugestão para escrever sistemas de equações em LaTeX
Laércio Benedito de Sousa Júnior
2007-01-06 20:02:51 UTC
Permalink
Estive pesquisando, há alguns dias, uma forma de se escrever sistemas de
equações --- equações multi-linha, multi-numeradas , delimitadas à esquerda
por uma chave --- nos meus documentos LaTeX. Confesso que encontrei
pouquíssimas soluções a respeito na Web. Por exemplo, não encontrei nada no
Google fazendo busca seja em português, seja em inglês. Só consegui fazendo
uma busca em francês, e encontrei as seguintes soluções:

- o pacote 'mathenv', descrito em
http://www.ctan.org/tex-archive/macros/latex/contrib/bosisio/mathenv.html

- o pacote 'cases', disponível no CTAN em

/macros/latex/contrib/other/misc/


Este último pacote, em particular, é uma interessante alternativa ao
ambiente 'cases' do pacote 'amsmath', mas nenhum dos dois me agradou
completamente para fazer o que eu queria.

Resolvi então "pÎr a mão na massa". Comecei a fuçar tutoriais de [plain] TeX
(achá-los na Web foi um desafio à parte), [tentar] estudar o código do
pacote 'amsmath' (uma tortura para quem entende muito pouco de TeX) e quase
cheguei a importar um exemplar do TeXbook.

Mas, "aos trancos e barrancos", consegui chegar a uma solução provisória,
mas que está me agradando. O código em questão é o seguinte:

%% Equation system constructor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter % if necessary
\newsavebox{\DelimitedEquations}
\newsavebox{\LeftBrace}
\newsavebox{\NumberedEquations}

\newcommand{\delimited}[1]{\@nameuse{delimited#1}}
\newcommand{\delimitedalign}{aligned}
\newcommand{\delimitedgather}{gathered}
\newcommand{\delimitedalignat}{alignedat}

\newcommand{\BoxEnvironment}[2]{%
\begin{lrbox}{\DelimitedEquations}
$\begin{\delimited{#1}}#2\end{\delimited{#1}}$
\end{lrbox}
\begin{lrbox}{\NumberedEquations}
\parbox{\linewidth}{%
\vskip-\abovedisplayskip
\begin{#1}#2\end{#1}
\vskip-\belowdisplayskip}
\end{lrbox}}

\newenvironment{eqnsystem}[1]{%
\def\next{\BoxEnvironment{#1}}
\***@body{\next}}{%
\begin{lrbox}{\LeftBrace}
$\left.\vcenter{\vphantom{\usebox{\DelimitedEquations}}}\right\lbrace$
\end{lrbox}
$$
\makebox[0pt][r]{\usebox{\LeftBrace}}
\makebox[\wd\DelimitedEquations][c]{\usebox{\NumberedEquations}}
$$}

\newenvironment{eqnsystem*}[1]{%
\def\next{\BoxEnvironment{#1*}}
\***@body{\next}}{\endeqnsystem}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Para escrever um sistema de equações com o algoritmo acima [não se esqueça
de incluí-lo no seu preâmbulo LaTeX :-)], use o ambiente 'eqnsystem' (existe
um análogo 'eqnsystem*' para equações não-numeradas, mas não creio que será
de grande utilidade), passando como argumento o ambiente multi-linha do
pacote 'amsmath' que você quer usar. Em princípio, ele deve trabalhar bem
com os ambientes 'gather', 'align' e 'alignat':

\begin{eqnsystem}{align}
(...)
\end{eqnsystem}

\begin{eqnsystem}{gather}
(...)
\end{eqnsystem}

\begin{eqnsystem}{alignat}{<numero-de-colunas>}
(...)
\end{eqnsystem}

Também esbocei um ambiente wrapper para facilitar a contrução de sistemas de
equações no LyX. O código, que ainda precisa ser melhorado, é o seguinte:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Adicione ao preâmbulo acima os seguintes comandos:

\long\def\LyXBoxEnvironment#1\begin#2#3\end#4{%
\BoxEnvironment{#2}{#3}}

\newenvironment{lyxeqnsystem}{\LyXBoxEnvironment}{\endeqnsystem}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Neste caso, basta envolver um ambiente 'align', 'alignat' ou 'gather' por um
ambiente 'lyxeqnsystem' (isto é feito no LyX inserindo caixas de ERT
apropriadas logo acima e logo abaixo das equações). Por exemplo:

\begin{lyxeqnsystem}
\begin{align}
(...) % NÃO USE ambientes internos (como o 'split' ou os '?matrix')
aqui.
% O wrapper 'lyxeqnsystem' ainda não suporta ambientes aninhados.
\end{align}
\end{lyxeqnsystem}

Por ora, é isso. Quem quiser, experimente --- e não deixe de enviar o seu
feedback, com críticas, sugestões, relatos de bugs e referências para outras
soluções disponíveis.

P.S. 1: Estou pensando em escrever para os responsáveis pelo pacote
'amsmath', sugerindo que incluam um ambiente apropriado para sistemas de
equações.

P.S. 2: Ainda não desisti de importar o TeXbook. Nessa aventura, precebi que
há muita coisa interessante para se aprender em TeX --- e que vai além
daquilo que estamos habituados a fazer em LaTeX.
Bernhard Enders
2007-01-06 23:23:34 UTC
Permalink
Acho que a falta de um ambiente dedicado (ou mesmo o suporte) no
pacote amsmath para construção de sistemas de equações com decoração à
esquerda provavelmente não foi percebida por muitos. Por isso sua
dificuldade em encontrar soluções para esse problema na web.

O uso da chave à esquerda, no caso de sistemas de equações, não é nada
comum no resto do mundo. Dei uma olhada rápida nos principais livros
de Álgebra Linear e não achei sequer um que adotasse tal prática.
Assim sendo o "ambiente apropriado para sistemas de
equações" já existe no amsmath.

O uso da chave à esquerda é bastante comum quando se tem uma igualdade
à esquerda, para esse tipo de expressões existe o ambiente cases do
amsmath, pena que ele não produz numeração individual. Essa
dificuldade na numeração foi suprida pelo pacote cases.sty já
mencionado.

Gostei do seu ambiente. Geralmente utilizo o pacote empheq.sty para
decorar as equações. Ele pode ser utilizado de maneira semelhante a
que você propôs:

\begin{empheq}[left=\empheqlbrace]{align}
2x + 3y + z &= 0 \\
5x - 2y &= 3\\
y + z &= 1
\end{empheq}

Atte.

Bernhard.
Estive pesquisando, há alguns dias, uma forma de se escrever sistemas de
equações --- equações multi-linha, multi-numeradas , delimitadas à esquerda
por uma chave --- nos meus documentos LaTeX. Confesso que encontrei
pouquíssimas soluções a respeito na Web. Por exemplo, não encontrei nada no
Google fazendo busca seja em português, seja em inglês. Só consegui fazendo
- o pacote 'mathenv', descrito em
http://www.ctan.org/tex-archive/macros/latex/contrib/bosisio/mathenv.html
- o pacote 'cases', disponível no CTAN em
/macros/latex/contrib/other/misc/
Este último pacote, em particular, é uma interessante alternativa ao
ambiente 'cases' do pacote 'amsmath', mas nenhum dos dois me agradou
completamente para fazer o que eu queria.
Resolvi então "pôr a mão na massa". Comecei a fuçar tutoriais de [plain] TeX
(achá-los na Web foi um desafio à parte), [tentar] estudar o código do
pacote 'amsmath' (uma tortura para quem entende muito pouco de TeX) e quase
cheguei a importar um exemplar do TeXbook.
Mas, "aos trancos e barrancos", consegui chegar a uma solução provisória,
%% Equation system constructor
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter % if necessary
\newsavebox{\DelimitedEquations}
\newsavebox{\LeftBrace}
\newsavebox{\NumberedEquations}
\newcommand{\delimitedalign}{aligned}
\newcommand{\delimitedgather}{gathered}
\newcommand{\delimitedalignat}{alignedat}
\newcommand{\BoxEnvironment}[2]{%
\begin{lrbox}{\DelimitedEquations}
$\begin{\delimited{#1}}#2\end{\delimited{#1}}$
\end{lrbox}
\begin{lrbox}{\NumberedEquations}
\parbox{\linewidth}{%
\vskip-\abovedisplayskip
\begin{#1}#2\end{#1}
\vskip-\belowdisplayskip}
\end{lrbox}}
\newenvironment{eqnsystem}[1]{%
\def\next{\BoxEnvironment{#1}}
\begin{lrbox}{\LeftBrace}
$\left.\vcenter{\vphantom{\usebox{\DelimitedEquations}}}\right\lbrace$
\end{lrbox}
$$
\makebox[0pt][r]{\usebox{\LeftBrace}}
\makebox[\wd\DelimitedEquations][c]{\usebox{\NumberedEquations}}
$$}
\newenvironment{eqnsystem*}[1]{%
\def\next{\BoxEnvironment{#1*}}
\makeatother
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Para escrever um sistema de equações com o algoritmo acima [não se esqueça
de incluí-lo no seu preâmbulo LaTeX :-)], use o ambiente 'eqnsystem' (existe
um análogo 'eqnsystem*' para equações não-numeradas, mas não creio que será
de grande utilidade), passando como argumento o ambiente multi-linha do
pacote 'amsmath' que você quer usar. Em princípio, ele deve trabalhar bem
\begin{eqnsystem}{align}
(...)
\end{eqnsystem}
\begin{eqnsystem}{gather}
(...)
\end{eqnsystem}
\begin{eqnsystem}{alignat}{<numero-de-colunas>}
(...)
\end{eqnsystem}
Também esbocei um ambiente wrapper para facilitar a contrução de sistemas de
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\long\def\LyXBoxEnvironment#1\begin#2#3\end#4{%
\BoxEnvironment{#2}{#3}}
\newenvironment{lyxeqnsystem}{\LyXBoxEnvironment}{\endeqnsystem}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Neste caso, basta envolver um ambiente 'align', 'alignat' ou 'gather' por um
ambiente 'lyxeqnsystem' (isto é feito no LyX inserindo caixas de ERT
\begin{lyxeqnsystem}
\begin{align}
(...) % NÃO USE ambientes internos (como o 'split' ou os '?matrix')
aqui.
% O wrapper 'lyxeqnsystem' ainda não suporta ambientes aninhados.
\end{align}
\end{lyxeqnsystem}
Por ora, é isso. Quem quiser, experimente --- e não deixe de enviar o seu
feedback, com críticas, sugestões, relatos de bugs e referências para outras
soluções disponíveis.
P.S. 1: Estou pensando em escrever para os responsáveis pelo pacote
'amsmath', sugerindo que incluam um ambiente apropriado para sistemas de
equações.
P.S. 2: Ainda não desisti de importar o TeXbook. Nessa aventura, precebi que
há muita coisa interessante para se aprender em TeX --- e que vai além
daquilo que estamos habituados a fazer em LaTeX.
--
TeX-BR Homepage: http://biquinho.furg.br/tex-br/

Para sair da lista mande um mail com unsubscribe
no corpo para tex-br-request-***@public.gmane.org
Laércio Benedito de Sousa Júnior
2007-01-08 14:03:59 UTC
Permalink
O uso da chave à esquerda, no caso de sistemas de equações, não é nada
comum no resto do mundo. Dei uma olhada rápida nos principais livros
de Álgebra Linear e não achei sequer um que adotasse tal prática.
Assim sendo o "ambiente apropriado para sistemas de
equações" já existe no amsmath.
Atualmente, estou [re]estudando o livro "Photons and Atoms: Introduction to
Quantum Electrodynamics", de Cohen-Tannoudji, Dupont-Roc e Grynberg (John
Wiley & Sons, 1989). Neste livro, todos os sistemas de equações são grafados
com chave à esquerda e numeração individual.

Eu já sabia como escrever sistemas de equações com chave à esquerda usando
um ambiente 'aligned', por exemplo, dentro de um ambiente 'equation'. O
problema aqui é que eu não podia referenciar cada equação, mas apenas o
sistema como um todo.

Gostei do seu ambiente. Geralmente utilizo o pacote empheq.sty para
decorar as equações. Ele pode ser utilizado de maneira semelhante a
\begin{empheq}[left=\empheqlbrace]{align}
2x + 3y + z &= 0 \\
5x - 2y &= 3\\
y + z &= 1
\end{empheq}
Muito obrigado pela dica do pacote 'empheq'. Ele esteve o tempo todo
"debaixo do meu nariz" e eu não o conhecia... Por que será que ele nunca
apareceu nas minhas "googladas"?

Apenas para complementar, deixo uma dica para usar mais facilmente tal
pacote no LyX:

1- No preâmbulo, inclua o pacote com a opção 'overload':
\usepackage[overload]{empheq}

2- Defina um novo ambiente que irá configurar como decorar as equações. No
exemplo acima (sistemas de equações com chave à esquerda), pode ser assim:
\newenvironment{eqnsystem}{\empheqset{left=\empheqlbrace}}{}

3- Escreva suas equações (ambientes suportados pelo pacote 'empheq') no LyX
normalmente e, quando quiser aplicar a decoração, basta inserir caixas ERT
com os comandos '\begin{}' e '\end{}' apropriados, imediatamente acima e
abaixo das equações, claro :-).

Loading...