problem s makrem \uv

Petr Olsak olsak at math.feld.cvut.cz
Tue Jul 1 18:32:35 CEST 1997


Vazeni kolegove,

pri pruzkumu kerningovych paru mezi znaky a ceskymi uvozovkami jsem
narazil na problem s makrem \uv. Vec se pokusim vylozit a davam dale
k posouzeni, zda zapis ceskych uvozovek pomoci \uv je to jedine prave.
Tim soucasne pripoustim, ze jsem se mozna mylil, kdyz jsem asi pred dvema
mesici zapis promoci \uv{} podporil.

Pokud se mezi vlozenim dvojice znaku do horizontalniho seznamu vykona
jakykoli povel hlavniho procesoru, implicitni kern z fontu se nevytvori
(viz TBN strana 103). Pokud tedy makro \uv zanecha mezi znakem a uvozovkou
nejaky povel hlavniho procesoru, mame po parade. Navic, pokud horizontalni
seznam vstupuje do druheho pruchodu pri radkovem zlomu odstavce, jsou
implicitni kerny na chvili vymazany a znovu zpetne dodany. To se v TBN
primo nepravi, ale srovnejte podobny problem s ligaturami popsany jednak
na strane 103 a dale na strane 220.

Zkuste testovat \uv{Vysledek} nekde uprostred odstavce. Pokud makro \uv
zanechava mezi levou uvozovkou a pismenem V povel hlavniho procesoru (coz
implicitne definovane makro v csplainu dela), pak se vysledek lisi podle
toho, zda seznam vstoupi ci nevstoupi do druheho pruchodu radkoveho zlomu.
Pokud nevstoupi, implicitni kern nevidime. Pokud vstoupi, implicitni kern
se objevi. To povazuji za pomerne dost nestabilni reseni. Poznamenavam, ze
kerningovy par mezi levou uvozovkou a V je v CS-fontech odjakziva, ale asi
velmi malo kdy se z duvodu chyby v makru \uv uplatnil.

Prosta a jednoducha definice \uv, ktera zachovava spravne kerningove pary,
vypada takto:

\def\uv#1{\clqq#1\crqq}

kde pro CS-fonty vypada nastaveni sekvenci \clqq a \crqq nasledovne:

\chardef\clqq=254  \sfcode254=0
\chardef\crqq=255  \sfcode255=0

Toto reseni ma tu nevyhodu, ze uzivatel nemuze pouzit verbatim konstrukci
uvnitr argumentu makra \uv, tj. napriklad \uv{toto je \verb|~| vlnka}
nefunguje.

Prave a jedine z duvodu moznych verbatim konstrukci je oficialni definice
makra \uv (ktera je zanesena do csplainu) nasledujici:

\def\uv{\bgroup\aftergroup\closequotes\leavevmode\clqq\let\next=}
\def\closequotes{\unskip\crqq\relax}

Cviceni s \aftergroup je zde udelano proto, abychom se vyhnuli nacitani
textu sevreneho do {} jako parametru a mohli v textu pozdeji analyzovat
pritomnost verbatim konstrukce. Da se sice odstranit \unskip v
\closequotes, takze jednoduseji by to vypadalo takto:

\def\uv{\leavevmode \bgroup \aftergroup\crqq \clqq \let\next=}

ale ani v tomto pripade se nevyhneme povelu hlavniho procesoru mezi levou
uvozovkou a prvnim pismenem. Timto povelem je \let, ktery je zde proto,
aby \uv{znicil} prichazejici oteviraci zavorku "{", ktera tam syntakticky
patri, ale po aplikaci \bgroup ji potrebujeme ignorovat.

Podarilo se mi najit reseni, ktere nevklada zadny povel hlavniho procesoru
mezi levou uvozovku a prvni pismeno:

\def\uv{\bgroup \aftergroup\crqq \bgroup \catcode`\{=2 \aftergroup\clqq}

ale toto reseni bohuzel vklada povel uzavreni skupiny mezi pravou uvozovku
a posledni pismeno. Az dosud to bylo jedno, protoze CS-fonty zadny
kerningovy par na pravou uvozovku neobsahoval (jen na levou uvozovku).
Bohuzel, po dnesni uprave CS-fontu toto tvrzeni uz neplati, protoze jsem
oddalil uvozovku ve dvou pripadech: \uv{nebud} \uv{labut}.

Nenapada me reseni, ktere by soucasne splnovalo tyto pozadavky:

1) Nekradlo to implicitni kerny.
2) Vyrovnalo se to s verbatim konstrukci uvnitr uvozeneho textu.

Protoze mi soukrome z duvodu stabilnosti a zpetne kompatibility pripada
dulezitejsi zachovat vlastnost 2), s makrem \uv v csplainu jsem zatim nic
nedelal. Kdo chce, aby mu makro nekradlo implicitni kerny, definuje si
\def\uv#1{\clqq#1\crqq} a da si pozor na verbatim konstrukce.

Ma nekdo napad, jak to udelat, aby byly splneny obe vlastnosti?

Predem dekuji za pripadne navrhy

Petr Olsak





More information about the csTeX mailing list