[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