\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