[cstex] Spolehlivá modifikace matematických prostředí

Michal Růžička xruzick7 at fi.muni.cz
Sun May 30 21:00:35 CEST 2010


Zdravím konferenci,

rád bych požádal o radu. Na konci e-mailu přikládám pokusný LaTeXový
dokument (nevím, jestli by to do konference prošlo jako příloha, takže
jsem to vložil přímo do těla e-mailu).

Potřeboval bych modifikovat (ideálně „všechna“) matematická prostředí,
a to tak, aby syntaxe zůstala stejná (tzn. aby koncoví uživatel nemusel
měnit svůj dokument, jen připojil např. LaTeXový balíček). Potřebuji
vkládat kód těsně na začátek a těsně na konec matematiky (ještě uvnitř
matematického prostředí). Základní matematická prostředí LaTeXu už jsem
zvládl (viz ukázka „equation“).

Můj postup je takový, že si uschovám (pomocí „\let“) původní definici
prostředí. To pak předefinuji tak, že na začátku prostředí pomocí makra
„\envget{<jméno>}“ přečtu a uschovám celý obsah prostředí až do
„\end<jméno>“. (Čtu obsah a při nalezení „\end<něco>“ zjišťuji, jestli
jsem již narazil na „\end<jméno>“. Pokud ano, končím, pokud ne, tak
pokračuji ve čtení.)

Konec prostředí pak předefinovávám tak, že pomocí uschované původní
definice otevřu dané prostředí, dále vložím svůj kód, makrem „\envput“
vložím načtený původní obsah, vložím svůj ukončovací kód a pomocí
uschované původní definice zase uzavřu dané matematické prostředí.

Problém je, že u AMS matematických prostředí jsem narazil. Uvedeným
postupem se mi např. nedaří redefinovat prostředí „align“ apod.

Můj dotaz tedy zní, existuje nějaká rozumně složitá, a přitom rozumně
spolehlivá metoda, jak tato prostředí redefinovat?

Předem děkuji za jakékoliv rady.

S pozdravem
Michal Růžička


--------8<----------8<------- MINIMAL.TEX -------8<----------8<--------
\documentclass{minimal}
\usepackage{amsmath}

%%
%% Pomocna makra
%%
\newtoks\privenvgetbuffera
\newtoks\privenvgetbufferb
%
\long\def\privenvget#1#2\end #3{%
    \privenvgetbuffera=\expandafter{\envput}%

\def\privenvtempa{#3}\def\privenvtempb{#1}\ifx\privenvtempa\privenvtempb%
        \privenvgetbufferb={#2}%
        \def\privenvgetnext{\end{#1}}%
    \else%
        \privenvgetbufferb={#2\end{#3}}%
        \def\privenvgetnext{\privenvget{#1}}%
    \fi%
    \global\edef\envput{\the\privenvgetbuffera \the\privenvgetbufferb}%
    \privenvgetnext}
%
\long\def\envget#1{%
    \gdef\envput{}\privenvget{#1}}

%%
%% equation
%%
\let\normalequation\equation
\let\normalendequation\endequation
\renewenvironment{equation}%
    {\envget{equation}}%
    {\normalequation%
       AAA
       \envput%
       BBB
     \normalendequation}

%%
%% align
%%
%%%% vvvv PO ODKOMENTOVANI HAVARUJE vvvv
% \let\normalalign\align
% \let\normalendalign\endalign
% \renewenvironment{align}%
%     {\envget{align}}%
%     {\normalalign%
%        CCC
%        \envput%
%        DDD
%      \normalendalign}
%%%% ^^^^ PO ODKOMENTOVANI HAVARUJE ^^^^

%%
%% Dokument
%%
\begin{document}
text

\begin{equation}
a^2 + b^2 = c^2
\end{equation}

text

\begin{align}
a &= b & c &= d \\
e &= f & g &= h
\end{align}

text

\end{document}
--------8<----------8<----- ZDE ODSTŘIHNOUT -----8<----------8<--------


-- 
Michal Růžička <xruzick7 at fi.muni.cz>
https://www.fi.muni.cz/~xruzick7/pgp-klic/
PGP key fingerprint: 1CB2 41B9 F029 4B47 EECD  9BDA 90C9 CEB0 524C DACB



More information about the csTeX mailing list