\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. \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