Podivna definice aneb jde to?

Matej Cepl cepl.m at neu.edu
Sun May 5 04:04:14 CEST 2002


Dobrý den,

půjčil jsem si dnes v knihovně Kopku, Dalyho ,,A Guide to
LaTeX2e`` (a mimochodem strašně se mi líbí -- i když jsem nebyl
z ,,LaTeX Companion``, který jsem měl půjčený asi před měsícem
vyloženě zklamaný, tahle knížka se mi líbí podstatně více;
Rybičku jsem četl už dost dávno, takže neporovnám) a při té
příležitosti jsem si vyjasnil jednu svoji záhadu a chtěl by se
s Vámi podělit o řešení (spíše, abych ušetřil čas některým
podobně tápajícím).

Když jsem si nastavoval ve svém osobním stylu Lido jako defaultní
(přes OFS), tak se mi zachtělo ještě trochu více zelegantnit
nastavení příslušných fontů, tak abych třeba místo

	\renewcommand{\rmdefault}{\OFSfamily[Lido]}}

mohl psát mnohem přehlednější a hezčí

	\newfamily{rm}{Lido}

Dlouho jsem s tím bojoval, až jsem skončil s tímto dotazem do
tohoto listu:

>> snažím se o vytvoření této definice
>> 
>> \newcommand{\newfamily}[2]{\renewcommand{\#1default}{\OFSfamily[#2]}}

Odpovědi se mi dostalo téměř okamžitě od Petra Olšáka (ale
v privátním mailu, což některé nebožáky přimělo k dalšímu
odpovídání ještě čtrnáct dní na to; přesto Ti, Štěpáne, děkuji :-)

> mám dojem, že jsi měl na mysli toto:
> 
> \newcommand{\newfamily}[2]{%
>   \expandafter\def\csname #1default\endcsname{\OFSfamily[#2]}}

Samozřejmě, že měl (jako vždycky :-) pravdu a tak se hned uvedená
definice stěhovala do mého stylu.

Když jsem ale dnes dostal Kopku, tak jsem zjistil, že by se celá
věc dala řešit ještě o poznání LaTeXovitěji (Petr mi samozřejmě
namítne, že se to vyexpanduje na jeho definici, a letmé
nahlédnutí do latex.ltx nás přesvědčí, že bude mít samozřejmě
zase pravdu, ale domnívám se, že je lepší aby se věci v LaTeXu
dělali co nejLaTeXověji -- co když milí členové LaTeX3 týmu přece
jenom vytvoří další verzi LaTeXu, ve které tuto definici ještě
nějak obohatí?), takže finální verze v mém stylu zní takto:

	\providecommand{\newfamily}[2]
	{\@namedef{#1default}{\OFSfamily[#2]}}

Je sice pravda, že makro \@namedef je interní makro LaTeXu a jako
takové by nemělo být přímo používáno, ale jak právě k tomuto
tvrdí Kopka (str. 339): ,,kdyby [tohle] makro zmizel[o], tak by
mnoho zajímavých rozšíření vytvořených přímo LaTeX týmem by
muselo být dost podstatně přepracovaných``, takže se snad na jeho
budoucí život můžeme spolehnout. (A pochopitelně, že kdyby byla
tato definice použita přímo v dokumentu, tak musí být obalena
příkazy \makeatletter a \makeatother, ale jak jsem pravil, já to
mám ve svém osobním stylovém souboru, kde se takovými věcmi
nemusím zabývat).

Doufám, že tato zpráva pobídne další lidi (a mě), aby{chom} se
začali nořit do tajů LaTeXu hlouběji (a zároveň ji pochopitelně
míním i jako poděkování Petrovi a Štěpánovi za radu).

	Veselé {La}TeXování přeji

			Matěj Cepl

-- 
Matej Cepl, cepl.m at neu.edu
138 Highland Ave. #10
Somerville, Ma 02143
(617) 623-1488







More information about the csTeX mailing list