summaryrefslogtreecommitdiff
path: root/macros/generic/c_pascal/cap_comm.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/generic/c_pascal/cap_comm.tex
Initial commit
Diffstat (limited to 'macros/generic/c_pascal/cap_comm.tex')
-rw-r--r--macros/generic/c_pascal/cap_comm.tex257
1 files changed, 257 insertions, 0 deletions
diff --git a/macros/generic/c_pascal/cap_comm.tex b/macros/generic/c_pascal/cap_comm.tex
new file mode 100644
index 0000000000..30a98aae4a
--- /dev/null
+++ b/macros/generic/c_pascal/cap_comm.tex
@@ -0,0 +1,257 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% CAP --- Macros for typesetting programs in C and Pascal %
+% Micha\l{} Gulczy\'nski, Szczecin, Feb 1997 / Feb 1998 %
+% mgulcz@we.tuniv.szczecin.pl %
+% Some (non-essential) changes to support COLORDVI output %
+% Danilo \v Segan, Beograd, Sep 2002 %
+% mm01142@alas.matf.bg.ac.yu %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% version 1.2d
+% Added DVIPS color support (actually, any output is replaced with
+% a macro call to \Ispis --- search for it to see the changes)
+% Also extended a mechanism for marking "special" symbols, so they
+% would get applicable color in a string, comment, or otherwise
+% NOTE: It should be backwards compatible, so there is no need to
+% change anything else, except of course adding color
+% settings if you wish
+% -- by Danilo {\v S}egan, mm01142@alas.matf.bg.ac.yu
+% version 1.2
+% This file contains common definitions used in the CAP package.
+% It does not contain any useful macros itself.
+%
+
+% If you don't have dvips's colordvi.tex, then fetch it from somewhere
+% to avoid errors in processing (it inserts specials which will
+% probably be ignored by anything other than COLORDVI aware software)
+% The alternate solution is to comment out all color definitions
+% (\let's) and to define writeout function as \def\Ispis#1{#1}
+\input colordvi
+
+% If you don't have color printer, you may choose to remain compatible
+% with those that do, and only use analogous dvips's input file
+%\input blackdvi
+
+%
+% font and color declarations
+%
+\font\tenttsl = cmsltt10 % <--- modify these two lines if you don't use
+\font\tenttit = cmitt10 % <--- CM fonts
+\let\IdentifierFont = \it
+\let\IdentifierColor = \Black
+\let\TextFont = \sl
+\let\TextColor = \Black
+\let\KeywordFont = \bf
+\let\KeywordColor = \Black
+\let\CommentFont = \tenttit
+\let\CommentColor = \Black
+\let\DirectiveFont = \tenttsl
+\let\DirectiveColor = \Black
+\let\SymbolFont = \tt
+\let\SymbolColor = \Black
+\let\SpecialFont = \tt % some characters: { } < > _ \ and | are very
+\let\SpecialColor = \Black % special -- they exist only in tt fonts
+
+%
+% how much does a single "space" skip (retained the default 1ex from CAP)
+%
+\newdimen\SpaceSkip % Changeable space skip (instead of the old fixed 1ex)
+\SpaceSkip=1ex
+
+
+%\def\GenState#1{%
+%\expandafter\expandafter\def\csname @#1State\endcsname{%
+% \def\@Color{\csname#1Color\endcsname}%
+% \def\@@State{#1}%
+% \expandafter\csname #1Font\endcsname}}
+\def\GenState#1{%
+\expandafter\expandafter\def\csname @#1State\endcsname{%
+ \def\@tmpName{#1}%
+% \ifx\@@State\@tmpName\else% if already in this state, skip
+ \def\@Color{\csname#1Color\endcsname}%
+ \def\@@State{#1}%
+ \expandafter\csname #1Font\endcsname%\fi}}
+ }}
+
+\GenState{Identifier}
+\GenState{Text}
+\GenState{Keyword}
+\GenState{Comment}
+\GenState{Directive}
+\GenState{Symbol}
+% One \GenState{NAME} replaces the following definition
+% \def\@NAMEState{\let\@Color=\NAMEColor\NAMEFont\def\@@State{NAME}}
+\def\@SpecialState{%
+ \def\neka##1{\edef\@@stanje{##1}}%
+ \neka{Directive}\ifx\@@State\@@stanje%
+ \let\@Color=\DirectiveColor%
+ \else
+ \neka{Comment}\ifx\@@State\@@stanje%
+ \let\@Color=\CommentColor%
+ \else
+ \neka{Text}\ifx\@@State\@@stanje%
+ \let\@Color=\TextColor%
+ \else%
+ \let\@Color=\SpecialColor
+ \fi\fi\fi%
+ \SpecialFont}
+
+\def\@Output#1{\@Color{#1}}
+
+%
+% registers and constants used in the program
+%
+\newif\if@TempBool % temporary boolean
+\newread\@InFile % file read by \Input macros
+\newcount\@CharCode % code of current character
+\newcount\@PrevChar % code of previous charater
+\newcount\@WhereAmI % one of the following values:
+\chardef\@NothingSpecial = 0
+\chardef\@Text = 1
+\chardef\@Directive = 2 % used only in C
+\chardef\@ShortComment = 3 % C: //... ; Pascal: (* ... *)
+\chardef\@LongComment = 4 % C: /* ... */; Pascal: { ... }
+%
+% macro that compares two strings
+%
+\def\@Identical#1#2{%
+ MG\fi
+ \edef\@FirstString{#1}%
+ \edef\@SecondString{#2}%
+ \ifx \@FirstString \@SecondString
+}
+%
+% I need a "not eof" function
+%
+\def\neof#1{%
+ MG\fi
+ \ifeof#1
+ \@TempBoolfalse
+ \else
+ \@TempBooltrue
+ \fi
+ \if@TempBool
+}
+%
+% macro for changing catcodes of some special characters
+%
+\def\@TurnSpecialCharsOff{%
+ \catcode`\/=12
+ \catcode`\~=12
+ \catcode`\#=12
+ \catcode`\$=12
+ \catcode`\%=12
+ \catcode`\^=12
+ \catcode`\&=12
+ \catcode`\_=12
+ \catcode`\\=12
+ \catcode`\{=12
+ \catcode`\}=12
+ \catcode`\ =12
+ \catcode`\^^M=12
+}
+%
+% macro that initiates all the variables
+%
+\def\@PrepareCPas{%
+ \begingroup
+ \parindent=0pt
+ \rightskip=0pt plus 1fil
+ \@TurnSpecialCharsOff
+ \def\@Word{}%
+ \@WhereAmI = \@NothingSpecial
+ \@PrevChar = 32
+ \@SymbolState
+}
+%
+% macro that outputs the char specified as the argument;
+% characters < > _ \ { | } are written with \SpecialState,
+% except for _ which is written with \IdentifierColor and \SpecialFont
+%
+\def\@WriteChar#1{%
+ \def\@Check##1{%
+ \ifnum `#1=`##1%
+ {\@SpecialState \@Output{#1}}%
+ \@TempBooltrue%
+ \fi
+ }%
+ \@TempBoolfalse
+ \@Check{<}%
+ \@Check{>}%
+% \@Check{_}%
+ \ifnum`#1=`\_%
+ \@IdentifierState\SpecialFont%
+ \@Output{#1}\@TempBooltrue%
+ \fi%
+ \@Check{\\}%
+ \@Check{\{}%
+ \@Check{\}}%
+ \@Check{|}%
+ \if@TempBool
+ \else
+ \ifnum `#1=13
+ \par\leavevmode
+ \else
+ \ifnum `#1=32
+ \hskip\SpaceSkip
+ \else
+ \@Output{#1}%
+ \fi
+ \fi
+ \fi
+}
+%
+% checks if word #1 is a keyword and writes it out;
+% #2 is a list of keywords separated with spaces
+%
+\def\@WriteWord#1#2{%
+ \if\@OnListOfKeywords{ #1 }{#2}%
+ {\@KeywordState\@Output{#1}}%
+ \else
+ {\@IdentifierState\@Output{#1}}%
+ \fi
+}
+%
+% checks if string #2 contains string #1
+%
+\def\@OnListOfKeywords#1#2{%
+ MG\fi
+ \edef\@ExpandedArgument{{#1}}%
+ \expandafter\@@OnListOfKeywords\@ExpandedArgument{#2}\relax
+}
+\def\@@OnListOfKeywords#1#2{%
+ \def\@CheckList##1#1##2\@EndOfList{%
+ \if\@Identical{##2}{}%
+ \@TempBoolfalse
+ \else
+ \@TempBooltrue
+ \fi
+ }%
+ \expandafter\@CheckList#2#1\@EndOfList\relax
+ \if@TempBool
+}
+%
+% checks if the specified character is a digit or a letter
+%
+\def\@DigitLetter#1{%
+ MG\fi
+ \@TempBoolfalse
+ \ifnum `\` < #1\relax % small letter?
+ \ifnum `\{ > #1\relax
+ \@TempBooltrue
+ \fi
+ \fi
+ \ifnum `\@ < #1\relax % capital letter?
+ \ifnum `\[ > #1\relax
+ \@TempBooltrue
+ \fi
+ \fi
+ \ifnum `\/ < #1\relax % digit?
+ \ifnum `\: > #1\relax
+ \@TempBooltrue
+ \fi
+ \fi
+ \if@TempBool
+}
+
+\endinput