[cstex] CSBabel -- problém se znakem "-" v konfiguraci parametru "pdfpages"

Petr Tesarik petr at tesarici.cz
Fri Dec 19 14:54:48 CET 2008


On Thu, Dec 18, 2008 at 06:23:52PM +0100, Petr Tesarik wrote:
> On Thu, Dec 18, 2008 at 05:41:08PM +0100, Petr Tesarik wrote:
> > On Thu, Dec 18, 2008 at 05:05:38PM +0100, Petr Tesarik wrote:
> > > On Sun, Dec 14, 2008 at 12:44:25PM +0100, Michal Růžička wrote:
> > > > Dobrý den,
> > > > 
> > > > v TeXLive 2008 (kde je již obsažen nový CSBabel) jsem při sazbě LaTeXem
> > > > narazil na problém se znakem "-" v kombinaci s balíkem "pdfpages".
> > > > Konkrétně následující zdrojový text nefunguje:
> > > > 
> > > >   \documentclass{article}
> > > >   \usepackage[czech]{babel}
> > > >   \usepackage[latin2]{inputenc}
> > > >   \usepackage[T1]{fontenc}
> > > >   \usepackage{pdfpages}
> > > > 
> > > >   \begin{document}
> > > >       Následující stránky dokumentu jsou obsahem souboru
> > > >       \emph{sample2e.pdf}.
> > > > 
> > > >       \includepdf[pages=-]{sample2e.pdf} % Vloží všechny stránky ze
> > > >                                          % souboru "sample2e.pdf".
> > > >   \end{document}
> > > > 
> > > > Pokud zakomentuji řádek "\usepackage[czech]{babel}", vše funguje jak
> > > > má. Usoudil jsem tedy, že jde o problém CSBabelu.
> > > 
> > > Ano, je to určitě problém Babelu. Mimochodem, k projevení chyby stačí už
> > > výše uvedená preambule, tj. minimální testovací případ je:
> > > 
> > > \documentclass{article}
> > > \usepackage[czech]{babel}
> > > \usepackage{pdfpages}
> > > 
> > > \begin{document}
> > > \end{document}
> > 
> > No, úplně minimální dokument je, zdá se:
> > 
> > \documentclass{article}
> > \usepackage[czech]{babel}
> > 
> > \AtBeginDocument{\Input{supp-pdf}{}{}}
> > 
> > \begin{document}
> > \end{document}
> 
> Hm, tak jsem to našel. Ale po pravdě řečeno moc nevím, co s tím. Babel
> definuje aktivní znaky dosti nešikovně:
> 
> \active at prefix -\normal at char-
> 
> přičemž \active at prefix#1 expanduje na:
> 
> \ifx \protect \@typeset at protect
> \else \ifx \protect \@unexpandable at protect
>   \bbl at afterelse
>   \bbl at afterfi
>     \noexpand #1\@gobble
>   \else
>     \bbl at afterfi
>     \bbl at afterfi
>   \protect #1
>   \@gobble
> \fi \fi
> 
> Jenomže supp-mis.tex si definuje vlastní (zcela nekompatibilní) makro
> jménem \protect, a tím se to rozbije.
> 
> Varianty jsou tři:
> 
>   1. předělat pdfpages (a zbytek toho balíku), aby používal jiné jméno
>      než \protect
>   2. předělat Babelovské makro tak, aby nespoléhalo na definici \protect
>   3. přidat další bastl do supp-mis, který mění i kategorii znaku -
> 
> Vidím následující problémy:
> 
> 1. Myslím, že to jméno makra není náhodné a ConTeXt ho používá právě
>    v tom smyslu. Pro LaTeX je to jenom přizpůsobené.
>    I tak samozřejmě lze definovat nové makro, které expanduje buď na
>    \protect (v ConTeXtu) nebo na tu vlastní definici (v LaTeXu).
>    U Hanse Hagena by to mohlo být na jednu stranu průchodné, protože
>    by pak mohl vyházet taková krásná makra jako \StartLatexHack a
>    \StopLatexHack, na druhou stranu myslím, že by to musel změni na
>    příliš mnoha místech a LaTeX ho asi zas tolik nepálí.
> 
> 2. Nevím jak.
> 
> 3. To mluví samo za sebe -- až zase někdo zaktivní nějaký další znak,
>    tak to může předělávat znova. Je to zkrátka oprava na špatném místě.
>    Zato je nejrychlejší.
> 
> Nejdřív bych se zkusil zamyslet nad variantou 2, především nad tím,
> proč i při deaktivované funkci spojovníku se musí zkoumat definice
> \protect.

Zdá se, že problém je mnohem rozsáhlejší. Babel aktivuje znaky v rámci
\AtBeginDocument. To s sebou přináší řady problémů.

Za prvé, všechny definice z explicitně načtených stylů se provádějí
s neaktivní kategorií znaku. To znamená, že po aktivaci znaku (tj. po
\begin{document}) se používá jiný znak než při definici. To vadí např.
balíku pdfpages, protože pokud je makro \includepdf definováno
s neaktivním znakem '-̈́', tak potom není schopné správně zpracovat
argument [pages=-], kde ten spojovník je aktivní.

Ergo, pdfpages je třeba načíst s aktivní definicí '-'.

Aby to ale nebylo tak jednoduché, jiné balíky naopak s aktivní definicí
znaku nefungují správně, např. calc. Může za to makro \calc at post@scan,
které porovnává svůj parametr se znakem '-' takto:

	\ifx#1-

Nevím proč, ale tohle je pravda, pokud je při definici makra nastavena
kategorie znaku '-' na 12 a při volání na 12 nebo na 13, zatímco když
je při definici makra nastavena kategorie znaku '-' na 13, tak je to
nepravda.

Ergo, calc je třeba načíst s neaktivní definicí '-'.

Jako bonbónek je pak třeba přidat, že pdfpages některé balíky načítá až
při \begin{document}, tj. pokud je uveden \usepackage{pdfpages} až po
Babelu, tak se pro takto načtené balíky použije aktivní definice '-'.

Jinými slovy, následující sekvence načte calc.sty s aktivním '-':

\usepackage{pdfpages}
\begin{document}

Zatímco tato sekvence s neaktivním '-':

\usepackage{calc}
\usepackage{pdfpages}
\begin{document}

Prostě babylónské zmatení, jak má být.

Podle mne je to chyba Babelu. Nasvědčují tomu i makra a poznámky
v supp-mis.tex:

\def\StartLatexHack
[...]

%D This hack is needed especially for \LATEX\ users who use
%D the Babel package. The Germans have active \type {"}'s, the
%D Poles have \type {/}, while the French have \type {:} and
%D \type {;} defines as command (thanks to Daniel Flipo for
%D pointing that out and testing). Potentially active \type
%D {?}'s and \type {!}'s are less dangerous since they are
%D handled by the \type {\protect} and \type {\unprotect}
%D macros.

Copak je záměrem, aby všechny balíky přidávaly podobný balast kvůli
potenciálně aktivním znakům?

Petr Tesařík



More information about the csTeX mailing list