Browse Source

Makros und Debugging

Signed-off-by: Daniel Borchmann <daniel.borchmann@tu-dresden.de>
master
Daniel Borchmann 6 years ago
parent
commit
c65d13168a
  1. BIN
      htw-201516/lecture-07-macros.pdf
  2. 384
      htw-201516/lecture-07-macros.tex
  3. BIN
      htw-201516/lecture-07-macros_handout.pdf
  4. BIN
      htw-201516/uebung-8.pdf
  5. 97
      htw-201516/uebung-8.tex

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

Binary file not shown.

384
htw-201516/lecture-07-macros.tex

@ -0,0 +1,384 @@
\input{preamble}
\subtitle{Makros und Debugging}
\date{2016-01-11}
\begin{document}
\begin{frame}
\frametitle{Ziele}
\onslide<+->
\begin{itemize}
\item<+-> Einen kleinen Einblick gewinnen, wie \LaTeX\ (\TeX) funktioniert
\item<+-> Lernen, eigene Makros und Umgebungen zu schreiben
\item<+-> \LaTeX-Fehlermeldungen verstehen und beheben
\end{itemize}
\end{frame}
\section{Wie funktionieren \LaTeX-Makros?}
\begin{frame}[fragile]
\frametitle{Wie \LaTeX\ den Quelltext sieht}
\onslide<+->
\TeX\ (und damit auch \LaTeX) arbeiten mit Hilfe von \emph{Makros}
\onslide<+->
\begin{Beispiel}
Wenn \TeX\ das Makro
\begin{lstlisting}
\TeX
\end{lstlisting}
im Quelltext sieht, wird dieses \emph{expandiert} durch\onslide<+->
\begin{lstlisting}
T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
\end{lstlisting}
\end{Beispiel}
\onslide<+->
\begin{block}{Expansion}
\begin{itemize}
\item<+-> Expandiert werden nur \emph{definierte} Makros.
\item<+-> \emph{Primitive} Makros werden direkt von \TeX\ verarbeitet
\item<+-> Menge der primitiven Makros ist fest, definierte Makros können vom
Benutzer hinzugefügt werden
\end{itemize}
\end{block}
\end{frame}
\section{Makrodefinitionen}
\begin{frame}[fragile]
\frametitle{Makrodefinitionen in \LaTeX}
Zur Definition neuer Makros stehen in \LaTeX\ drei Arten von Makros bereit:
\onslide<+->
\begin{itemize}
\item<+-> \lstinline|\newcommand| zur Definition neuer Makros
\item<+-> \lstinline|\renewcommand| zur Neudefinition bereits bestehender
Makros
\item<+-> \lstinline|\providecommand| zur Definition eines Makros, sofern dies
noch nicht definiert ist
\item<+-> \texttt{*}-Varianten, die Makros definieren, deren Argumente keine
Absätze enthalten dürfen
\item<+-> \lstinline|\DeclareRobustCommand| zur Definition
\emph{nicht-zerbrechlicher} Befehle
\end{itemize}
\onslide<+->
\begin{Beispiel}
\begin{lstlisting}
\newcommand{\bsp}{beispielsweise}
\end{lstlisting}
\end{Beispiel}
\onslide<+->
\begin{block}{Hinweis}
Makrodefinitionen sollten in der Präambel stehen.
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Argumente}
\onslide<+->
Makros können auch \emph{Argumente} bekommen
\onslide<+->
\begin{Beispiel}
\begin{lstlisting}
\newcommand{\inBlau}[1]{\textcolor{blue}{#1}}
\end{lstlisting}
\end{Beispiel}
\onslide<+->
\begin{block}{Allgemein gilt}
\begin{itemize}
\item<+-> Argumente beginnen mit \texttt{\#}
\item<+-> Erlaubt sind maximal 9 Argumente
\item<+-> Argumente können beliebig oft und in beliebiger Reihenfolge in der
Makrodefinition verwendet werden
\end{itemize}
\end{block}
\onslide<+->
\medskip{}
\begin{block}{Hinweis}
\begin{itemize}
\item<+-> Alle Argumente sind obligatorisch
\item<+-> \lstinline|\newcommand| kann auch Makros mit einem optionalen
Argument definieren.
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Andere Arten der Makrodefinition}
\onslide<+->
\onslide<+->
\begin{block}{In \TeX}
\begin{itemize}
\item<+-> Mittels \lstinline|\def|:
\begin{lstlisting}
\def\inBlau#1{\textcolor{blue}{#1}}
\end{lstlisting}
\item<+-> Definitionen flexibler, aber auch fehleranfälliger
\end{itemize}
\end{block}
\onslide<+->
\begin{block}{In \LaTeX3}
\begin{itemize}
\item<+-> Mit dem Kommando \lstinline|\DeclareDocumentCommand|
\begin{lstlisting}
\DeclareDocumentCommand \chapter { s o m } {
\IfBooleanTF {#1}
{ \typesetstarchapter {#3} }
{ \typesetnormalchapter {#2} {#3} } }
\end{lstlisting}
\item<+-> Ermöglicht explizite Angabe der \emph{Signatur} eines Makros
\item<+-> Mit Paket \lstinline|xparse| in \LaTeX\ verwendbar
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Umgebungsdefinitionen}
\onslide<+->
Neue Umgebungen können ebenfalls definiert werden \onslide<+->
\begin{Beispiel}
\begin{lstlisting}
\newenvironment{sketch}[1]
{\begingroup\color{#1}} % begin-Definition
{\endgroup} % end-Definition
...
\begin{sketch}{gray}
...
\end{sketch}
\end{lstlisting}
\end{Beispiel}
\medskip{}
\onslide<+->
Argumente können nur im \texttt{begin}-Teil genutzt werden.
\end{frame}
\section{Ausblick: \enquote{Programmieren} in \TeX}
\begin{frame}[fragile]
\frametitle{Plain\TeX}
\small
\begin{lstlisting}[frame=none]
\newif\ifprime \newif\ifunknown % boolean variables
\newcount\n \newcount\p \newcount\d \newcount\a % integer variables
\def\primes#1{2,~3% % assume that #1 is at least 3
\n=#1 \advance\n by -2 % n more to go
\p=5 % odd primes starting with p
\loop\ifnum\n>0 \printifprime\advance\p by 2\repeat}
\def\printp{, % we will invoke \printp if \p is prime
\ifnum\n=1 and~\fi % `and' precedes the last value
\number\p \advance\n by -1 }
\def\printifprime{\testprimality \ifprime\printp\fi}
\def\testprimality{{\d=3 \global\primetrue
\loop\trialdivision \ifunknown\advance\d by 2\repeat}}
\def\trialdivision{\a=\p \divide\a by \d
\ifnum\a>\d \unknowntrue\else\unknownfalse\fi
\multiply\a by \d
\ifnum\a=\p \global\primefalse\unknownfalse\fi}
The first thirty prime numbers are \primes{30}. \bye
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle{Lua\LaTeX}
\onslide<+->
\footnotesize
\begin{lstlisting}[frame=none]
\documentclass[tikz,border=10pt]{standalone}
\usepackage{pgfplots}
\usepackage{luacode}
\begin{luacode}
function weierstrass(x0, x1, n, a, b, epsilon)
local out = assert(io.open("tmp.data", "w"))
...
\end{luacode}
\begin{document}
\directlua{weierstrass(-2,2,500,0.3,5,1.e-12)}
\begin{tikzpicture}
\begin{axis}[axis lines=middle, ymin=-1.5, ymax=1.75]
\addplot[thick] table {tmp.data};
\end{axis}
\end{tikzpicture}
\end{document}
\end{lstlisting}
\end{frame}
\section{Debugging}
\begin{frame}[fragile]
\frametitle{Fehlermeldungen in \LaTeX}
\onslide<+->
\begin{block}{Problem \dots}
\begin{itemize}
\item<+-> Fehlermeldungen in \LaTeX\ sind meist schwer verständlich
\item<+-> Ursache: Fehler werden meist oft erst erkannt, \emph{nachdem} alle
Makros expandiert worden sind
\item<+-> Fehlerbeschreibung ist deswegen meist \emph{nicht hilfreich}
\end{itemize}
\end{block}
\onslide<+->
\begin{block}{Allgemeine Lösungstrategien}
\begin{itemize}
\item<+-> Ordnung im \TeX-Dokument
\item<+-> Fehlereinkreisung durch \enquote{binäre Suche}
\item<+-> \lstinline|\RequirePackage{nag}| zum Auffinden veralteter Befehle
\item<+-> Verwendung von externen \emph{Prüfprogrammen} wie \texttt{lacheck}
oder \texttt{chktex}
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{\enquote{Klassische} Fehlermeldungen}
\onslide<+->
\begin{itemize}
\item<+-> Schließende \} ohne dazu passende, öffnende \{
\begin{verbatim}
! Too many }'s.
l.6 \date December 2004}
\end{verbatim}
\item<+-> Undefinierter Befehl (meistens vertippt)
\begin{verbatim}
! Undefined control sequence.
l.6 \dtae
{December 2004}
\end{verbatim}
\item<+-> Mathematikbefehl außerhalb des Mathematikmodus' benutzt
\begin{verbatim}
! Missing $ inserted
\end{verbatim}
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{\enquote{Klassische} Fehlermeldungen}
\onslide<+->
\begin{itemize}
\item<+-> Unerlaubter Absatz im Argument eines Makros
\begin{verbatim}
Runaway argument?
{December 2004 \maketitle
! Paragraph ended before \date was complete.
<to be read again>
\par
l.8
\end{verbatim}
\item<+-> Fehlendes \lstinline|\item| in Aufzählung
\begin{verbatim}
! LaTeX Error: Something's wrong--perhaps a missing \item.
...
l.37 \end{itemize}
\end{verbatim}
\end{itemize}
\onslide<+->
Mehr Hilfe unter
\begin{itemize}
\item<+-> \url{https://en.wikibooks.org/wiki/LaTeX/Errors_and_Warnings}
\item<+-> Lokale \TeX\ User-Group (\url{http://tug-dd.kxpq.de})
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Mehr Informationen bei Fehlern}
\onslide<+->
\TeX\ (und damit auch \LaTeX) kann dazu gebracht werden, bei Fehlern mehr
Informationen auszugeben.
\begin{itemize}
\item<+-> \lstinline|\errorcontextlines=5| im Dokument sorgt dafür, dass bei
Fehlern die ersten 5 Expansionsstufen angezeigt werden.
\item<+-> \lstinline|\listfiles| in der Präambel zeigt die Versionen aller
geladenen Pakete an
\item<+-> Viele \emph{Tracing-Befehle} sind direkt in \TeX\ eingebaut
\begin{lstlisting}
\tracingmacros=1
\tracingcommands=1
\tracingall
\end{lstlisting}
(Siehe auch
\url{https://tex.stackexchange.com/questions/60491/latex-tracing-commands-list})
\item<+-> \lstinline|\usepackage{trace}|
\end{itemize}
\end{frame}
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% TeX-engine: luatex
%%% End:
% LocalWords: Makrodefinition Umgebungsdefinitionen

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

Binary file not shown.

BIN
htw-201516/uebung-8.pdf

Binary file not shown.

97
htw-201516/uebung-8.tex

@ -0,0 +1,97 @@
\documentclass{latex-htw-uebung}
\title{8. Übungsblatt}
\date{11.~Januar~2015}
\begin{document}
\NewTask Makros: übernimm den folgenden \LaTeX{}-Code in ein Datei deiner Wahl und
übersetze das Dokument.
\begin{lstlisting}
\documentclass[ngerman]{article}
\usepackage[utf8]{inputenc}\usepackage{babel}\usepackage[T1]{fontenc}
\newcommand{\rns}{Ribonukleinsäure}
\begin{document}
Der Unterschied zwischen \rns{} und Desoxyribonukleinsäure ist, dass \ldots
\end{document}
\end{lstlisting}
Was kannst du beim entstandenen Dokument beobachten?
Verändere den Quellcode wie folgt und schaue dir jeweils das
Ergebnis nach dem Übersetzen an:
\begin{itemize}
\item Entferne die geschweiften Klammern bei dem Aufruf
\lstinline|\rns{}|.
\item Füge einen Backslash hinter \lstinline|\rns| hinzu.
\item Erstelle ein Makro namens \lstinline|\dns|, welches
\lstinline|Desoxyribonukleinsäure| ersetzt.
\item Füge das folgende Makro zu deiner Präambel hinzu:
\begin{center}
\lstinline|\newcommand{\entfernung}[1]{#1 Kilometer}|
\end{center}
Rufe das Makro mit \lstinline|\entfernung{123}| im Text auf (am
besten du verwendest es in einem Satz). Ersetze danach die
Entfernungsangabe von Kilometer in Zentimeter.
\item Füge das folgende Makro zu deiner Präambel hinzu:
\begin{center}
\lstinline|\newcommand{\backmich}[3]{#1 Eier, #2g Mehl, und #3ml Wasser}|
\end{center}
Schreibe danach folgenden Satz in dein Dokument:
\begin{center}
\lstinline|Zum backen dieses Kuchens benötigt man \backmich{2}{200}{300}|
\end{center}
\item Schreibe basierend auf \lstinline|\backmich| ein neues
Makro namens \lstinline{\backmichnuss}, welches einen weiteren
Parameter besitzt, die Anzahl an Pekannüssen.
\end{itemize}
\NewTask Umgebungen:
Füge zum Dokument der letzten Aufgabe den folgenden Code in der
Präambel hinzu:
\begin{lstlisting}
\newenvironment{weisheit}[1]{
\bigskip
\begin{center}
\hfill\textbf{Dies ist Weisheit Nr. #1}\\
\rule{12cm}{0.1cm}\\
\rule{1ex}{1ex}
}{
\rule{1ex}{1ex}\\
\rule{12cm}{0.1cm}\\
\end{center}
}
\end{lstlisting}
Benutze dann die soeben definierte Umgebung, indem du den folgenden Aufruf an eine
geeignete Stelle schreibst:
\begin{lstlisting}
\begin{weisheit}{23}
Mathematik ist deine Rettung!
\end{weisheit}
\end{lstlisting}
Arbeite nun die folgenden Punkte ab:
\begin{itemize}
\item Schlage die Bedeutung der unbekannten
\LaTeX{}-Befehle (\texttt{bigskip,hfill,rule}) nach.
\item Erarbeite dir, was welche Zeile der Umgebungsdefinition bewirkt,
also was sie genau bei der Verwendung dieser Umgebung auslöst.
\item Verändere die Definition der Umgebung \lstinline|weisheit|, so
dass
\begin{enumerate}
\item \enquote{\lstinline|Weisheit Nr.|} anstelle von \enquote{\lstinline|Dies ist Weisheit Nr.|}
erscheint und dieses schräg gesetzt wird.
\item Nach dem unteren \enquote{Balken} zentriert in dicker Schrift
steht: \enquote{(Eine der vielen Weisheiten von Tom)}.
\end{enumerate}
\end{itemize}
\end{document}
%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% ispell-local-dictionary: "de_DE"
%%% End:
Loading…
Cancel
Save