[cstex] Ještě jeden problém s \_

Zdenek Wagner zdenek.wagner at gmail.com
Wed Aug 26 19:03:03 CEST 2009


2009/8/26 "Procházka Lukáš Ing. - Pontex s. r. o." <LPr at pontex.cz>:
> ... Jak Vašemu řešení rozumím (a čemu ne):
>
> 1)
>
> {\catcode`\_=13 \expandafter}\expandafter\def\noexpand_{\MyUnderscore}
>
> - Předefinuje makro "\_" tak, že se při použití rozvine na \MyUnderscore.
> (Našel jsem též v TBN na str. 46.)
>
> 2)
>
> \def\backslashed{\let\MyUnderscore\_}
> \def\uLetter{\let\MyUnderscore_}
>
> - Jsou makra, která - až budou volána - nastaví (ztotožní) \MyUnderscore na
> makro "\_" nebo znak "_".
>
> 3) V "\doLOF" se před voláním \section volá \backslashed, čímž se z
> \MyUnderscore stane ekvivalent "\_".
>
> Ale nerozumím: \MyUnderscore se dále nikde nepoužije (nevolá se - nikde dále
> není žádné \MyUnderscore), tak proč se vlastně přenastavuje pomocí \let?
>
Makro \LOF nemá žádné parametry, jen otevře skupinu, změní kategorii
podtržítka na 13 (aktivní znak) a zavolá \doLOF. Makro \doLOF má dva
parametry (jako Vaše původní LOF}. Makro nejdříve zavře skupinu, čímž
se kategorie podtržítka vrátí na původní hodnotu. V tomto okamžiku
jsou již parametry načteny, takže podtržítka v nich obsažená mají
kategorii 13. V \section se tedy expanduje aktivní podtržítko na
\MyUnderscore, které je ztotožněno s robustním makrem \_. Před voláním
\VerbatimInput je ztotožněno s obyčejným lomítkem (teď si uvědomuji,
že skupina kolem \VerbatimInput je nadbytečná).

> 4) V "doLOF" se před voláním \Verbatiminput volá \uLetter, čímž se z
> \MyUnderscore stane ekvivalent "_".
>
> A analogická otázka jako v bodě 3).
>
> 5) Ještě sem zkoušel zahrnout (ve snaze pochopit Vaše makra - "co jak musí
> být") \doLOF přímo do \LOF - nějak takhle:
>
> \def\LOF#1#2{\begingroup \catcode`\_=13 \endgroup \backslashed
> \section{#1}\begingroup
>              \uLetter \VerbatimInput{#2/#1}\endgroup}
>
> - To nefunguje. Ale proč?
>
Protože \LOF načte parametry s původní kategorií podtržítka.

> Ještě drobné sloučení, které také funguje, ale otázky zůstávají:
>
> \def\LOF{\begingroup \catcode`\_=13 \doLOF}
> \def\doLOF#1#2{\endgroup
>              \let\MyUnderscore\_ %\backslashed
>              \section{#1}\begingroup
>              \let\MyUnderscore_ %\uLetter
>              \VerbatimInput{#2/#1}\endgroup}
>
Zde jste jen provedl jeden krok expanze místo TeXu. Pro můj mozek je
přehlednější, když některá makra definuji mimo, někdy jsou dokonce
opakovaně použitelná, takže je nemusím pořád přepisovat. Záleží na
Vašem vkusu.
>
> Děkuji za trpělivost.
>
> Zdravím
>
> Lukáš Procházka
>
>
> Zdenek Wagner wrote:
>>
>> 2009/8/26 "Procházka Lukáš Ing. - Pontex s. r. o." <LPr at pontex.cz>:
>>
>>>
>>> ... I mně to funguje - mnohokrát děkuji.
>>>
>>> Zhruba rozklíčovávám, jak Vaše makro pracuje (asi mě to dost obohatí,
>>> jestli
>>> je pochopím beze zbytku). Sám bych jej dohromady nedal.
>>>
>>>
>>
>> Základ je, že se vše musí expandovat ve správném okamžiku. To mě učil
>> v mých začátcích v roce 1992 Phil Taylor. Trik s \expandafter je z
>> TBN, díky tomu nepotřebuji globální definici, protože v některých
>> situacích je \gdef nežádoucí.
>>
>>
>>>
>>> S přáním hezkého zbytku dne
>>>
>>> Lukáš Procházka
>>>
>>>
>>>
>>> Zdenek Wagner wrote:
>>>
>>>>
>>>> 2009/8/26 "Procházka Lukáš Ing. - Pontex s. r. o." <LPr at pontex.cz>:
>>>>
>>>>
>>>>>
>>>>> Dobrý den,
>>>>>
>>>>> řeším ještě jeden problém s interpretací znaku "_".
>>>>>
>>>>> Pokouším se vyrobit makro:
>>>>>
>>>>> \def\LOF#1#2{\subsubsection*{Výpis souboru #1:}\VerbatimInput{#2/#1}}
>>>>>
>>>>> Tj. takové, které napíše jakýsi napdpis "Výpis souboru:" a potom jej
>>>>> vylistuje pomocí \Verbatiminput (fancyvrb.sty).
>>>>>
>>>>> Paramtery, které se předávají, je #1 - jméno souboru, #2 - cesta k
>>>>> němu.
>>>>>
>>>>>
>>>>>
>>>>
>>>> \documentclass{article}
>>>> \usepackage{fancyvrb}
>>>> \def\LOF{\begingroup \catcode`\_=13 \doLOF}
>>>> \def\doLOF#1#2{\endgroup \backslashed \section{#1}\begingroup
>>>>   \uLetter \VerbatimInput{#2/#1}\endgroup}
>>>> {\catcode`\_13
>>>> \expandafter}\expandafter\def\noexpand_{\MyUnderscore}
>>>> \def\backslashed{\let\MyUnderscore\_}
>>>> \def\uLetter{\let\MyUnderscore_}
>>>> \begin{document}
>>>> \LOF{a_b.txt}{./}
>>>> \end{document}
>>>>
>>>> Tohle mi funguje.
>>>>
>>>>
>>>>
>>>>>
>>>>> Problém ovšem je, že jménem souboru je "_Bm1.bat" (a cesta např.
>>>>> "C:\Test\Be-v12"), takže volání:
>>>>>
>>>>> \LOF{_Bm1.bat}{C:/Test/Be-12} kolabuje s hláškou:
>>>>>
>>>>> ! Missing $ inserted.
>>>>> <inserted text>
>>>>>             $
>>>>> l.89  }
>>>>>
>>>>> Podobně \LOF{\_Bm1.bat}{C:/Test/Be-12} nefunguje:
>>>>>
>>>>> ! FancyVerb Error:
>>>>>  No verbatim file X:/Users/LPr/Public/Beam.1-3/../\protect \unhbox
>>>>> \voidb at x
>>>>> \k
>>>>> ern .06em\vbox {\hrule width.3em}Bm1.bat
>>>>> .
>>>>> \FV at Error ... {FancyVerb Error:
>>>>> \space \space #1
>>>>> }
>>>>>
>>>>> l.89  }
>>>>>
>>>>> Zkrátka - kvůli \section potřebuji předávat \_Bm1.bat, kvůli
>>>>> \Verbatiminput
>>>>> _Bm1.bat.
>>>>>
>>>>> Podotýkám, že znak "_" (i "-" kvůli \shorthandoff{-}) se nemusí
>>>>> vyskytovat
>>>>> pouze na prvním místě, ale kdekoli ve jméně souboru nebo cesty.
>>>>>
>>>>> Neřešil někdy někdo podobný problém? Jak to vyřešit?
>>>>>
>>>>> Zdravím
>>>>>
>>>>> Lukáš Procházka
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> csTeX mailing list
>>>>> csTeX at cs.felk.cvut.cz
>>>>> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>> _______________________________________________
>>> csTeX mailing list
>>> csTeX at cs.felk.cvut.cz
>>> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>>>
>>>
>>>
>>
>>
>>
>>
>
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>
>



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



More information about the csTeX mailing list