Browse Source

Makros und Debugging

Signed-off-by: Daniel Borchmann <daniel.borchmann@tu-dresden.de>
master
Daniel Borchmann 4 years ago
parent
commit
c65d13168a

BIN
htw-201516/lecture-07-macros.pdf View File


+ 384
- 0
htw-201516/lecture-07-macros.tex View File

@@ -0,0 +1,384 @@
1
+\input{preamble}
2
+\subtitle{Makros und Debugging}
3
+\date{2016-01-11}
4
+
5
+\begin{document}
6
+
7
+\begin{frame}
8
+  \frametitle{Ziele}
9
+
10
+  \onslide<+->
11
+
12
+  \begin{itemize}
13
+  \item<+-> Einen kleinen Einblick gewinnen, wie \LaTeX\ (\TeX) funktioniert
14
+  \item<+-> Lernen, eigene Makros und Umgebungen zu schreiben
15
+  \item<+-> \LaTeX-Fehlermeldungen verstehen und beheben
16
+  \end{itemize}
17
+
18
+\end{frame}
19
+
20
+\section{Wie funktionieren \LaTeX-Makros?}
21
+
22
+\begin{frame}[fragile]
23
+  \frametitle{Wie \LaTeX\ den Quelltext sieht}
24
+
25
+  \onslide<+->
26
+
27
+  \TeX\ (und damit auch \LaTeX) arbeiten mit Hilfe von \emph{Makros}
28
+
29
+  \onslide<+->
30
+  \begin{Beispiel}
31
+    Wenn \TeX\ das Makro
32
+\begin{lstlisting}
33
+\TeX
34
+\end{lstlisting}
35
+    im Quelltext sieht, wird dieses \emph{expandiert} durch\onslide<+->
36
+\begin{lstlisting}
37
+T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
38
+\end{lstlisting}
39
+  \end{Beispiel}
40
+
41
+  \onslide<+->
42
+
43
+  \begin{block}{Expansion}
44
+    \begin{itemize}
45
+    \item<+-> Expandiert werden nur \emph{definierte} Makros.
46
+    \item<+-> \emph{Primitive} Makros werden direkt von \TeX\ verarbeitet
47
+    \item<+-> Menge der primitiven Makros ist fest, definierte Makros können vom
48
+      Benutzer hinzugefügt werden
49
+    \end{itemize}
50
+  \end{block}
51
+
52
+\end{frame}
53
+
54
+\section{Makrodefinitionen}
55
+
56
+\begin{frame}[fragile]
57
+  \frametitle{Makrodefinitionen in \LaTeX}
58
+
59
+  Zur Definition neuer Makros stehen in \LaTeX\ drei Arten von Makros bereit:
60
+  \onslide<+->
61
+  \begin{itemize}
62
+  \item<+-> \lstinline|\newcommand| zur Definition neuer Makros
63
+  \item<+-> \lstinline|\renewcommand| zur Neudefinition bereits bestehender
64
+    Makros
65
+  \item<+-> \lstinline|\providecommand| zur Definition eines Makros, sofern dies
66
+    noch nicht definiert ist
67
+  \item<+-> \texttt{*}-Varianten, die Makros definieren, deren Argumente keine
68
+    Absätze enthalten dürfen
69
+  \item<+-> \lstinline|\DeclareRobustCommand| zur Definition
70
+    \emph{nicht-zerbrechlicher} Befehle
71
+  \end{itemize}
72
+
73
+  \onslide<+->
74
+
75
+  \begin{Beispiel}
76
+\begin{lstlisting}
77
+\newcommand{\bsp}{beispielsweise}
78
+\end{lstlisting}
79
+  \end{Beispiel}
80
+
81
+  \onslide<+->
82
+
83
+  \begin{block}{Hinweis}
84
+    Makrodefinitionen sollten in der Präambel stehen.
85
+  \end{block}
86
+
87
+\end{frame}
88
+
89
+\begin{frame}[fragile]
90
+  \frametitle{Argumente}
91
+
92
+  \onslide<+->
93
+
94
+  Makros können auch \emph{Argumente} bekommen
95
+
96
+  \onslide<+->
97
+
98
+  \begin{Beispiel}
99
+\begin{lstlisting}
100
+\newcommand{\inBlau}[1]{\textcolor{blue}{#1}}
101
+\end{lstlisting}
102
+  \end{Beispiel}
103
+
104
+  \onslide<+->
105
+
106
+  \begin{block}{Allgemein gilt}
107
+    \begin{itemize}
108
+    \item<+-> Argumente beginnen mit \texttt{\#}
109
+    \item<+-> Erlaubt sind maximal 9 Argumente
110
+    \item<+-> Argumente können beliebig oft und in beliebiger Reihenfolge in der
111
+      Makrodefinition verwendet werden
112
+    \end{itemize}
113
+  \end{block}
114
+
115
+  \onslide<+->
116
+
117
+  \medskip{}
118
+
119
+  \begin{block}{Hinweis}
120
+    \begin{itemize}
121
+    \item<+-> Alle Argumente sind obligatorisch
122
+    \item<+-> \lstinline|\newcommand| kann auch Makros mit einem optionalen
123
+      Argument definieren.
124
+    \end{itemize}
125
+  \end{block}
126
+
127
+\end{frame}
128
+
129
+\begin{frame}[fragile]
130
+  \frametitle{Andere Arten der Makrodefinition}
131
+
132
+  \onslide<+->
133
+  \onslide<+->
134
+
135
+  \begin{block}{In \TeX}
136
+    \begin{itemize}
137
+    \item<+-> Mittels \lstinline|\def|:
138
+\begin{lstlisting}
139
+\def\inBlau#1{\textcolor{blue}{#1}}
140
+\end{lstlisting}
141
+    \item<+-> Definitionen flexibler, aber auch fehleranfälliger
142
+    \end{itemize}
143
+  \end{block}
144
+
145
+  \onslide<+->
146
+
147
+  \begin{block}{In \LaTeX3}
148
+    \begin{itemize}
149
+    \item<+-> Mit dem Kommando \lstinline|\DeclareDocumentCommand|
150
+\begin{lstlisting}
151
+\DeclareDocumentCommand \chapter { s o m } {
152
+  \IfBooleanTF {#1}
153
+    { \typesetstarchapter {#3} }
154
+    { \typesetnormalchapter {#2} {#3} } }
155
+\end{lstlisting}
156
+    \item<+-> Ermöglicht explizite Angabe der \emph{Signatur} eines Makros
157
+    \item<+-> Mit Paket \lstinline|xparse| in \LaTeX\ verwendbar
158
+    \end{itemize}
159
+  \end{block}
160
+
161
+\end{frame}
162
+
163
+\begin{frame}[fragile]
164
+  \frametitle{Umgebungsdefinitionen}
165
+
166
+  \onslide<+->
167
+
168
+  Neue Umgebungen können ebenfalls definiert werden \onslide<+->
169
+
170
+  \begin{Beispiel}
171
+\begin{lstlisting}
172
+\newenvironment{sketch}[1]
173
+  {\begingroup\color{#1}}       % begin-Definition
174
+  {\endgroup}                   % end-Definition
175
+...
176
+\begin{sketch}{gray}
177
+  ...
178
+\end{sketch}
179
+\end{lstlisting}
180
+  \end{Beispiel}
181
+
182
+  \medskip{}
183
+
184
+  \onslide<+->
185
+
186
+  Argumente können nur im \texttt{begin}-Teil genutzt werden.
187
+
188
+\end{frame}
189
+
190
+
191
+\section{Ausblick: \enquote{Programmieren} in \TeX}
192
+
193
+\begin{frame}[fragile]
194
+  \frametitle{Plain\TeX}
195
+
196
+  \small
197
+
198
+\begin{lstlisting}[frame=none]
199
+\newif\ifprime \newif\ifunknown                 % boolean variables
200
+\newcount\n \newcount\p \newcount\d \newcount\a % integer variables
201
+\def\primes#1{2,~3%                  % assume that #1 is at least 3
202
+  \n=#1 \advance\n by -2             % n more to go
203
+  \p=5                               % odd primes starting with p
204
+  \loop\ifnum\n>0 \printifprime\advance\p by 2\repeat}
205
+\def\printp{,               % we will invoke \printp if \p is prime
206
+  \ifnum\n=1 and~\fi        % `and' precedes the last value
207
+  \number\p \advance\n by -1 }
208
+\def\printifprime{\testprimality \ifprime\printp\fi}
209
+\def\testprimality{{\d=3 \global\primetrue
210
+  \loop\trialdivision \ifunknown\advance\d by 2\repeat}}
211
+\def\trialdivision{\a=\p \divide\a by \d
212
+  \ifnum\a>\d \unknowntrue\else\unknownfalse\fi
213
+  \multiply\a by \d
214
+  \ifnum\a=\p \global\primefalse\unknownfalse\fi}
215
+
216
+The first thirty prime numbers are \primes{30}. \bye
217
+\end{lstlisting}
218
+
219
+\end{frame}
220
+
221
+\begin{frame}[fragile]
222
+  \frametitle{Lua\LaTeX}
223
+
224
+  \onslide<+->
225
+
226
+  \footnotesize
227
+
228
+\begin{lstlisting}[frame=none]
229
+\documentclass[tikz,border=10pt]{standalone}
230
+\usepackage{pgfplots}
231
+\usepackage{luacode}
232
+
233
+\begin{luacode}
234
+  function weierstrass(x0, x1, n, a, b, epsilon)
235
+    local out = assert(io.open("tmp.data", "w"))
236
+    ...
237
+\end{luacode}
238
+
239
+\begin{document}
240
+
241
+\directlua{weierstrass(-2,2,500,0.3,5,1.e-12)}
242
+\begin{tikzpicture}
243
+  \begin{axis}[axis lines=middle, ymin=-1.5, ymax=1.75]
244
+    \addplot[thick] table {tmp.data};
245
+  \end{axis}
246
+\end{tikzpicture}
247
+
248
+\end{document}
249
+\end{lstlisting}
250
+
251
+\end{frame}
252
+
253
+
254
+\section{Debugging}
255
+
256
+\begin{frame}[fragile]
257
+  \frametitle{Fehlermeldungen in \LaTeX}
258
+
259
+  \onslide<+->
260
+
261
+  \begin{block}{Problem \dots}
262
+    \begin{itemize}
263
+    \item<+-> Fehlermeldungen in \LaTeX\ sind meist schwer verständlich
264
+    \item<+-> Ursache: Fehler werden meist oft erst erkannt, \emph{nachdem} alle
265
+      Makros expandiert worden sind
266
+    \item<+-> Fehlerbeschreibung ist deswegen meist \emph{nicht hilfreich}
267
+    \end{itemize}
268
+  \end{block}
269
+
270
+  \onslide<+->
271
+
272
+  \begin{block}{Allgemeine Lösungstrategien}
273
+    \begin{itemize}
274
+    \item<+-> Ordnung im \TeX-Dokument
275
+    \item<+-> Fehlereinkreisung durch \enquote{binäre Suche}
276
+    \item<+-> \lstinline|\RequirePackage{nag}| zum Auffinden veralteter Befehle
277
+    \item<+-> Verwendung von externen \emph{Prüfprogrammen} wie \texttt{lacheck}
278
+      oder \texttt{chktex}
279
+    \end{itemize}
280
+  \end{block}
281
+
282
+\end{frame}
283
+
284
+\begin{frame}[fragile]
285
+  \frametitle{\enquote{Klassische} Fehlermeldungen}
286
+
287
+  \onslide<+->
288
+
289
+  \begin{itemize}
290
+  \item<+-> Schließende \} ohne dazu passende, öffnende \{
291
+
292
+\begin{verbatim}
293
+! Too many }'s.
294
+l.6 \date December 2004}
295
+\end{verbatim}
296
+
297
+  \item<+-> Undefinierter Befehl (meistens vertippt)
298
+
299
+\begin{verbatim}
300
+! Undefined control sequence.
301
+l.6 \dtae
302
+{December 2004}
303
+\end{verbatim}
304
+
305
+  \item<+-> Mathematikbefehl außerhalb des Mathematikmodus' benutzt
306
+
307
+\begin{verbatim}
308
+! Missing $ inserted
309
+\end{verbatim}
310
+
311
+  \end{itemize}
312
+
313
+\end{frame}
314
+
315
+\begin{frame}[fragile]
316
+  \frametitle{\enquote{Klassische} Fehlermeldungen}
317
+  \onslide<+->
318
+
319
+  \begin{itemize}
320
+  \item<+-> Unerlaubter Absatz im Argument eines Makros
321
+
322
+\begin{verbatim}
323
+Runaway argument?
324
+{December 2004 \maketitle
325
+! Paragraph ended before \date was complete.
326
+<to be read again>
327
+\par
328
+l.8
329
+\end{verbatim}
330
+
331
+  \item<+-> Fehlendes \lstinline|\item| in Aufzählung
332
+
333
+\begin{verbatim}
334
+! LaTeX Error: Something's wrong--perhaps a missing \item.
335
+...
336
+l.37   \end{itemize}
337
+\end{verbatim}
338
+  \end{itemize}
339
+
340
+  \onslide<+->
341
+
342
+  Mehr Hilfe unter
343
+  \begin{itemize}
344
+  \item<+-> \url{https://en.wikibooks.org/wiki/LaTeX/Errors_and_Warnings}
345
+  \item<+-> Lokale \TeX\ User-Group (\url{http://tug-dd.kxpq.de})
346
+  \end{itemize}
347
+
348
+\end{frame}
349
+
350
+\begin{frame}[fragile]
351
+  \frametitle{Mehr Informationen bei Fehlern}
352
+
353
+  \onslide<+->
354
+
355
+  \TeX\ (und damit auch \LaTeX) kann dazu gebracht werden, bei Fehlern mehr
356
+  Informationen auszugeben.
357
+
358
+  \begin{itemize}
359
+  \item<+-> \lstinline|\errorcontextlines=5| im Dokument sorgt dafür, dass bei
360
+    Fehlern die ersten 5 Expansionsstufen angezeigt werden.
361
+  \item<+-> \lstinline|\listfiles| in der Präambel zeigt die Versionen aller
362
+    geladenen Pakete an
363
+  \item<+-> Viele \emph{Tracing-Befehle} sind direkt in \TeX\ eingebaut
364
+\begin{lstlisting}
365
+\tracingmacros=1
366
+\tracingcommands=1
367
+\tracingall
368
+\end{lstlisting}
369
+    (Siehe auch
370
+    \url{https://tex.stackexchange.com/questions/60491/latex-tracing-commands-list})
371
+  \item<+-> \lstinline|\usepackage{trace}|
372
+  \end{itemize}
373
+
374
+\end{frame}
375
+
376
+\end{document}
377
+
378
+%%% Local Variables:
379
+%%% mode: latex
380
+%%% TeX-master: t
381
+%%% TeX-engine: luatex
382
+%%% End:
383
+
384
+%  LocalWords:  Makrodefinition Umgebungsdefinitionen

BIN
htw-201516/lecture-07-macros_handout.pdf View File


BIN
htw-201516/uebung-8.pdf View File


+ 97
- 0
htw-201516/uebung-8.tex View File

@@ -0,0 +1,97 @@
1
+\documentclass{latex-htw-uebung}
2
+
3
+\title{8. Übungsblatt}
4
+\date{11.~Januar~2015}
5
+
6
+\begin{document}
7
+
8
+\NewTask Makros: übernimm den folgenden \LaTeX{}-Code in ein Datei deiner Wahl und
9
+übersetze das Dokument.
10
+\begin{lstlisting}
11
+\documentclass[ngerman]{article}
12
+\usepackage[utf8]{inputenc}\usepackage{babel}\usepackage[T1]{fontenc}
13
+\newcommand{\rns}{Ribonukleinsäure}
14
+
15
+\begin{document}
16
+Der Unterschied zwischen \rns{} und Desoxyribonukleinsäure ist, dass \ldots
17
+\end{document}
18
+\end{lstlisting}
19
+
20
+Was kannst du beim entstandenen Dokument beobachten?
21
+
22
+Verändere den Quellcode wie folgt und schaue dir jeweils das
23
+Ergebnis nach dem Übersetzen an:
24
+\begin{itemize}
25
+\item Entferne die geschweiften Klammern bei dem Aufruf
26
+  \lstinline|\rns{}|.
27
+\item Füge einen Backslash hinter \lstinline|\rns| hinzu.
28
+\item Erstelle ein Makro namens \lstinline|\dns|, welches
29
+  \lstinline|Desoxyribonukleinsäure| ersetzt.
30
+\item Füge das folgende Makro zu deiner Präambel hinzu:
31
+  \begin{center}
32
+      \lstinline|\newcommand{\entfernung}[1]{#1 Kilometer}|
33
+  \end{center}
34
+  Rufe das Makro mit \lstinline|\entfernung{123}| im Text auf (am
35
+  besten du verwendest es in einem Satz). Ersetze danach die
36
+  Entfernungsangabe von Kilometer in Zentimeter.
37
+\item Füge das folgende Makro zu deiner Präambel hinzu:
38
+  \begin{center}
39
+      \lstinline|\newcommand{\backmich}[3]{#1 Eier, #2g Mehl, und #3ml Wasser}|
40
+  \end{center}
41
+  Schreibe danach folgenden Satz in dein Dokument:
42
+  \begin{center}
43
+    \lstinline|Zum backen dieses Kuchens benötigt man \backmich{2}{200}{300}|
44
+  \end{center}
45
+\item Schreibe basierend auf \lstinline|\backmich| ein neues
46
+  Makro namens \lstinline{\backmichnuss}, welches einen weiteren
47
+  Parameter besitzt, die Anzahl an Pekannüssen. 
48
+\end{itemize}
49
+
50
+\NewTask Umgebungen:
51
+Füge zum Dokument der letzten Aufgabe den folgenden Code in der
52
+Präambel hinzu:
53
+\begin{lstlisting}
54
+\newenvironment{weisheit}[1]{
55
+  \bigskip
56
+  \begin{center}
57
+  \hfill\textbf{Dies ist Weisheit Nr. #1}\\
58
+  \rule{12cm}{0.1cm}\\
59
+  \rule{1ex}{1ex}
60
+}{
61
+  \rule{1ex}{1ex}\\
62
+  \rule{12cm}{0.1cm}\\
63
+  \end{center}
64
+}
65
+\end{lstlisting}
66
+Benutze dann die soeben definierte Umgebung, indem du den folgenden Aufruf an eine
67
+geeignete Stelle schreibst: 
68
+\begin{lstlisting}
69
+\begin{weisheit}{23}
70
+  Mathematik ist deine Rettung!
71
+\end{weisheit}
72
+\end{lstlisting}
73
+Arbeite nun die folgenden Punkte ab:
74
+\begin{itemize}
75
+\item Schlage die Bedeutung der unbekannten
76
+  \LaTeX{}-Befehle (\texttt{bigskip,hfill,rule}) nach. 
77
+\item Erarbeite dir, was welche Zeile der Umgebungsdefinition bewirkt,
78
+  also was sie genau bei der Verwendung dieser Umgebung auslöst. 
79
+\item Verändere die Definition der Umgebung \lstinline|weisheit|, so
80
+  dass
81
+  \begin{enumerate}
82
+  \item \enquote{\lstinline|Weisheit Nr.|} anstelle von \enquote{\lstinline|Dies ist Weisheit Nr.|}
83
+   erscheint und dieses schräg gesetzt wird.
84
+  \item Nach dem unteren \enquote{Balken} zentriert in dicker Schrift
85
+    steht: \enquote{(Eine der vielen Weisheiten von Tom)}.
86
+  \end{enumerate}
87
+
88
+\end{itemize}
89
+
90
+
91
+\end{document}
92
+
93
+%%% Local Variables:
94
+%%% mode: latex
95
+%%% TeX-master: t
96
+%%% ispell-local-dictionary: "de_DE"
97
+%%% End:

Loading…
Cancel
Save