• Tidak ada hasil yang ditemukan

Export of identifiers

Dalam dokumen The Listings Package (Halaman 159-162)

\lstindexmacro

One more ‘keyword’ class.

2293h∗misci

2294\lst@BeginAspect[keywords]{index}

2295\lst@InstallFamily w{index}{indexstyle}\lstindexmacro{indexstyle}

2296 {\csname\@lst @indexstyle#1\expandafter\endcsname

2297 \expandafter{\the\lst@token}}

2298 od

2299\lst@UserCommand\lstindexmacro#1{\index{{\ttfamily#1}}}

2300\lst@EndAspect

2301h/misci

procnamestyle procnamekeys indexprocnames

The ‘idea’ here is the usage of a global\lst@ifprocname, indicating a preceding

‘procedure keyword’. All the other is known stuff.

2302h∗misci

2303\lst@BeginAspect[keywords]{procnames}

2304\gdef\lst@procnametrue{\global\let\lst@ifprocname\iftrue}

2305\gdef\lst@procnamefalse{\global\let\lst@ifprocname\iffalse}

2306\lst@AddToHook{Init}{\lst@procnamefalse}

2307\lst@AddToHook{DetectKeywords}

2308 {\lst@ifprocname

2309 \let\lst@thestyle\lst@procnamestyle

2310 \lst@ifindexproc \csname\@lst @gindex@sty\endcsname \fi

2311 \lst@procnamefalse

2312 \fi}

2313\lst@Key{procnamestyle}{}{\def\lst@procnamestyle{#1}}

2314\lst@Key{indexprocnames}{false}[t]{\lstKV@SetIf{#1}\lst@ifindexproc}

2315\lst@AddToHook{Init}{\lst@ifindexproc \lst@indexproc \fi}

2316\gdef\lst@indexproc{%

2317 \@ifundefined{lst@indexstyle1}%

2318 {\@namedef{lst@indexstyle1}##1{}}%

2319 {}}

The default definition of \lst@indexstyle above has been moved outside the hook after a bug report from Ulrich G. Wortmann.

2320\lst@InstallKeywords w{procnamekeys}{}\relax{}

2321 {\global\let\lst@PNpost\lst@procnametrue}

2322 od

2323\lst@AddToHook{PostOutput}{\lst@PNpost\global\let\lst@PNpost\@empty}

2324\global\let\lst@PNpost\@empty % init

2325\lst@EndAspect

2326h/misci

17 More aspects and keys

basicstyle inputencoding

There is no better place to define these keys, I think.

2327h∗kerneli

2328\lst@Key{basicstyle}\relax{\def\lst@basicstyle{#1}}

2329\lst@Key{inputencoding}\relax{\def\lst@inputenc{#1}}

2330\lst@AddToHook{Init}

2331 {\lst@basicstyle

2332 \ifx\lst@inputenc\@empty\else

2333 \@ifundefined{inputencoding}{}%

2334 {\inputencoding\lst@inputenc}%

2335 \fi}

2336\lst@AddToHookExe{EmptyStyle}

2337 {\let\lst@basicstyle\@empty

2338 \let\lst@inputenc\@empty}

2339\lst@Key{multicols}{}{\@tempcnta=0#1\relax\def\lst@multicols{#1}}

2340h/kerneli

Michael Niedermair asked for a key likeinputencoding.

17.1 Styles and languages

We begin with style definition and selection.

2341h∗misci

2342\lst@BeginAspect{style}

\lststylefiles This macro is defined if and only if it’s undefined yet.

2343\@ifundefined{lststylefiles}

2344 {\lst@UserCommand\lststylefiles{lststy0.sty}}{}

\lstdefinestyle

\lst@definestyle

\lst@DefStyle

are defined in terms of\lst@DefStyle, which is defined via\lst@DefDriver.

2345\lst@UserCommand\lstdefinestyle{\lst@DefStyle\iftrue}

2346\lst@UserCommand\lst@definestyle{\lst@DefStyle\iffalse}

2347\gdef\lst@DefStyle{\lst@DefDriver{style}{sty}\lstset}

The ‘empty’ style calls the initial empty hookEmptyStyle.

2348\global\@namedef{lststy@$}{\lsthk@EmptyStyle}

2349\lst@AddToHook{EmptyStyle}{}% init

style is an application of\lst@LAS. We just specify the hook and an empty argument as ‘pre’ and ‘post’ code.

2350\lst@Key{style}\relax{%

2351 \lst@LAS{style}{sty}{[]{#1}}\lst@NoAlias\lststylefiles

2352 \lsthk@SetStyle

2353 {}}

2354\lst@AddToHook{SetStyle}{}% init

2355\lst@EndAspect

2356h/misci

Now we deal with commands used in defining and selecting programming lan- guages, in particular with aliases.

2357h∗misci

2358\lst@BeginAspect{language}

\lstlanguagefiles This macro is defined if and only if it’s undefined yet.

2359\@ifundefined{lstdriverfiles}

2360 {\lst@UserCommand\lstlanguagefiles{lstlang0.sty}}{}

\lstdefinelanguage

\lst@definelanguage

\lst@DefLang

are defined in terms of\lst@DefLang, which is defined via\lst@DefDriver.

2361\lst@UserCommand\lstdefinelanguage{\lst@DefLang\iftrue}

2362\lst@UserCommand\lst@definelanguage{\lst@DefLang\iffalse}

2363\gdef\lst@DefLang{\lst@DefDriver{language}{lang}\lstset}

Now we can provide the ‘empty’ language.

2364\lstdefinelanguage{}{}

language alsolanguage

is mainly an application of \lst@LAS.

2365\lst@Key{language}\relax{\lstKV@OptArg[]{#1}%

2366 {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles

2367 \lsthk@SetLanguage

2368 {\lst@FindAlias[##1]{##2}%

2369 \let\lst@language\lst@malias

2370 \let\lst@dialect\lst@oalias}}}

Ditto, we simply don’t execute\lsthk@SetLanguage.

2371\lst@Key{alsolanguage}\relax{\lstKV@OptArg[]{#1}%

2372 {\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles

2373 {}%

2374 {\lst@FindAlias[##1]{##2}%

2375 \let\lst@language\lst@malias

2376 \let\lst@dialect\lst@oalias}}}

2377\lst@AddToHook{SetLanguage}{}% init

\lstalias Now we concentrate on aliases and default dialects. \lsta@hlanguagei$hdialecti and \lsta@hlanguagei contain the aliases of a particular dialect respectively a complete language. We’ll use a $-character to separate a language name from its

dialect. Thanks to Walter E. Brown for reporting a problem with the argument delimiter ‘[’ in a previous definition of\lstalias@.

2378\lst@UserCommand\lstalias{\@ifnextchar[\lstalias@\lstalias@@}

2379\gdef\lstalias@[#1]#2{\lstalias@b #2$#1}

2380\gdef\lstalias@b#1[#2]#3{\lst@NormedNameDef{lsta@#1}{#3$#2}}

2381\gdef\lstalias@@#1#2{\lst@NormedNameDef{lsta@#1}{#2}}

defaultdialect We simply store the dialect.

2382\lst@Key{defaultdialect}\relax

2383 {\lstKV@OptArg[]{#1}{\lst@NormedNameDef{lstdd@##2}{##1}}}

\lst@FindAlias Now we have to find a language. First we test for a complete language alias, then we set the default dialect if necessary.

2384\gdef\lst@FindAlias[#1]#2{%

2385 \lst@NormedDef\lst@oalias{#1}%

2386 \lst@NormedDef\lst@malias{#2}%

2387 \@ifundefined{lsta@\lst@malias}{}%

2388 {\edef\lst@malias{\csname\@lst a@\lst@malias\endcsname}}%

2389 \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}%

2390 {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}%

2391 \fi

Now we are ready for an alias of a single dialect.

2392 \edef\lst@temp{\lst@malias $\lst@oalias}%

2393 \@ifundefined{lsta@\lst@temp}{}%

2394 {\edef\lst@temp{\csname\@lst a@\lst@temp\endcsname}}%

Finally we again set the default dialect—for the case of a dialect alias.

2395 \expandafter\lst@FindAlias@\lst@temp $}

2396\gdef\lst@FindAlias@#1$#2${%

2397 \def\lst@malias{#1}\def\lst@oalias{#2}%

2398 \ifx\@empty\lst@oalias \@ifundefined{lstdd@\lst@malias}{}%

2399 {\edef\lst@oalias{\csname\@lst dd@\lst@malias\endcsname}}%

2400 \fi}

\lst@RequireLanguages This definition will be equivalent to\lstloadlanguages. We requested the given list of languages and load additionally required aspects.

2401\gdef\lst@RequireLanguages#1{%

2402 \lst@Require{language}{lang}{#1}\lst@FindAlias\lstlanguagefiles

2403 \ifx\lst@loadaspects\@empty\else

2404 \lst@RequireAspects\lst@loadaspects

2405 \fi}

\lstloadlanguages is the same as\lst@RequireLanguages.

2406\global\let\lstloadlanguages\lst@RequireLanguages

2407\lst@EndAspect

2408h/misci

Dalam dokumen The Listings Package (Halaman 159-162)