diff options
author | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-01-12 17:15:07 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2016-01-12 17:15:07 +0100 |
commit | 8d8d528d2ad52599f11250cfc567fea4f37f2a8b (patch) | |
tree | 94286bc131ef7d994f9432febaf03fe23d10eef8 /tex/context/base/verb-ini.mkii | |
parent | f5aed2e51223c36c84c5f25a6cad238b2af59087 (diff) | |
download | context-8d8d528d2ad52599f11250cfc567fea4f37f2a8b.tar.gz |
2016-01-12 16:26:00
Diffstat (limited to 'tex/context/base/verb-ini.mkii')
-rw-r--r-- | tex/context/base/verb-ini.mkii | 1789 |
1 files changed, 0 insertions, 1789 deletions
diff --git a/tex/context/base/verb-ini.mkii b/tex/context/base/verb-ini.mkii deleted file mode 100644 index 5a817b4bb..000000000 --- a/tex/context/base/verb-ini.mkii +++ /dev/null @@ -1,1789 +0,0 @@ -%D \module -%D [ file=verb-ini, -%D version=1997.12.22, -%D title=\CONTEXT\ Verbatim Macros, -%D subtitle=Initialization, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D Today I would implement the pretty handler slightly -%D different, using stack and intermediate flushing. Maybe -%D even without active chars. So, someday \unknown. Also -%D I think that there are better ways (the current approach -%D is an accumulation; for instance, we could save a second -%D argument by turning chars into numbers and vise versa. - -%D Because this module is quite independant of system macros, -%D it can be used as a stand||alone verbatim environment. -%D -%D This is a sort of second release of \type{supp-ver} and -%D therefore differs in some aspects from the implementation -%D published in the \MAPS. The first change concern -%D optimization of breaks, that is, the first and last two -%D lines of verbatim blocks are kept together. The second -%D adaption is due to the fact that I wanted to support pretty -%D printing not only for \TEX\ sources, but also for \PERL, -%D \METAPOST\ and probably more. The \JAVASCRIPT\ module is -%D closely related to \PERL, so we will not mention that one -%D again. - -\ifx \undefined \writestatus \input supp-mis.tex \fi - -%D Verbatim typesetting, especially of \TEX\ sources, is a -%D non||trivial task. This is a direct results of the fact that -%D characters can have \CATCODES\ other than~11 and such -%D characters needs a special treatment. What for instance is -%D \TEX\ supposed to do when it encounters a \type{$} or an -%D \type{#}? This module deals with these matters. - -\writestatus{loading}{ConTeXt Verbatim Macros / Initialization} - -%D The verbatim environment has some features, like coloring -%D \TEX\ text, seldom found in other environments. Especially -%D when the output of \TEX\ is viewed on an electronic medium, -%D coloring has a positive influence on the readability of -%D \TEX\ sources, so we found it very acceptable to dedicate -%D half of this module to typesetting \TEX\ specific character -%D sequences in color. In this module we'll also present some -%D macro's for typesetting inline, display and file verbatim. -%D The macro's are capable of handling \TAB\ too. -%D -%D This module shows a few tricks that are often overseen by -%D novice, like the use of the \TEX\ primitive \type{\meaning}. -%D First I'll show in what way the users are confronted with -%D verbatim typesetting. Because we want to be able to test for -%D symmetry and because we hate the method of closing down the -%D verbatim mode with some strange active character, we will -%D use the following construction for display verbatim: -%D -%D \starttyping -%D The Dutch word 'typen' stands for 'typing', therefore in the Dutch version -%D one will not find the word 'verbatim'. -%D \stoptyping -%D -%D In \CONTEXT\ files can be typed with \type{\typefile} and -%D inline verbatim can be accomplished with \type{\type}. This -%D last command comes in many flavors: -%D -%D \starttyping -%D We can say \type<<something>> or \type{something}. The first one is a bit -%D longer but also supports slanted typing, which accomplished by typing -%D \type<<a <<slanted>> word>>. We can also use commands to enhance the text -%D \type<<with <</bf boldfaced>> text>>. Just to be complete, we decided -%D to accept also \LaTeX\ alike verbatim, which means that \type+something+ -%D and \type|something| are valid commands too. Of course we want the grouped -%D alternatives to process \type{hello {\bf big} world} with braces. -%D \stoptyping -%D -%D In the core modules, we will build this support on top of -%D this module. There these commands can be tuned with -%D accompanying setup commands. There we can enable commands, -%D slanted typing, control spaces, \TAB||handling and (here we -%D are:) coloring. We can also setup surrounding white space -%D and indenting. Here we'll only show some examples. - -\unprotect - -%D \macros -%D {verbatimfont} -%D -%D When we are typesetting verbatim we use a non||proportional -%D (mono spaced) font. Normally this font is available by -%D calling \type{\tt}. In \CONTEXT\ this command does a -%D complete font||style switch. There we could have stuck with -%D \type{\tttf}. - -\ifx\verbatimfont\undefined \def\verbatimfont{\tt\normalnoligatures\font} \fi - -\ifx\normalnoligatures\undefined \let\normalnoligatures\gobbleoneargument \fi - -%D \macros -%D {obeyedspace, obeyedtab, obeyedline, obeyedpage} -%D -%D We have followed Knuth in naming macros that make \SPACE, -%D \NEWLINE\ and \NEWPAGE\ active and assigning them -%D \type{\obeysomething}, but first we set some default values. - -\def\obeyedspace {\hbox{ }} -\def\obeyedtab {\obeyedspace} -\def\obeyedline {\par} -\def\obeyedpage {\vfill\eject} - -%D Because we will introduce a status variable, we can define -%D a better \type {\obeyedspace}. - -\def\obeyedspace {\ifprocessingverbatim\hbox{ }\else\space\fi} - -%D \macros -%D {controlspace,setcontrolspaces} -%D -%D First we define \type{\obeyspaces}. When we want visible -%D spaces (control spaces) we only have to adapt the definition -%D of \type{\obeyedspace} to: - -\def\controlspace{\hbox{\char32}} -\def\normalspace { } -\def\normalspaces{\catcode`\ =\@@space} - -\bgroup -\catcode`\ =\@@active -\gdef\obeyspaces{\catcode`\ =\@@active\def {\obeyedspace}} -\gdef\setcontrolspaces{\catcode`\ =\@@active\def {\controlspace}} -\egroup - -%D \macros -%D {obeytabs, obeylines, obeypages, -%D ignoretabs, ignorelines, ignorepages} -%D -%D Next we take care of \NEWLINE\ and \NEWPAGE\ and because we -%D want to be able to typeset listings that contain \TAB, we -%D have to handle those too. Because we have to redefine the -%D \NEWPAGE\ character locally, we redefine the meaning of -%D this (often already) active character. - -\catcode`\^^L=\@@active \def^^L{\par} - -%D The following indirect definitions enable us to implement -%D all kind of \type{\obeyed} handlers. - -\bgroup - -\catcode`\^^I=\@@active -\catcode`\^^M=\@@active -\catcode`\^^L=\@@active - -\gdef\obeytabs {\catcode`\^^I=\@@active\def^^I{\obeyedtab}} -\gdef\obeylines {\catcode`\^^M=\@@active\def^^M{\obeyedline}} -\gdef\obeypages {\catcode`\^^L=\@@active\def^^L{\obeyedpage}} - -\gdef\ignoretabs {\catcode`\^^I=\@@active\def^^I{\obeyedspace}} -\gdef\ignorelines {\catcode`\^^M=\@@active\def^^M{\obeyedspace}} -\gdef\ignorepages {\catcode`\^^L=\@@ignore} % \@@active\def^^L{\obeyedline}} -\gdef\ignoreeofs {\catcode`\^^Z=\@@ignore} - -%D For testing (see digit parser) we need an indirect macro -%D in order to compare the next (\type {\next}) token -%D (possibly \type {^^M}) being \type {\obeyedline}. - -\gdef\nextobeyedline{\obeyedline} - -\egroup - -%D \macros -%D {obeycharacters} -%D -%D We also predefine \type{\obeycharacters}, which will -%D enable us to implement character||specific behavior, like -%D colored verbatim. - -\let\obeycharacters=\relax - -%D \macros -%D {settabskips} -%D -%D The macro \type{\settabskip} can be used to enable tab -%D handling. Processing tabs is sometimes needed when one -%D processes a plain \ASCII\ listing. Tab handling slows down -%D verbatim typesetting considerably. - -\bgroup - -\catcode`\^^I=\@@active - -\gdef\settabskips - {\let\processverbatimline\doprocesstabskipline - \catcode`\^^I\@@active - \let^^I\doprocesstabskip} - -\gdef\setfixedtabskips#1% - {\catcode`\^^I\@@active - \def^^I{\kern#1\spaceskip}} - -\egroup - -%D \macros -%D {processingverbatim} -%D -%D Typesetting a file in most cases results in more than one -%D page. Because we don't want problems with files that are -%D read in during the construction of the page, we set \type -%D {\ifprocessingverbatim}, so the output routine can adapt -%D its behavior. Originally we used \type {\scratchread}, but -%D because we want to support nesting, we decided to use a -%D separate input file. - -\newif\ifprocessingverbatim - -%D \macros -%D {processinlineverbatim} -%D -%D Although the inline verbatim commands presented here will be -%D extended and embedded in the core modules of \CONTEXT, -%D they can be used separately. Both grouped and character -%D alternatives are provided but \type{<<} and nested -%D braces are implemented in the core module. This commands -%D takes one argument: the closing command. -%D -%D \starttyping -%D \processinlineverbatim{\closingcommand} -%D \stoptyping -%D -%D One can define his own verbatim commands, which can be very -%D simple: -%D -%D \starttyping -%D \def\Verbatim {\processinlineverbatim\relax} -%D \stoptyping -%D -%D or a bit more more complex: -%D -%D \starttyping -%D \def\GroupedVerbatim% -%D {\bgroup -%D \dosomeusefullthings -%D \processinlineverbatim\egroup} -%D \stoptyping -%D -%D Before entering inline verbatim mode, we take care of the -%D unwanted \TAB, \NEWLINE\ and \NEWPAGE\ characters and -%D turn them into \SPACE. We need the double \type{\bgroup} -%D construction to keep the closing command local. - -\def\setverbatimspaceskip - {\setbox\scratchbox\hbox{x}% - \spaceskip\wd\scratchbox - \xspaceskip\spaceskip} - -\def\setupinlineverbatim - {\verbatimfont - \setverbatimspaceskip - \let\obeytabs\ignoretabs - \let\obeylines\ignorelines - \let\obeypages\ignorepages - \setupcopyverbatim} - -\def\doprocessinlineverbatim - {\ifx\next\bgroup - \setupinlineverbatim - \catcode`\{\@@begingroup - \catcode`\}\@@endgroup - \def\next{\let\next=}% - \else - \setupinlineverbatim - \def\next##1{\catcode`##1=\@@endgroup}% - \fi - \next} - -\def\processinlineverbatim#1% - {\bgroup - \processingverbatimtrue - \localcatcodestrue % TeX processes paragraph's - \def\endofverbatimcommand{#1\egroup}% - \bgroup - \aftergroup\endofverbatimcommand - \futurelet\next\doprocessinlineverbatim} - -%D The closing command is executed afterwards as an internal -%D command and therefore should not be given explicitly when -%D typesetting inline verbatim. - -%D \macros -%D {optimizeverbatim} -%D -%D One day, a collegue asked me why I didn't prevent breaking -%D after a first or before a last verbatim line. At first sight -%D I thought of using the two pass mechanism, but because we're -%D already keeping track of individual lines, a more direct -%D solution is possible: we just keep track of in what line -%D we are. One can turn this feature off. - -\newif\ifoptimizeverbatim \optimizeverbatimtrue - -%D Before we implement display and file verbatim, we define -%D some macros that deal with typesetting the individual lines. -%D We keep track of the status by means of a character -%D specification. This status variable tells us if we're -%D skipping a first line or placing a first or last line. -%D The next few examples show us where breaks are inserted. -%D -%D \bgroup -%D -%D \def\doverbatimnobreak -%D {\nobreak\hrule width 10cm\par\penalty500} % == \nobreak -%D -%D \def\doverbatimgoodbreak -%D {\nobreak\hrule width 3cm \par\penalty\linepenalty} -%D -%D \starttyping -%D test -%D test -%D \stoptyping -%D -%D or -%D -%D \starttyping -%D test -%D test -%D test -%D test -%D \stoptyping -%D -%D or -%D -%D \starttyping -%D test -%D -%D test -%D test -%D test -%D \stoptyping -%D -%D \egroup -%D -%D The long ones are \type{\nobreaks} and the short ones -%D \type{\goodbreaks}. And this is how it's done: - -\def\doverbatimnobreak - {\ifoptimizeverbatim\penalty500 \fi} - -\def\doverbatimgoodbreak - {\ifoptimizeverbatim\penalty\linepenalty\fi} - -\def\doflushverbatimline - {\expandafter\dodoverbatimline\expandafter{\savedverbatimline}} - -\def\doverbatimbeginofline#1% linenumber (optional provided by mkiv / todo) - {\dontleavehmode - \strut - \the\everyline} - -\def\doverbatimendofline - {\par} - -\def\doverbatimemptyline - {\strut - \par} - -\let\handleverbatimline=\relax - -% \def\initializeverbatimline% -% {\global\let\savedverbatimline=\empty -% \ifskipfirstverbatimline -% \global\chardef\verbatimstatus=0 -% \else -% \global\chardef\verbatimstatus=1 -% \fi} -% -% more efficient - -\global\chardef\verbatimstatus0 - -\def\initializeverbatimline - {\global\let\savedverbatimline\empty - \global\chardef\verbatimstatus\ifskipfirstverbatimline0 \else1 \fi} - -\chardef\verbatimemptylinemode\zerocount - -\def\presetemptyverbatimline - {\ifcase\verbatimstatus - \global\chardef\verbatimstatus\plusone - \or - \ifcase\verbatimemptylinemode\or\or - \doemptyverbatimline - \fi - \or - \ifcase\verbatimemptylinemode\else - \doemptyverbatimline - \fi - \or - \doflushverbatimline - \global\let\savedverbatimline\empty - \doemptyverbatimline - \global\chardef\verbatimstatus\plustwo - \else - \kern\zeropoint - \doverbatimnobreak - \doflushverbatimline - \global\let\savedverbatimline\empty - \doemptyverbatimline - \global\chardef\verbatimstatus\plustwo - \fi} - -\def\presetnormalverbatimline - {\ifcase\verbatimstatus - \global\chardef\verbatimstatus\plustwo - \or - \global\chardef\verbatimstatus\plusthree - \or - \global\chardef\verbatimstatus\plusthree - \or - \doflushverbatimline - \global\chardef\verbatimstatus\plusfour - \or - \kern\zeropoint - \doverbatimnobreak - \doflushverbatimline - \global\chardef\verbatimstatus\plusfive - \or - \doverbatimgoodbreak - \doflushverbatimline - \fi - \global\let\savedverbatimline\verbatimline} - -\def\presetlastverbatimline - {\ifcase \verbatimstatus - \or - \or - \or - \doflushverbatimline - \else - \kern \zeropoint - \doverbatimnobreak - \doflushverbatimline - \fi - \ifcase\verbatimemptylinemode\or\else - \kern \zeropoint - \fi} - -%D \macros -%D {skipfirstverbatimline} -%D -%D By default the rest of the first line is ignored. We can -%D turn this feature off by saying: -%D -%D \starttyping -%D \skipfirstverbatimlinefalse -%D \stoptyping - -\newif\ifskipfirstverbatimline \skipfirstverbatimlinetrue - -%D \macros -%D {processdisplayverbatim} -%D -%D We can define a display verbatim environment with the -%D command \type{\processdisplayverbatim} in the following way: -%D -%D \starttyping -%D \processdisplayverbatim{\closingcommand} -%D \stoptyping -%D -%D \noindent For instance, we can define a simple command like: -%D -%D \starttyping -%D \def\BeginVerbatim {\processdisplayverbatim{EndVerbatim}} -%D \stoptyping -%D -%D \noindent But we can also do more advance things like: -%D -%D \starttyping -%D \def\BeginVerbatim {\bigskip \processdisplayverbatim{\EndVerbatim}} -%D \def\EndVerbatim {\bigskip} -%D \stoptyping -%D -%D When we compare these examples, we see that the backslash in -%D the closing command is optional. One is free in actually -%D defining a closing command. If one is defined, the command -%D is executed after ending verbatim mode. - -\def\processdisplayverbatim#1% - {\par - \bgroup - \escapechar=-1 - \xdef\verbatimname{\string#1}% - \egroup - \def\endofdisplayverbatim{\csname\verbatimname\endcsname}% - \bgroup - \parindent\zeropoint - \ifdim\lastskip<\parskip - \removelastskip - \vskip\parskip - \fi - \parskip\zeropoint - \processingverbatimtrue - \global\linepartrue - \expandafter\let\csname\verbatimname\endcsname\relax - \edef\endofverbatimcommand{\csname\verbatimname\endcsname}% - \edef\endofverbatimcommand{\meaning\endofverbatimcommand}% - \verbatimfont - \setverbatimspaceskip - \global\linepartrue % needed for paragraph numbering - \setupcopyverbatim - \initializeverbatimline - \copyverbatimline} - -%D We save the closing sequence in \type{\endofverbatimcommand} -%D in such a way that it can be compared on a line by line -%D basis. For the conversion we use \type{\meaning}, which -%D converts the line to non||expandable tokens. We reset -%D \type{\parskip}, because we don't want inter||paragraph -%D skips to creep into the verbatim source. Furthermore we -%D \type{\relax} the line||processing macro while getting the -%D rest of the first line. The initialization command -%D \type{\setupcopyverbatim} does just what we expect it to do: -%D it assigns all characters \CATCODE~11. Next we switch to -%D french spacing and call for obeyance. - -\newevery \everysetupverbatim \relax - -\def\setupcopyverbatim - {\uncatcodecharacters - \frenchspacing - \obeyspaces - \obeytabs - \obeylines - \obeypages - \obeycharacters - \the\everysetupverbatim} - -%D The main copying routine of display verbatim does an -%D ordinary string||compare on the saved closing command and -%D the current line. The space after \type{#1} in the -%D definition of \type{\next} is essential! As a result of -%D using \type{\obeylines}, we have to use \type{%}'s after -%D each line but none after the first \type{#1}. - -{\obeylines% - \long\gdef\copyverbatimline#1 - {\def\next{#1 }% - \gdef\verbatimline{#1}% - \ifx\next\emptyspace% - \presetemptyverbatimline% - \else% - \edef\next{\meaning\next}% - \ifx\next\endofverbatimcommand% - \presetlastverbatimline% - \def\copyverbatimline{\egroup\endofdisplayverbatim}% - \else% - \presetnormalverbatimline% - \fi% - \fi% - \handleverbatimline% - \copyverbatimline}} - -%D The actual typesetting of a line is done by a separate -%D macro, which enables us to implement \TAB\ handling. The -%D \type{\do} and \type{\dodo} macros take care of the -%D preceding \type{\parskip}, while skipping the rest of the -%D first line. The \type{\relax} is used as an signal. - -%D \macros -%D {iflinepar} -%D -%D A careful reader will see that \type{\linepar} is reset. -%D This boolean can be used to determine if the current line is -%D the first line in a pseudo paragraph and this boolean is set -%D after each empty line. The \type{\relax} can be used to -%D determine the end of the line when one implements a scanner -%D routine. - -\newif\iflinepar - -\let\doopenupverbatimline=\empty - -\let\beginverbatimline\relax -\let\endverbatimline \relax - -\long\def\dodoverbatimline#1% we don't want to group - {\bgroup % due to pretty status - \iflinepar\else\EveryPar{}\fi - \dontleavehmode % \leavevmode - \xdef\dokeepverbatimlinedata % why was this? - {\parindent \the\parindent - \hangindent\the\hangindent - \hangafter \the\hangafter - \leftskip \the\leftskip - \rightskip \the\rightskip}% - \egroup - \dokeepverbatimlinedata - \doopenupverbatimline - \the\everyline\strut - \beginverbatimline - \processverbatimline{#1\relax\flushrestofverbatimline}% - \endverbatimline - \global\lineparfalse - \obeyedline\par} - -%D \macros -%D {flushrestofverbatimline} -%D -%D Some pretty drivers will collect tokens for the sake of -%D testing on keywords. This collected string needs to be -%D flushed. The \type {\relax} can serve as signal that there -%D is nothing more to be interpreted. - -\let\flushrestofverbatimline\empty - -%D \macros -%D {obeyemptylines,verbatimbaselineskip} -%D -%D Empty lines in verbatim can lead to white space on top of -%D a new page. Because this is not what we want, we turn -%D them into vertical skips. This default behavior can be -%D overruled by: -%D -%D \starttyping -%D \obeyemptylines -%D \stoptyping -%D -%D Although it would cost us only a few lines of code, we -%D decided not to take care of multiple empty lines. When a -%D (display) verbatim text contains more successive empty -%D lines, this probably suits some purpose. When applicable, -%D one can set the verbatim baselineskip. - -\bgroup -\catcode`\^^L=\@@active \gdef\emptypage {^^L} -\catcode`\^^M=\@@active \gdef\emptyline {^^M} - \gdef\emptyspace { } -\egroup - -\def\verbatimbaselineskip% We don't use \let here! - {\baselineskip} - -\def\doemptyverbatimline - {\vskip\verbatimbaselineskip - {\setbox0\hbox{\the\everyline}}% - \global\linepartrue} - -% \def\obeyemptylines -% {\let\donextemptyverbatimline\doemptyverbatimline} - -\def\obeyemptylines % tricky, only in verbatim (should be token list)! - {\chardef\verbatimemptylinemode\plusone} - -\def\obeyallemptylines % tricky, only in verbatim (should be token list)! - {\chardef\verbatimemptylinemode\plustwo} - -%D \TEX\ does not offer \type{\everyline}, which is a direct -%D result of its advanced multi||pass paragraph typesetting -%D mechanism. Because in verbatim mode paragraphs and lines are -%D more or less equal, we can easily implement our own simple -%D \type{\everyline} support. - -%D \macros -%D {EveryPar, EveryLine} -%D -%D In this module we've reserved \type{\everypar} for the -%D things to be done with paragraphs and \type{\everyline} for -%D line specific actions. In \CONTEXT\ however, we use -%D \type{\everypar} for placing side- and columnfloats, -%D inhibiting indentation and some other purposes. In verbatim -%D mode, every line becomes a paragraph, which means that -%D \type{\everypar} is executed frequently. To be sure, the -%D user specific use of both \type{\everyline} and -%D \type{\everypar} is implemented by means of -%D \type{\EveryLine} and \type{\EveryPar}. -%D -%D We still have to take care of the \TAB. A \TAB\ takes eight -%D spaces and a \SPACE\ normally has a width of 0.5~em. Because -%D we can be halfway a tabulation, we must keep track of the -%D position. This takes time, especially when we print complete -%D files, therefore we \type{\relax} this mechanism by default. - -\chardef\spacespertab=7 - -\def\doprocesstabskip - {\obeyedspace % \hskip.5em or \hbox to .5em{} - \ifdone - \donefalse - \advance\scratchcounter \plusone - \@EA\doprocesstabskip - \else\ifnum\scratchcounter>\spacespertab - % nothing - \else - \advance\scratchcounter \plusone - \@EAEAEA\doprocesstabskip - \fi\fi} - -\let\endoftabskipping=\relax % will become obsolete - -\def\doprocesstabskipline#1% - {\bgroup - \scratchcounter\plusone - \dodoprocesstabskipline#1\relax - \egroup} - -\def\dodoprocesstabskipline#1% - {\ifnum\scratchcounter>\spacespertab\relax - \donetrue \else \donefalse \advance - \fi \scratchcounter \plusone - \ifx#1\relax \else - \ifcase\tabskipmode - % can't happen - \or - % go on - \else\ifnum`#1<128 - % ok, no special character - \else\ifnum\catcode`#1=\active - % quits parsing, else utf lookahead problems - \chardef\tabskipmode\zerocount - \fi\fi\fi - \ifcase\tabskipmode - \@EAEAEA#1% - \else - \@EAEAEA#1\@EAEAEA\dodoprocesstabskipline - \fi - \fi} - -% ^ will be replaced - -\chardef\tabskipmode=1 % 0=quit 1=no test 2=test on active>128 - -\long\def\processverbatimline#1{#1} % remove the fake grouping - -%D \macros -%D {processfileverbatim} -%D -%D The verbatim typesetting of files is done on a bit different -%D basis. This time we don't check for a closing command, but -%D look for \EOF\ and when we've met, we make sure it does not -%D turn into an empty line. -%D -%D \starttyping -%D \processfileverbatim{filename} -%D \stoptyping -%D -%D We reserve a dedicated file handle. - -\newread\verbatiminput - -\newcount\verbatimlinenumber - -\let \beginofverbatimlines \relax -\let \endofverbatimlines \relax - -\def\processfileverbatim#1% - {\par - \bgroup - \processingverbatimtrue - \global\verbatimlinenumber\zerocount - \global\linepartrue - \beginofverbatimlines - \bgroup - \parindent\zeropoint - \ifdim\lastskip<\parskip - \removelastskip - \vskip\parskip - \fi - \parskip\zeropoint - \verbatimfont - \uncatcodecharacters - \setverbatimspaceskip - \frenchspacing - \obeyspaces - \obeytabs - \obeylines - \obeypages - \obeycharacters - \ignoreeofs - \catcode`\^^M=\@@ignore % \par is already taken care of -% \openin\verbatiminput=#1\relax - \openinputfile\verbatiminput{#1}% - \skipfirstverbatimlinefalse - \initializeverbatimline - \def\readline% - {\ifeof\verbatiminput \else - \ifx\firstverbatimfileline\empty - \global\advance\verbatimlinenumber\plusone - \read\verbatiminput to \verbatimline - \else - \let\verbatimline\firstverbatimfileline - \let\firstverbatimfileline\empty - \fi - \fi - \ifeof\verbatiminput - \ifx\lastverbatimfileline\empty - \presetlastverbatimline - \let\readline\relax - \else % we will re-enter the \ifeof branch twice - \presetnormalverbatimline - \def\readline% - {\let\verbatimline\lastverbatimfileline - \let\lastverbatimfileline\empty}% - \fi - \else\ifx\verbatimline\empty - \presetemptyverbatimline - \else\ifx\verbatimline\emptyline - \presetemptyverbatimline - \else\ifx\verbatimline\emptypage - \presetemptyverbatimline - \else - \presetnormalverbatimline - \fi\fi\fi\fi - \handleverbatimline - \readline}% - \ifeof\verbatiminput \else - \expandafter\readline - \fi - \closein\verbatiminput - \egroup - \endofverbatimlines - \egroup - \ignorespaces} - -%D Something new: - -\def\processfilelinesverbatim#1#2#3% - {\bgroup - \let\saveddoflushverbatimline\doflushverbatimline - \let\saveddoemptyverbatimline\doemptyverbatimline - \def\checkverbatimfileline##1% - {\ifnum\verbatimlinenumber<#2\else - \ifnum\verbatimlinenumber>#3\else - ##1% - \fi\fi}% - \def\doflushverbatimline - {\checkverbatimfileline\saveddoflushverbatimline}% - \def\doemptyverbatimline - {\checkverbatimfileline\saveddoemptyverbatimline}% - \processfileverbatim{#1}% - \egroup} - -%D \macros -%D {firstverbatimfileline, lastverbatimfileline} -%D -%D The following two macros can be set to achieve special -%D effects, like: -%D -%D \starttyping -%D \convertargument\StartFake{something}\to\firstverbatimfileline -%D \convertargument\StopFake\to\firstverbatimfileline -%D \stoptyping -%D -%D These hooks were needed for typesetting flowchart -%D definitions verbatim, since the temporary files does not -%D have the start and stop commands embedded. - -\let\firstverbatimfileline\empty -\let\lastverbatimfileline \empty - -%D One can use the different \type{\obeysomething} commands to -%D influence the behavior of these macro's. We use for instance -%D \type{\obeycharacters} for making \type{/} an active -%D character when we want to include typesetting commands. - -%D The next part of this module deals with pretty printing. The -%D best way to understand how pretty verbatim typeseting works -%D is to take a look at the output produced by the \TEX, \PERL\ -%D and \METAPOST\ modules first. Each of these modules has a -%D few setup macros that tag the individual characters with a -%D number that itself is associated to a interpretation macro. -%D A previous implementation linked characters (after making -%D them active) directly to such interpreters, but the more -%D indirect way makes it possible to inspect the next -%D character(s) without much expansion problems and/or -%D increasing run time. - -%D By the way, \TEX\ defines \type{\+} as an outer macro, so we -%D have to redefine this one to keep ourselves out of complaints. - -\def\+{\tabalign} - -%D Just to keep things consistant and to speed up some macros a -%D but, we define a few private constants. - -\def\!!PRETTY {PRETTY} - -\def\!!prettyone {prettyone} -\def\!!prettytwo {prettytwo} -\def\!!prettythree {prettythree} -\def\!!prettyfour {prettyfour} -\def\!!prettyfive {prettyfive} -\def\!!prettynine {prettynine} -\def\!!prettyeight {prettyeight} -\def\!!prettytwoone {prettytwoone} -\def\!!prettyfourthree {prettyfourthree} - -%D The first step in defining a pretty interpreter is to assign -%D each character that needs special attention a number, like: -%D -%D \starttyping -%D \setpretty \`A 21 -%D \stoptyping -%D -%D Here the macro \type{\setpretty} makes the character -%D \type{A} active, and sets it meaning to the auxiliary macro -%D \type{\handleprettytoken}. This auxiliary macro takes the -%D character code (a number) and the interpretation number. The -%D three step implementation uses the \TEX book \type{~} trick. - -\def\dodosetpretty - {\!!countb=\uccode`~\relax - \catcode\!!countb=\@@active - \uppercase{\edef~{\noexpand\handleprettytoken{\the\!!counta}{\the\!!countb}}}} - -\def\dosetpretty - {\afterassignment\dodosetpretty\!!counta} - -\def\setpretty - {\afterassignment\dosetpretty\uccode`~=} - -%D The macro \type{\handleprettytoken} is rather trivial and -%D calls for an interpreter macro. - -\def\handleprettytoken#1% - {\csname\!!PRETTY#1\endcsname} % \getvalue{\!!PRETTY#1}} - -%D This interpreter is installed by saying -%D -%D \starttyping -%D \installprettyhandler 21 \SOMEprettyone -%D \stoptyping - -\def\installprettyhandler#1 #2% - {\letvalue{\!!PRETTY#1}#2} - -%D Such an interpreter gets the character number: -%D -%D \starttyping -%D \def\SOMEprettyone#1{...\getpretty{#1}...} -%D \stoptyping -%D -%D where \type{\getpretty} equals \type{\char}. We can't -%D use \type{\let} here because we have to get rid of the -%D braces. - -\def\getpretty#1% - {\char#1} - -%D Sometimes the action depends on the next token. This token -%D can be passed to the macro \type{\getprettydata}, that sets -%D \type{\prettytype} to the interpreter code. The character -%D code is saved in \type{\prettychar}. - -\def\setprettydata#1#2% - {\global\chardef\prettytype#1% - \global\chardef\prettychar#2\relax} - -\def\getprettydata#1% - {\global\chardef\prettytype\zerocount - \global\chardef\prettychar\zerocount - \bgroup - \let\handleprettytoken\setprettydata - \setbox0\hbox{#1}% expands #1 and ignores space - \egroup} - -%D If needed the current and next token can be handled alongside: - -\def\getpretties#1#2% - {\char#1\bgroup\let\handleprettytoken\getsecondpretty#2\egroup} - -\def\getsecondpretty#1#2% - {\char#2} - -%D When needed, one can reassign an interpreter by using -%D \type{\newpretty} and its associates. -%D -%D \bgroup -%D \setuptyping[file][optionoptie=tex,paletpalet=colorpretty] -%D -%D \startbuffer -%D \bgroup -%D \catcode`\|=\@@escape %%\|\ -%D \catcode`\\=\@@active %%\\+ -%D |gdef|dohandlenewpretty#1% -%D {|def|dodohandlenewpretty##1% -%D {|def|oldprettychar{#1}% -%D |getprettydata{##1}% -%D |ifnum|oldprettychar=|prettychar -%D |def|dododohandlenewpretty####1% -%D {|getprettydata{\}% -%D |let|oldprettytype=|prettytype -%D |getprettydata{####1}% -%D |ifnum|prettytype=|oldprettytype -%D |let|next=|newpretty -%D |else -%D |def|next{|newprettycommand{#1}##1####1}% -%D |fi -%D |next}% -%D |let|next=|dododohandlenewpretty -%D |else -%D |def|next{|newprettycommand{#1}##1}% -%D |fi -%D |next}% -%D |def|donohandlenewpretty##1% -%D {|newprettycommand{#1}##1}% -%D |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty} -%D |egroup -%D \stopbuffer -%D -%D {\newprettytrue\typebuffer} -%D -%D In this example we see that the colors differ from what we -%D expect, but conform the definitions in the macro. This kind -%D of recoloring can be achieved by saying: -%D -%D \typebuffer -%D -%D We'll show some more examples: -%D -%D \startbuffer[pretty] -%D \installnewpretty r \red -%D \installnewpretty g \green -%D \installnewpretty b \blue -%D \stopbuffer -%D -%D \getbuffer[pretty] -%D -%D \startbuffer -%D %%\ r{Red -%D %%\ g\Green -%D %%\ b[Blue -%D \stopbuffer -%D -%D {\newprettytrue\typebuffer} -%D -%D Watch the green \type{\Green}! This lines are specified as: -%D -%D \typebuffer -%D -%D along with: -%D -%D \typebuffer[pretty] -%D -%D When needed, one can use grouping. -%D -%D \startbuffer -%D {yes} %%\ B %%\{[ %%\}] -%D {no} -%D {no} %%\ E -%D {yes} -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here we tell the visualizer that the \type +{+ should be -%D treated like a \type +[+ so we get: -%D -%D {\newprettytrue\typebuffer} -%D -%D I won't explain the details of this mechanism. Those who -%D want to build their own pretty interpreters have to close -%D read the source anyway. -%D -%D Last we show an example of mixed pretty typesetting: -%D -%D \startbuffer -%D \ziezo{test} %%\ P ##\ B##\ T % enter PERL mode %%\ E -%D if $test eq "test" ##\ B ##\ B##\ T % begin group (\bgroup) %%\ E -%D if $test eq "test"; ##\ T %%\ B%%\ T % enter TEX mode %%\ E -%D \ziezo{test} %%\ M %%\ B%%\ T % enter METAPOST mode %%\ E -%D draw (0,0)--(10,10); %%\ E ##\ B##\ T % end group (\egroup) %%\ E -%D if $test eq "test"; -%D \stopbuffer -%D -%D \typebuffer -%D -%D Here we use \type{%%\ T}, \type{%%\ P} and \type{%%\ M} for -%D switching between \TEX, \PERL\ and \METAPOST\ mode. -%D -%D {\newprettytrue\typebuffer} -%D -%D \egroup -%D -%D Don't forget to set: - -\newif\ifnewpretty - -\def\installnewpretty - {\def\doinstallnewpretty##1% - {\setvalue{NP::\the\scratchcounter}{##1}}% - \afterassignment\doinstallnewpretty\scratchcounter=`} - -%D Let's define the options we used here: - -\newevery\everyprettyend\relax - -\let\prettyend=\relax - -\def\prettybegin - {\bgroup\def\prettyend{\the\everyprettyend\egroup}} - -\installnewpretty B \prettybegin -\installnewpretty E \prettyend - -\installnewpretty J \setupprettyJVtype -\installnewpretty M \setupprettyMPtype -\installnewpretty P \setupprettyPLtype -\installnewpretty T \setupprettyTEXtype - -%D \macros -%D {ifnaturaltextext} -%D -%D When one uses \ETEX, switching to normal \TEX\ is possible -%D too. We also introduce a switch that can be used in the -%D drivers and set in higher level shell macros. - -\newif\ifnaturaltextext - -% \starttyping -% test /naturaltextext\hpos{word}{test}/relax test -% \stoptyping -% -% \MPxy{word} - -\def\naturaltextext#1\relax - {\bgroup - \prettynaturalfont{\restorecatcodes\scantokens{\ignorespaces#1}}% - \egroup} - -\def\naturaltextext#1\relax - {\bgroup - \def\ascii{#1}% - \setnormalcatcodes - \restorecatcodes - \prettynaturalfont{\scantokens\expandafter{\ascii}\ifhmode\unskip\fi}% - \egroup} - -\installnewpretty N \naturaltextext - -%D When seen in action this gives: -%D -%D \startbuffer -%D \startTEX -%D \def\mathematics#1% %%\ N usage: \type {\mathematics{x^2}} -%D {\ifmmode#1\else$#1$\fi} %%\ N becomes: \mathematics{X^2} -%D \stopTEX -%D \stopbuffer -%D -%D \getbuffer -%D -%D This is keyed in as: -%D -%D \typebuffer - -%D This means that when the interpreter modules support this -%D mechanism, by default we have some keys already available. - -\def\newpretty#1% - {\getprettydata{#1}% - \ifcase\prettytype - \expandafter\nonewpretty - \else - \expandafter\donewpretty - \fi - #1} - -\def\nonewpretty#1#2% - {\getprettydata{#2}% - \getvalue{NP::\the\prettychar}} - -\def\donewpretty#1% - {\bgroup - \def\handleprettytoken##1##2##3% - {\getprettydata{##3}% - \egroup - \ifcase\prettytype\else - \setpretty##2=\prettytype\relax - \fi}% - #1} - -%D When implementing new pretty macros, one only needs to -%D define something like: -%D -%D \starttyping -%D \def\TEXtypezero% -%D {\handlenewpretty\TEXtypethree} -%D \stoptyping -%D -%D Here the number states the category (in our examples the -%D backslash). The second argument takes care of normal -%D situations. - -\def\handlenewpretty#1% - {\let\newprettycommand=#1% - \handlenextnextpretty\dohandlenewpretty\newprettycommand} - -%D The previous shown implementation only interprets single -%D comments, but the final one also accepts double ones. The -%D main reason for this is that in \JAVA\ we have to deal with -%D \type{//}. Personally I prefer the double \type{%%} because -%D is stands out and is more symmetrical with the double -%D slash. - -\bgroup -\catcode`\|=\@@escape -\catcode`\\=\@@active -|gdef|dohandlenewpretty#1% - {|def|dodohandlenewpretty##1% - {|def|oldprettychar{#1}% - |getprettydata{##1}% - |ifnum|oldprettychar=|prettychar - |def|dododohandlenewpretty####1% - {|getprettydata{\}% - |let|oldprettytype=|prettytype - |getprettydata{####1}% - |ifnum|prettytype=|oldprettytype - |let|next|newpretty - |else - |def|next{|newprettycommand{#1}##1####1}% - |fi - |next}% - |let|next|dododohandlenewpretty - |else - |def|next{|newprettycommand{#1}##1}% - |fi - |next}% - |def|donohandlenewpretty##1% - {|newprettycommand{#1}##1}% - |handlenextnextpretty|dodohandlenewpretty|donohandlenewpretty} -|egroup - -%D The `nextnext' macro we used in the previous definition -%D looks ahead. This is needed because individual lines are -%D handles by macro's and the next character can be something -%D that ends the line and/or does not belong to the verbatim -%D data. - -\def\handlenextnextpretty#1#2#3% - {\def\dohandlenextnextpretty% - {\ifx\next\bgroup % something {} - \@EA#2% - \else\ifx\next\relax % end of line / signal - \@EAEAEA#2% - \else - \@EAEAEA#1% - \fi\fi - {#3}}% - \futurelet\next\dohandlenextnextpretty} - -%D The pretty interpreters can (and will) change the meaning of -%D some controls. To enable them calling the originals we save -%D their meanings and to enable nesting we permit this only -%D once. - -\def\saveprettycontrols - {\global\let\oldobeyedspace \obeyedspace - \global\let\oldobeyedline \obeyedline - \global\let\oldobeyedpage \obeyedpage - \let\saveprettycontrols \relax} - -%D The \PERL\ and \METAPOST\ interpreters will also handle -%D reserved words. Sets of identifiers are defined like: -%D -%D \starttyping -%D \useprettyidentifiers \MODULAidentifiers \MODULAsetspecials -%D if then else elsif case while do repeat until ... -%D \stoptyping -%D -%D New entries can be added to existing sets by repeatedly -%D using this command. - -\def\useprettyidentifiers#1#2% \variable \presetcatcodes - {\bgroup - \ifx#1\undefined - \global\let#1=\empty - \fi - \def\handleprettytoken##1##2{\char##2}% - #2\relax - \def\douseprettyidentifiers##1\par% - {\xdef#1{\space#1\space##1}% - \egroup}% - \douseprettyidentifiers} - -%D We can test om identifiers with: - -\def\doifprettyidentifierelse#1% - {\doifincsnameelse{\space#1\space}} - -%D \macros -%D {prettyidentifierfont,prettyvariablefont,prettynaturalfont} -%D -%D When one want to typeset identifiers and system variables -%D in a different typeface, one has to set the next two -%D variables. - -\let\prettyidentifierfont=\relax -\let\prettyvariablefont =\relax -\let\prettynaturalfont =\relax - -%D The interpreter macros are loaded at run time. The main -%D reason lays in the fact that we don't want to have the -%D identifier lists hard coded in the format file. To prevent -%D repetitive loading, one should load the modules before the -%D first call to the macros. -%D -%D \starttyping -%D \input verb-tex.tex -%D \input verb-pl.tex -%D \input verb-mp.tex -%D \input verb-jv.tex -%D \stoptyping -%D -%D In \CONTEXT\ we follow a different thread, and therefore all -%D macros in the additional modules use \type {\gdef}'s and -%D \type {\doglobal}'s. Manipulating \type {\globaldef} is -%D possible but leads to fuzzy situations. - -%D \macros -%D {ifdisablepretty,disableprettynow,disableprettyafterwards} -%D -%D Although for pretty printing \PERL\ and \JAVASCRIPT\ code -%D one has to implement a bit more clever mechanism, the next -%D switches can be used to turn off pretty printing. The -%D boolean turns on this feature. - -\newif\ifdisablepretty \disableprettyfalse -\newif\ifprettydisabled \prettydisabledfalse - -\def\disableprettynow - {\ifdisablepretty\ifprettydisabled\else - \let\prettyidentifierfont\relax - \let\prettyvariablefont\relax - \let\prettycomment\relax - \def\beginofpretty[##1]{}% - \let\endofpretty\relax - \prettydisabledtrue - \fi\fi} - -\def\disableprettyafterwards - {\ifdisablepretty\ifprettydisabled\else - \def\endofpretty{\normalendofpretty\disableprettynow}% - \fi\fi} - -\def\enableprettynow - {\prettydisabledfalse - \let\prettyidentifierfont\normalprettyidentifierfont - \let\prettyvariablefont \normalprettyvariablefont - \let\prettynaturalfont \normalprettynaturalfont - \let\beginofpretty \normalbeginofpretty - \let\endofpretty \normalendofpretty} - -%D This feature is hooked into the verbatim line handling -%D routine with: - -\def\beginverbatimline - {\prettydisabledfalse - \ifnewpretty\else\let\handlenewpretty\empty\fi % moved - \let\normalprettyidentifierfont\prettyidentifierfont - \let\normalprettyvariablefont \prettyvariablefont - \let\normalprettynaturalfont \prettynaturalfont - \let\normalbeginofpretty \beginofpretty - \let\normalendofpretty \endofpretty} - -\def\endverbatimline - {\enableprettynow} - -%D The rest of this module is dedicated to non \CONTEXT\ users -%D and shows an example of an verbatim environment based on the -%D previous macros. -%D -%D The macro's can be used to construct the commands we -%D mentioned in the beginning of this documentation. We leave -%D this to the fantasy of the reader and only show some \PLAIN\ -%D \TEX\ alternatives for display verbatim and listings. We -%D define three commands for typesetting inline text, display -%D text and files verbatim. The inline alternative also accepts -%D user supplied delimiters. -%D -%D -%D \type{text} -%D -%D \starttyping -%D ... verbatim text ... -%D \stoptyping -%D -%D \typefile{filename} -%D -%D We can turn on the options by: -%D -%D \starttyping -%D \controlspacetrue -%D \verbatimtabstrue -%D \prettyverbatimtrue -%D \stoptyping -%D -%D Here is the implementation: - -\newif\ifcontrolspace -\newif\ifverbatimtabs -\newif\ifprettyverbatim - -\ifCONTEXT \else - - \def\presettyping - {\ifcontrolspace \let\obeyspace \setcontrolspace \fi - \ifverbatimtabs \let\obeytabs \settabskips \fi - \ifprettyverbatim \let\obeycharacters\setupprettytype \fi} - - \def\type - {\bgroup - \def\_{\string_}% - \def\^{\string^}% - \presettyping - \processinlineverbatim\egroup} - - \def\starttyping - {\bgroup - \presettyping - \processdisplayverbatim\stoptyping} - - \def\stoptyping - {\egroup} - - \def\typefile#1% - {\bgroup - \presettyping - \processfileverbatim{#1}% - \egroup} - -\fi - -%D In \CONTEXT\ users say things like: -%D -%D \starttyping -%D \definetyping [TEX] [option=TEX] -%D \definetyping [MP] [option=MP] -%D \definetyping [PL] [option=PL] -%D \definetyping [JV] [option=JV] -%D \stoptyping -%D -%D or -%D -%D \starttyping -%D \setuptyping[file][option=color] -%D \stoptyping -%D -%D That way \CONTEXT\ selects the appropriate interpreter -%D itself, but more on that in another module. In other -%D packages one can define: - -\ifCONTEXT \else - - \input verb-tex.mkii - \input verb-mp.mkii - - \def\startTEX - {\bgroup \everypar{}% - \let\obeycharacters\setupprettyTEXtype - \processdisplayverbatim{\stopTEX}} - - \def\startMP - {\bgroup \everypar{}% - \let\obeycharacters\setupprettyMPtype - \processdisplayverbatim{\stopMP}} - - \let\stopTEX=\egroup - \let\stopMP =\egroup - -\fi - -%D This following poor mans implementation of color is based on -%D PostScript. One can of course use grayscales too. In the -%D core modules these macros are redefined to using the color -%D mechanism present in \CONTEXT. - -\ifCONTEXT \else - - \def\setcolorverbatim - {\def\prettyone {.9 .0 .0 } % red - \def\prettytwo {.0 .8 .0 } % green - \def\prettythree {.0 .0 .9 } % blue - \def\prettyfour {.8 .8 .6 } % yellow - \def\beginofpretty[##1]% - {\special{ps:: \csname##1\endcsname setrgbcolor}} - \def\endofpretty% - {\special{ps:: 0 0 0 setrgbcolor}}} % black - - \def\setgrayverbatim - {\def\prettyone {.30 } % gray - \def\prettytwo {.45 } % gray - \def\prettythree {.60 } % gray - \def\prettyfour {.75 } % gray - \def\beginofpretty[##1]% - {\special{ps:: \csname##1\endcsname setgray}} - \def\endofpretty% - {\special{ps:: 0 setgray}}} % black - -\fi - -%D One can redefine these two commands after loading this -%D module. When available, one can also use appropriate -%D font||switch macro's. We default to color. - -\ifCONTEXT \else \setcolorverbatim \fi - -%D Here come the commands that are responsible for entering and -%D leaving the two states. As we can see, they've got much in -%D common. - -%D The previous version of this module was published in the -%D \MAPS\ of the dutch \TEX\ users group \NTG. In that article, -%D the verbatim part of the text was typeset with the following -%D commands for the examples: -%D -%D \starttyping -%D \def\starttyping% We simplify the \ConTeXt\ macro. -%D {\bgroup -%D \everypar{} % We disable some troublesome mechanisms. -%D \advance\leftskip by 1em -%D \processdisplayverbatim{\stoptyping}} -%D -%D \let\stoptyping=\egroup -%D \stoptyping -%D -%D We also used: -%D -%D \starttyping -%D \def\startdefinition% -%D {\bgroup -%D \everypar{} % Again we disable some troublesome mechanisms. -%D \let\obeycharacters=\setupprettyTEXtype % See verb-tex.tex! -%D \EveryPar{\showparagraphcounter}% -%D \EveryLine{\showlinecounter}% -%D \verbatimbodyfont -%D \processdisplayverbatim{\stopdefinition}} -%D -%D \def\stopdefinition% -%D {\egroup} -%D \stoptyping -%D -%D And because we have both \type{\EveryPar} and -%D \type{\EveryLine} available, we can implement a dual -%D numbering mechanism: -%D -%D \starttyping -%D \newcount\paragraphcounter -%D \newcount\linecounter -%D -%D \def\showparagraphcounter% -%D {\llap -%D {\bgroup -%D \counterfont -%D \hbox to 4em -%D {\global\advance\paragraphcounter by 1 -%D \hss \the\paragraphcounter \hskip2em}% -%D \egroup -%D \hskip1em}} -%D -%D \def\showlinecounter% -%D {\llap -%D {\bgroup -%D \counterfont -%D \hbox to 2em -%D {\global\advance\linecounter by 1 -%D \hss \the\linecounter}% -%D \egroup -%D \hskip1em}} -%D \stoptyping -%D -%D One may have noticed that the \type{\EveryPar} is only -%D executed once, because we consider each piece of verbatim -%D as one paragraph. When one wants to take the empty lines -%D into account, the following assignments are appropriate: -%D -%D \starttyping -%D \EveryLine -%D {\iflinepar -%D \showparagraphcounter -%D \fi -%D \showlinecounter} -%D \stoptyping -%D -%D In this case, nothing has to be assigned to \type{\EveryPar}, -%D maybe except of just another extra numbering scheme. The -%D macros used to typeset this documentation are a bit more -%D complicated, because we have to take take 'long' margin -%D lists into account. When such a list exceeds the previous -%D pargraph we postpone placement of the paragraph number till -%D there's room. This way so it does not clash with the margin -%D words. - -%D Normally such commands have to be embedded in a decent setup -%D structure, where options can be set at will. -%D -%D Now let's summarize the most important commands. -%D -%D \starttyping -%D \processinlineverbatim{\closingcommand} -%D \processdisplayverbatim{\closingcommand} -%D \processfileverbatim{filename} -%D \stoptyping -%D -%D We can satisfy our own specific needs with the following -%D interfacing macro's: -%D -%D \starttyping -%D \obeyspaces \obeytabs \obeylines \obeypages \obeycharacters -%D \stoptyping -%D -%D We can influence the verbatim environment with the following -%D macro: -%D -%D \starttyping -%D \obeyemptylines -%D \stoptyping -%D -%D Some needs are fulfilled already with: -%D -%D \starttyping -%D \setcontrolspace \settabskips -%D \stoptyping -%D -%D lines can be enhanced with ornaments using: -%D -%D \starttyping -%D \everypar \everyline \iflinepar -%D \stoptyping -%D -%D and pretty verbatim support is implemented by: -%D -%D \starttyping -%D \beginofpretty[#1] ... \endofpretty -%D \stoptyping -%D -%D and some setup macro, like: -%D -%D \starttyping -%D \setupprettyIDENTIFIERtype -%D \stoptyping -%D -%D The color support macro can be redefined by the user. The -%D parameter \type{#1} can be one of the four 'fixed' -%D identifiers {\em prettyone}, {\em prettytwo}, {\em -%D prettythree} and {\em prettyfour}. We have implemented a -%D more or less general PostScript color support mechanism, -%D using \type{specials}. One can toggle between color and -%D grayscale with: -%D -%D \starttyping -%D \setgrayverbatim \setcolorverbatim -%D \stoptyping - -%D \macros -%D {permitshiftedendofverbatim} -%D -%D We did not mention one drawback of the mechanism described -%D here. The closing command must start at the first position -%D of the line. In \CONTEXT\ we will not have this drawback, -%D because we can test if the end command is a substring of the -%D current line. The testing is done by two of the support -%D macros, which of course are not available in a stand alone -%D application of this module. - -\ifCONTEXT - - \let\doifendofverbatim=\doifelse - - \def\permitshiftedendofverbatim - {\let\doifendofverbatim\doifinstringelse} - - {\obeylines% - \long\gdef\copyverbatimline#1 - {\convertargument#1 \to\next% - \gdef\verbatimline{#1}% - \ifx\next\emptyspace% - \presetemptyverbatimline% - \else% - \doifendofverbatim{\endofverbatimcommand}{\next}% - {\presetlastverbatimline% - \def\copyverbatimline{\egroup\endofdisplayverbatim}}% - {\presetnormalverbatimline}% - \fi% - \handleverbatimline% - \copyverbatimline}} - -%D As a bonus, we provide the next alternative, which takes -%D end tags like \type {Hello World!}. - - \def\doprocessdisplayverbatim#1#2% - {\par - \beginofverbatimlines - \bgroup - \escapechar-1 - \xdef\verbatimname{\string#2}% - \egroup - \ifcase#1% - \let\endofdisplayverbatim\relax - \else - \def\endofdisplayverbatim{\endofverbatimlines\csname\verbatimname\endcsname}% - \fi - \bgroup - \parindent\zeropoint - \ifdim\lastskip<\parskip - \removelastskip - \vskip\parskip - \fi - \parskip\zeropoint - \processingverbatimtrue - \ifcase#1% - \convertargument#2\to\endofverbatimcommand - \else - \expandafter\let\csname\verbatimname\endcsname=\relax - \expandafter\convertargument\csname\verbatimname\endcsname - \to\endofverbatimcommand - \fi - \verbatimfont - \setverbatimspaceskip - \global\linepartrue % needed for paragraph numbering - \setupcopyverbatim - \initializeverbatimline - \copyverbatimline} - - \def\processdisplayverbatim {\doprocessdisplayverbatim1} - \def\processtaggeddisplayverbatim{\doprocessdisplayverbatim0} - -\fi - -%D \macros -%D {installprettyescape} -%D -%D The next feature is dedicated to Fabrice Popineau who -%D wanted math inside verbatim. - -\def\prettyescapecnt{255} - -\def\installprettyescape - {\dodoubleempty\doinstallprettyescape} - -\def\doinstallprettyescape[#1][#2]#3 #4% - {\bgroup - \doglobal\decrement\prettyescapecnt - \def\docommand##1% - {\def\next{\dodoinstallprettyescape{##1}{#3}{#4}}% - \catcode`#3=\@@active - \@EA\scantokens\@EA{\next}}% - \iffirstargument - \processcommalist[#1]\docommand - \else - \docommand\empty - \fi} - -\def\dodoinstallprettyescape#1#2#3% - {\unexpanded\setgvalue{PRETTY@#1@\prettyescapecnt}##1##2#2{#3{##2}}% - \expanded % we need to freeze the counter - {\doglobal\noexpand\appendtoks - \noexpand\doif{#1}\noexpand\prettyidentifier - {\noexpand\setpretty`\string#2=\prettyescapecnt - \noexpand\installprettyhandler \prettyescapecnt\space\getvalue{PRETTY@#1@\prettyescapecnt}}% - }\to \everysetupverbatim - \egroup} - -%D An example of its usage is: -%D -%D \startbuffer -%D \def\xverbatimmath#1#2{\naturaltextext\mathematics{#1}\relax} -%D \def\yverbatimmath#1#2{\naturaltextext\mathematics{[[#1]]}\relax} -%D \def\zverbatimmath#1#2{\naturaltextext\mathematics{(#1)}\relax} -%D -%D \installprettyescape [MP] $ \xverbatimmath -%D \installprettyescape [MP] ~ \yverbatimmath -%D \installprettyescape [MP] * \zverbatimmath -%D -%D \startMP -%D if $x>10$ : -%D $x := 20$ -%D ~x := 20~ -%D *x := 20* -%D end -%D \stopMP -%D \stopbuffer -%D -%D \typebuffer \getbuffer - -\protect \endinput |