385 lines
8.8 KiB
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
|