forked from dbo/latex-course
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
384 lines
8.9 KiB
384 lines
8.9 KiB
\documentclass{latexkurs} |
|
\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
|
|
|