forked from dbo/latex-course
5 changed files with 481 additions and 0 deletions
Binary file not shown.
@ -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 |
Binary file not shown.
Binary file not shown.
@ -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…
Reference in new issue