summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/gmdoc-enhance/gmdoc-enhance.sty
blob: 594f58fceae2bb8727df976a9051fa7dc1974e2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
%%
%% This is file `gmdoc-enhance.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% gmdoc-enhance.dtx  (with options: `package')
%% 
%%  ,--------------------------------------------------.
%%  |  Das ist eine generierte Datei.                  |
%%  |                                                  |
%%  | (c) 2008 Paul Ebermann.                          |
%%  '--------------------------------------------------'
%%  (C) 2009 Paul Ebermann
%%
%%   Package gmdoc-enhance - Verbesserungen für gmdoc.
%%
%%   Die Datei gmdoc-enhance.dtx sowie die dazugehörige
%%   gmdoc-enhance.ins sowie die damit generierte
%%   gmdoc-enhance.sty stehen unter der
%%   "LaTeX Project Public License" (LPPL, zu finden
%%   unter http://www.latex-project.org/lppl/, sowie
%%   auch in den meisten TeX-Distributionen in
%%   texmf/docs/latex/base/lppl*.txt), Version 1.3b oder
%%   später (nach Wahl des Verwenders).
%%
%%   Der 'maintenance-status' ist (zur Zeit) 'author-maintained'.
%%
%%   Das heißt u.a., die Dateien dürfen frei vertrieben werden,
%%   bei Änderungen (durch andere Personen als Paul Ebermann)
%%   ist aber der Name der Datei zu ändern.
\NeedsTeXFormat{LaTeX2e}[2003/12/01]%
\ProvidesPackage{gmdoc-enhance}[2009/02/20 v0.2 Verbesserungen fuer gmdoc.]%

\RequirePackage{gmdoc}[2008/10/04]%

\newcommand*{\InlineCommentsWithPercent}{%
  \let\gmde@org@ifilrr = \ifilrr% Wir merken uns dir Original-Einstellung
  \ilrrtrue% Wir schalten auf Flatter- statt Blocksatz für die
  \let\gmd@percenthack\gmde@percenthack% Außerdem verwenden wir unsere
}%
\newcommand*{\normalInlineComments}{%
  \let\ifilrr = \gmde@org@ifilrr% Wir setzen die Block/Flattersatz-Einstellung
  \let\gmd@percenthack \gmde@org@percenthack% Dies setzen wir auf aufs
}%
\let \gmde@org@percenthack = \gmd@percenthack%
\def\gmde@percenthack{%
  \ifprevhmode%
     \aftergroup\gmde@specialSpaces% Diese Zeile ist neu -- wir schalten
     \aftergroup\gmde@kommentarStart% Das Original war hier
   \else%
     \aftergroup\gmd@narrcheckifds@ne%
   \fi%
}%

\catcode`\ =\active%
\def\gmde@activeSpace{ }%
\catcode`\ =10%

\def\gmde@specialSpaces{%
  \catcode`\ =\active% Aktives Leerzeichen.
  \@xa\let\gmde@activeSpace=\gmde@discrSpace% Und es soll die
  \exhyphenpenalty=0% Das setzt die Strafen für Umbrüche an diesen
  \hyphenpenalty=1000% Dafür stellen wir die Strafen für normale
  \let\@codetonarrskip\gmde@codetonarrskip%  Wir sorgen dafür, dass mit
  \def\@tempa{gmde@hyphenchar-%
    \@xa\string\the\font}% der Name für unsere zu definierende
  % Kontrollsequenz. Er enthält den internen Namen der Schrift.
  \@ifundefined{\@tempa}{%
    \@xa\edef\csname \@tempa\endcsname{%
      \the\hyphenchar\font }%
  }{% Wenn wir es schon vorher definiert haben,
  }%
  \edef\gmde@hyphenreset{%
    \hyphenchar\font=%
    \@xa\noexpand%
    \csname \@tempa\endcsname%
  }%
  \hyphenchar\font=-1 % Das ist
}%

\def\gmde@hyphenreset{}%

\let\gmde@org@codetonarrskip = \@codetonarrskip%
\let\gmde@codetonarrskip     = \@codetonarrskip
\g@addto@macro\gmde@codetonarrskip{\gmde@normalSpaces}%

\def\gmde@kommentarStart{%
  \hbox{{%
    \@ifpackageloaded{color}{\color{gray}}{}% Falls das \pk{color}-Paket
    \ttfamily\code@delim\quad}}%
}%

\def\gmde@discrSpace{%
  \ifx\protect\@typeset@protect%
    \ifinner%
        \space%  Wenn wir in einer inneren Box sind, soll das aktive
    \else%
      \ifhmode%
        \unskip% Hmm, ich bin mir nicht ganz sicher, warum dieser
        \discretionary{% Die "`Expansion"' dieses '\discretionary'-Objektes
        }{\gmde@kommentarStart% Dafür taucht am Ende der vorherigen Zeile
        }{% Falls kein Umbruch an dieser Stelle erfolgte, ist es
        }%
        ~% Jetzt setzen wir noch ein nicht-umbrechbares Leerzeichen. Falls
      \else%
        \space% Außerhalb des horizontalen Modus (d.h. im Mathe- und im
      \fi%
    \fi%
    \afterfi{%
      \gmde@gobbleActiveSpaces}% Am Ende fressen wir alle weiteren
  \else%
    \space% Falls wir nicht im Typeset-Modus sind, sondern etwa in eine Datei
  \fi%
}%
\def\gmde@gobbleActiveSpaces{%
  \@xa\@ifnextchar\gmde@activeSpace% Wir überprüfen, ob das
  % nächste Token ein aktives Leerzeichen ist.
  {% Falls ja, \dots
    \@xa\gmde@gobbleActiveSpaces\@gobble% entsorgen wir es
    % mit '\@gobble' und rufen uns dann selbst rekursiv auf.
  }{}% Im anderen Fall machen wir gar nichts, womit die Rekursion
  % beendet ist.
}%
\def\gmde@normalSpaces{%
  \gmde@hyphenreset% Wir rufen das Makro auf, welches den '\hyphenchar' auf
  \exhyphenpenalty=50 \hyphenpenalty=50 % Die Strafen erhalten auch ihren normalen Wert.
  \@xa\let\gmde@activeSpace = \space% Das aktive Leerzeichen wird ein normales,
  \catcode`\           = 10%     und Leerzeichen sind ab jetzt nicht mehr
  \let\@codetonarrskip  = \gmde@org@codetonarrskip% Wir setzen auch dieses
}%

\newcommand*{\activateVisibleComments}{%
  \let \gmd@narrcheckifds = \gmde@narrcheckifds%
  \let \gmd@narrcheckifds@ne = \gmde@narrcheckifds@ne%
  \let \gmd@eatlspace = \gmde@eatlspace%
}
\newcommand*{\setVisibleCommentChar}[1]{%
  \let \gmde@visibleCommentChar = #1%
}%

\setVisibleCommentChar{!}%

\newcommand*{\setVisibleCommentColor}{%
  \@ifnextchar[\gmde@setVCColor@Opt%
  \gmde@setVCColor@%
}%
\def\gmde@setVCColor@#1{%
  \def\gmde@visibleCommentColor{\@ifpackageloaded{color}{\color{#1}}{}}%
}%
\def\gmde@setVCColor@Opt[#1]#2{%
  \def\gmde@visibleCommentColor{\@ifpackageloaded{color}{\color[#1]{#2}}}%
}%

\let\gmde@visibleCommentColor\@empty

\let\gmde@org@narrcheckifds = \gmd@narrcheckifds
\let\gmde@org@narrcheckifds@ne = \gmd@narrcheckifds@ne

\def\gmde@narrcheckifds{%
  \gmde@narrcheckifds@ne{\ignorespaces}%
}%
\def\gmde@narrcheckifds@ne#1{%
  \@ifnextchar\gmde@visibleCommentChar% Falls das nächste Zeichen
    \gmde@deactivatedCode% setzen wir den Rest als deaktivierten Code.
    {\gmde@org@narrcheckifds@ne{#1}}% Ansonsten rufen wir den
}%

\def\gmde@deactivatedCode{%
  \gmd@textEOL% Wir tun so, als wäre das eine neue Zeile.
  \gmde@deactivatedcodePrefix%  Das wird als erstes Token an '\gmd@textEOL'
  % übergeben. Dadurch, dass es nur eines ist, wird es nicht als '%'
  % erkannt, sondern (nachdem wieder in den Verbatim-Modus gewechselt wurde)
  % ausgegeben.
}
\def\gmde@deactivatedcodePrefix{%
  \gmde@visibleCommentColor%
  \code@delim% Zunächst geben wir ein '%'-Zeichen aus.
  \@afternarrgfalse\@aftercodegtrue\@codeskipputgtrue% Diese boolean-Werte
  \@firstoftwo% Und jetzt entsorgen wir das zweite
}%

\def\gmde@eatlspace#1{%
  \ifx\gmd@texcodespace#1% Wenn das nächste Zeichen ein Leerzeichen, so \dots
    \advance\gmd@ldspaceswd by \gmd@spacewd% erhöhen wir die Einrückung,
    \afteriffifi{\gmde@eatlspace}% \dots wiederholen das ganze.
  \else%
    \if\code@delim\@nx#1% Wenn das nächste Zeichen '%' ist \dots
      \afterfifi{%
        \@ifnextchar\gmde@visibleCommentChar{% \dots und das folgende Zeichen
          \let\gmd@charbychar=\gmde@charbychar% Wir merken uns also, dass
          % dessen Präfix gezeigt werden muss, \dots
          \gmd@typesettexcode% \dots und rufen die normale Code-Formatierungs-Funktion auf, wobei das '!' dabei weggeworfen wird.
        }{%
          \gmd@ldspaceswd=\z@%
          \gmd@continuenarration#1%
        }%
      }%
    \else%
      % Ist das nächste Zeichen weder ' ' noch '%', so fängt hier der
      % Quelltext an.
      \afterfifi{\gmd@typesettexcode#1}%
    \fi%
  \fi%
}%

\let\gmde@org@charbychar\gmd@charbychar%

\def\gmde@charbychar{%
  \let\gmd@charbychar=\gmde@org@charbychar
  \gmde@deactivatedcodePrefix
  \gmd@charbychar%
}%



   \AtBeginDocument{\QueerCharOne}% \pk{inputenc} mit \pk{utf8x} definiert

\newcommand*{\normalInput}[1]{%
  % Wir packen alles in eine Gruppe, dann ist das Wiederherstellen der
  % Einstellungen nicht so schwer.
  \begin{StraightEOL}%
     \gmde@normalSpaces%
     \catcode`\%=14%
     \InputIfFileExists{#1}{}{}%
  \end{StraightEOL}%
}%

\let\gmd@docstripshook\@empty%

\DeclareOption{visible}{%
  \setVisibleCommentColor{blue}%
  \activateVisibleComments%
}%
\DeclareOption{inline}{%
  \InlineCommentsWithPercent%
}%
\ProcessOptions*\relax%
\endinput
%%
%% End of file `gmdoc-enhance.sty'.