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

Zdenek Wagner zdenek.wagner at gmail.com
Sun May 30 21:24:01 CEST 2010


Dne 30. května 2010 21:00 Michal Růžička <xruzick7 at fi.muni.cz> napsal(a):
> 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).
>
Asi to tak jednoduše nepůjde. Pokusím se vysvětlit ideu. V LaTeXu
\begin{env} funguje tak, že otevře skupinu, provede pár interních akcí
a pak provede makro \env. Jakmine se narazí na \end{env}, provedou se
kontroly, zda jsou prostředí správně vnořena, pak se provede makro
\endenv a zavře se skupina. Pokud tedy v nějakém balíčku existuje
prostředí env a já ho chci modifikovat, lze to udělat takto:

\let\ORIGenv\env
\let\ORIGendenv\endenv
\renewenvironment{env}{\ORIGenv + moje inicializace}{můj konec + \ORIGendenv}

AMS styly jsou však psány jiným způsobem. Leccos je děláno na
primitivní úrovni, mechanismy LaTeXu jsou obcházeny. Bez důkladného
studia příslušných maker to nepůjde.

Já bych to řešil tak, že bych příslušná makra úplně přepsal. Buď bych
dal uživatelům nový balíček, který by se používal tak, jak jsou na to
zvyklí z AMS stylů, nebo bych se smířil s tím, že ve finální verzi u
mě v redakci se to vysází jinak a místo balíčků, které použil autor,
bych vložil své vlastní.

> 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
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>



-- 
Zdeněk Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz



More information about the csTeX mailing list