[cstex] Znak # a výstup do indexu

Petr Olsak petr at olsak.net
Tue Sep 8 16:21:57 CEST 2009


On Tue, 8 Sep 2009, "Procházka Lukáš Ing. - Pontex s. r. o." wrote:

> Zdravím v konferenci,
>
> mám dotaz. Snažím se vymyslet makro, které by přijalo parametr, ten vypsalo a 
> zároveň zapsalo položku do indexu. Problém je, že parametr obsahuje znak(y) # 
> - podobně jako např. v C direktiva #include. Makro se má jmenovat \DIREC a má 
> se použít stylem \DIREC{#include}, tj. cílem je nepsat znak \ před # (tedy ne 
> \DIREC{\#include}).
>
> Pokud je # pouze na začátku, problém by se dal vyřešit tak, že bych předával 
> parametr bez úvodního #, ten by si přidávalo až samo makro.
>
> Ale pokud je uvnitř?
>
> Zkouším něco v tomto duchu (hodně použit kód pana Wagnera z některé z 
> minulých diskusí):
>
> \documentclass{article}
> \usepackage{index}
> \newindex{default}{idx}{ind}{}
> \begin{document}
>  \def\DIREC{\bgroup\catcode`\#=12 \doDIREC}
>  \def\doDIREC#1{\egroup\texttt{#1}\index{#1}}
> \DIREC{#include}
> \printindex
> \end{document}
>
> Výpis do .pdf je OK, ale zápis v .idx má zdvojený znak #:
>
> \indexentry {##include}{1}
>
> A to zdvojení # se snažím odstranit - to pak (samozřejmě) vadí při načtení 
> indexu.

Dobry den,

problemy jsou dva.

1. Jakmile TeX narazi na znak kategorie 6 (tj. typicky #) v seznamu tokenu 
a je povinnen tento seznam tokenu vypsat na terminal nebo do souboru 
pomoci \write, tak tento znak zdvoji. Vyzkousejte si: \message{a:#} nebo
\immediate\write0{b:#}. Je to dusledek tretiho radku ve zdrojovem kodu 
TeXu v paragrafu 294 (unitr rutiny show_token_list). Abych pravdu rekl, 
nepodarilo se mi tuto vlastnost najit zdokumentovanou v TeXbooku, ale 
pozorni ctenari tohoto listu ji tam urcite najdou a pripadne me doplni.

2. LaTeX pracuje tak, ze si uklada obsahy parametru \index do souboru.aux 
a ten pak na konci znovu precte. V souboru je pak napriklad psano:
\@writefile{default}{\indexentry{#include}{13}}
Tento soubor nacte LaTeX na konci zpracovani (v okamziku \end{document}). 
V tu chvili uz je \catcode`\#=6, takze se tokenizuje dany radek s 
kategorii 6 a pri tisku do souboru se dle odstavce 1 ten kriz zdvoji.

Pomuze tesne pred \end{document} napsat \catcode`\#=12, tedy dokument 
uzavrit konstatovanim:

\catcode`\#=12 \end{document}

Nevim zcela jiste, zda to nenaboura nejake dalsi predpoklady, ktere 
nektere LaTeXove balicky mohou mit, tj. zda to bude fungovat za vsech 
okolnosti. Ale v zasade by to fungovat melo.

Zdravim

Petr Olsak


More information about the csTeX mailing list