sazba zdrojoveho kodu

David Necas (Yeti) yeti at physics.muni.cz
Sat Dec 10 15:53:35 CET 2005


On Sat, Dec 10, 2005 at 01:40:44PM +0100, Viktor Patras wrote:
> rad bych si vytvoril prostredi pro sazbu prikazu/skupin prikazu
> zdrojoveho kodu v beznem textu v LaTeXu. Zkousel jsem definovat
> 
> \newenvironment{matlab}{\begin{quote}
> \begin{verbatim}}{\end{verbatim} \end{quote}}
> 
> a pak v textu pouzit
> 
> \begin{matlab}
> >> x = ...
> \end{matlab}
> 
> ale neprelozi se to a hlasi to chybu
> 
> Runaway argument?
> \begin{priklad}\ETC.A,b,Aeq,beq,lb,ub)"
> !File ended while scanning use of \@xverbatim.
> <inserted text>
>                           \par
> <*> ovm
> 
> kde ovm je nazev dokumentu.
> 
> Neda se ten par begin/end{verbatim} nejak jednoduse rozseknout, aby
> mohl byt begin v definici prostredi "pred" a end v "po"?

Jednoduše ne, protože prostředí verbatim je speciální.

O co jde: \begin{verbatim} nakonec vede na něco jako
\@xverbatim, což je makro definované s koncovým oddělovačem
\end{verbatim}, tj. zhruba

    \gdef\@xverbatim#1\end{verbatim}{tělo makra}
                      ^^^^^^^^^^^^^^
                      delimiter

Když TeX dojde k \x at verbatim, začne tedy bez expanse scanovat
tokeny, dokud nenarazí na ,\end{verbatim}`. A to jako
posloupnost znaků, kde \, { i } mají catcode 12, není to
žádný příkaz \end s parametrem verbatim. Skutečná definice
proto taky vypadá

    |gdef|@xverbatim#1\end{verbatim}[tělo makra]

kde | nahrazuje \, [ nahrazuje { a ] nahrazuje }, jelikož
kategorie znaků musejí sedět s použitím -- a ve chvíli
použití už jsou kategorie \, { a } změněné (a kromě toho by
jinak TeX považoval {verbatim} za tělo makra).

Podstatné je, že nic, co není sekvence znaků ,\end{verbatim}`,
neukončí paramter makra \@xverbatim. Takže ve vašem případě
TeX celkem logicky dojde až na konec souboru a začne se
nahlas divit.

Nejjednodušší řešení je definovat nové verbatim-like
prostředí od nuly, takže bude mít vlastní analogii
\@xverbatim s argumentem ukončeným svým vlastním
delimiterem. Můžete začít s kopií verbatim z latex.ltx, kde
všechno přejmenujete, a pak si to upravíte k obrazu svému,
nebo z přímočařejších maker např. z TBN (kde ostatně najdete
i lepší a podrobnější popis fungování maker typu verbatim).

Také by možná šlo v begin části nového prostředí lokálně
změnit definici \@xverbatim, aby mělo delimiter \end{matlab}
namísto \end{verbatim}, ale nezkoušel jsem to, takže nevím,
s jakými potížemi byste se přitom musel potýkat.

Yeti


--
That's enough.




More information about the csTeX mailing list