[cstex] vlna

Zdenek Wagner zdenek.wagner at gmail.com
Sun Oct 28 01:03:35 CEST 2007


27.10.07, Marek Nožka <tlapicka at centrum.cz>:
> On Thu, 25 Oct 2007 10:39:00 +0200 "Zdenek Wagner"
> <zdenek.wagner at gmail.com> wrote to "Czech and Slovak TeX-related
> mailing list" <cstex at cs.felk.cvut.cz>:
>
> > Muzete mi poslat minimalni soubor, ktery tu chybu zpusobuje, + log? Je
> > mozne, ze nastava konflikt s nejakym balickem. Na radku 33 by chyba
> > vznikat nemela.
>
> Mě to dělá něco podobného. Chyba je ale na řádku 32 :-)
>
To je tím, že máte starší verzi.

> Mysle jsem, že je to balíkem \usepackage[utf8x]{inputenc}
> (moc nechápu, co je to encTeX ale z toho co jsem četl, taka nějak
> tuším, že se to s UTF-8 nemá rádo)
> ale ten jsem vyhodil a soubor převedl to do iso8859-2. Taky to
> nepomohlo.
>
Je to stejný problém, nemáte aktivován encTeX.

> Mám TeXLive na Debian Etch GNU/Linux. Překládám pomocí cslatex.
>
Zde by encTeX měl být, jen není defaultně aktivován. Pusťte si
texconfig a zvolte Formats. Otevře se Váv ve vimu soubor fmtutils.cnf.
K formátům pdflatex, latex, tex, pdftex si přidejte -enc, takže to
bude vypadat takto:

tex             tex     -               tex.ini
pdftex          pdftex  -               -enc -translate-file=cp227.tcx
*pdftex.ini
latex           pdftex  language.dat    -enc -translate-file=cp227.tcx
*latex.ini
pdflatex        pdftex  language.dat    -enc -translate-file=cp227.tcx
*pdflatex.ini

Neměňte cp227.tcx, jinak se formáty nevygenerují. U CS formátů najdete
komentáře Petra Olšáka. Všechny mé linuxové počítače pracují v UTF-8,
proto jsem chtěl mít UTF-8 jako default. Příslušná část proto vypadá:

# - Czech / Slovak for ISO-8859-2 locale (see below for UTF8). Enable
# "by hand", not by "fmtutil --enablefmt", because definitions for
# ISO-8859-2 / UTF8 share the same name.
#! csplain              pdftex  -               -etex
-translate-file=cp227.tcx csplain.ini
#! cslatex              pdftex  -               -etex
-translate-file=cp227.tcx cslatex.ini
#! pdfcsplain   pdftex  -               -etex
-translate-file=cp227.tcx csplain.ini
#! pdfcslatex   pdftex  -               -etex
-translate-file=cp227.tcx cslatex.ini

# - Czech / Slovak for UTF8 locale (see above for ISO-8859-2). Enable
# "by hand", not by "fmtutil --enablefmt", because definitions for
# ISO-8859-2 / UTF8 share the same name.
csplain      pdftex     -               -etex -enc csplain-utf8.ini
cslatex      pdftex     -               -etex -enc cslatex-utf8.ini
pdfcsplain   pdftex     -               -etex -enc csplain-utf8.ini
pdfcslatex   pdftex     -               -etex -enc cslatex-utf8.ini

Po uložení změn budou automaticky vygenerovány potřebné formáty.

> Minimální soubor a log jsou v přílohách.
>
> Děkuji.
>
> Jen ještě filozofická otázka: Co mi přináší vlna.sty oproti klasické
> zkompilované vlně? Je to jen v tom, že se mi to vlnkuje samo už při
> překladu a já to nemusím pouštět ručně nebo je v tom něco víc?
>
Především encTeX umožňuje, že se znaky chovají jako znaky, nikoliv
jako expandovatelné sekvence. Představme si, že chceme testovat
následující znak a podle toho provést nějakou akci. Máme tedy v makru
napsáno:

\futurelet\znak\testujznak

V makru \testujznak pak něco děláme s obsahem \znak. Pokud náslodovalo
písmeno c, pak v makru \znak je skutečně písmeno c s kategorií 11.
Pokud použijete balíček inputenc a vstupní kódování je osmibitové a na
vstupu je č, pak \znak bude obsahovat č ve vstupním kódování, ale s
kategorií 13. Nyní chcete dělat něco jiného, pokud je na vstupu c.
Napíšete test:

\if\znak c ... \else ... \fi

Primitiv \if provádí plnou expanzi. Aktivní č se tedy expanduje na
sérii tokenů, první dva se srovnají, budou různé, zbytek se přeskočí a
provede se kód za \else, což je v pořádku. Když napíšeme:

\if c\znak ... \else ... \fi

bude výsledek v zásadě stejný. Horší to bude v případě, kdy chceme
testovat, zda je následujícím znakem č. Nezáleží na tom, zda napíšeme
\if č\znak, nebo \if\znak č, vzhledem k expanzi nebude podmínka
splněna nikdy.

Ještě horší je případ, kdy je text v UTF-8. Pak totiž \znak může
obsahovat jen půlku znaku. Při expanzi makra \znak při vyhodnocování
podmínky \if dojde k chybě, protože za první půlkou znaku následuje
cosi, co v druhé půlce být nesmí. Pokud se použije encTeX, pak TeX
vidí osmibitové znaky v kódování fontu, takže č bude vždy znak s
kategorií 11. Výše uvedené testy budou tedy fungovat.

A nyní se vraťme k vlnkování. V matematice a v prostředích verbatim
vlnkovat nechceme. Externí program se řídí výčtem prostředí, zatímco
encTeX je založen na myšlence (nevím, kdo ji řekl jako první): "Only
TeX can read TeX." Představme si, že si kvůli úspoře psaní
nadefinujeme:

\newcommand\be[1][]{\begin{equation}\ifcat$#1$\else\label{#1}\fi}
\newcommand\ee\{\end{equation}}

Pak napíšeme:
\be[complex.num]
\exp(i \phi) = \cos\phi + i \sin\phi
\ee

Externí program tuto rovnici ovlnkuje, vlna.sty správně pozná matematický režim.

Další informace najdete ve dvou článcích Petra Olšáka, viz:
http://bulletin.cstug.cz/bul973.shtml
http://bulletin.cstug.cz/bul20032.shtml


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


More information about the csTeX mailing list