latex-course/lectures/lecture-05-macros.tex

385 lines
8.8 KiB
TeX

\documentclass{latexkurs}
\subtitle{Makros und Debugging}
\date{\dateSixthLecture}
\begin{document}
\maketitle
\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
\url{https://en.wikibooks.org/wiki/LaTeX/Errors_and_Warnings}
\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