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

lecture-05-macros.tex 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. \documentclass{latexkurs}
  2. \subtitle{Makros und Debugging}
  3. \date{\dateSixthLecture}
  4. \begin{document}
  5. \maketitle
  6. \begin{frame}
  7. \frametitle{Ziele}
  8. \onslide<+->
  9. \begin{itemize}
  10. \item<+-> Einen kleinen Einblick gewinnen, wie \LaTeX\ (\TeX) funktioniert
  11. \item<+-> Lernen, eigene Makros und Umgebungen zu schreiben
  12. \item<+-> \LaTeX-Fehlermeldungen verstehen und beheben
  13. \end{itemize}
  14. \end{frame}
  15. \section{Wie funktionieren \LaTeX-Makros?}
  16. \begin{frame}[fragile]
  17. \frametitle{Wie \LaTeX\ den Quelltext sieht}
  18. \onslide<+->
  19. \TeX\ (und damit auch \LaTeX) arbeiten mit Hilfe von \emph{Makros}
  20. \onslide<+->
  21. \begin{Beispiel}
  22. Wenn \TeX\ das Makro
  23. \begin{lstlisting}
  24. \TeX
  25. \end{lstlisting}
  26. im Quelltext sieht, wird dieses \emph{expandiert} durch\onslide<+->
  27. \begin{lstlisting}
  28. T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
  29. \end{lstlisting}
  30. \end{Beispiel}
  31. \onslide<+->
  32. \begin{block}{Expansion}
  33. \begin{itemize}
  34. \item<+-> Expandiert werden nur \emph{definierte} Makros.
  35. \item<+-> \emph{Primitive} Makros werden direkt von \TeX\ verarbeitet
  36. \item<+-> Menge der primitiven Makros ist fest, definierte Makros können vom
  37. Benutzer hinzugefügt werden
  38. \end{itemize}
  39. \end{block}
  40. \end{frame}
  41. \section{Makrodefinitionen}
  42. \begin{frame}[fragile]
  43. \frametitle{Makrodefinitionen in \LaTeX}
  44. Zur Definition neuer Makros stehen in \LaTeX\ drei Arten von Makros bereit:
  45. \onslide<+->
  46. \begin{itemize}
  47. \item<+-> \lstinline|\newcommand| zur Definition neuer Makros
  48. \item<+-> \lstinline|\renewcommand| zur Neudefinition bereits bestehender
  49. Makros
  50. \item<+-> \lstinline|\providecommand| zur Definition eines Makros, sofern dies
  51. noch nicht definiert ist
  52. \item<+-> \texttt{*}-Varianten, die Makros definieren, deren Argumente keine
  53. Absätze enthalten dürfen
  54. \item<+-> \lstinline|\DeclareRobustCommand| zur Definition
  55. \emph{nicht-zerbrechlicher} Befehle
  56. \end{itemize}
  57. \onslide<+->
  58. \begin{Beispiel}
  59. \begin{lstlisting}
  60. \newcommand{\bsp}{beispielsweise}
  61. \end{lstlisting}
  62. \end{Beispiel}
  63. \onslide<+->
  64. \begin{block}{Hinweis}
  65. Makrodefinitionen sollten in der Präambel stehen.
  66. \end{block}
  67. \end{frame}
  68. \begin{frame}[fragile]
  69. \frametitle{Argumente}
  70. \onslide<+->
  71. Makros können auch \emph{Argumente} bekommen
  72. \onslide<+->
  73. \begin{Beispiel}
  74. \begin{lstlisting}
  75. \newcommand{\inBlau}[1]{\textcolor{blue}{#1}}
  76. \end{lstlisting}
  77. \end{Beispiel}
  78. \onslide<+->
  79. \begin{block}{Allgemein gilt}
  80. \begin{itemize}
  81. \item<+-> Argumente beginnen mit \texttt{\#}
  82. \item<+-> Erlaubt sind maximal 9 Argumente
  83. \item<+-> Argumente können beliebig oft und in beliebiger Reihenfolge in der
  84. Makrodefinition verwendet werden
  85. \end{itemize}
  86. \end{block}
  87. \onslide<+->
  88. \medskip{}
  89. \begin{block}{Hinweis}
  90. \begin{itemize}
  91. \item<+-> Alle Argumente sind obligatorisch
  92. \item<+-> \lstinline|\newcommand| kann auch Makros mit einem optionalen
  93. Argument definieren.
  94. \end{itemize}
  95. \end{block}
  96. \end{frame}
  97. \begin{frame}[fragile]
  98. \frametitle{Andere Arten der Makrodefinition}
  99. \onslide<+->
  100. \onslide<+->
  101. \begin{block}{In \TeX}
  102. \begin{itemize}
  103. \item<+-> Mittels \lstinline|\def|:
  104. \begin{lstlisting}
  105. \def\inBlau#1{\textcolor{blue}{#1}}
  106. \end{lstlisting}
  107. \item<+-> Definitionen flexibler, aber auch fehleranfälliger
  108. \end{itemize}
  109. \end{block}
  110. \onslide<+->
  111. \begin{block}{In \LaTeX3}
  112. \begin{itemize}
  113. \item<+-> Mit dem Kommando \lstinline|\DeclareDocumentCommand|
  114. \begin{lstlisting}
  115. \DeclareDocumentCommand \chapter { s o m } {
  116. \IfBooleanTF {#1}
  117. { \typesetstarchapter {#3} }
  118. { \typesetnormalchapter {#2} {#3} } }
  119. \end{lstlisting}
  120. \item<+-> Ermöglicht explizite Angabe der \emph{Signatur} eines Makros
  121. \item<+-> Mit Paket \lstinline|xparse| in \LaTeX\ verwendbar
  122. \end{itemize}
  123. \end{block}
  124. \end{frame}
  125. \begin{frame}[fragile]
  126. \frametitle{Umgebungsdefinitionen}
  127. \onslide<+->
  128. Neue Umgebungen können ebenfalls definiert werden \onslide<+->
  129. \begin{Beispiel}
  130. \begin{lstlisting}
  131. \newenvironment{sketch}[1]
  132. {\begingroup\color{#1}} % begin-Definition
  133. {\endgroup} % end-Definition
  134. ...
  135. \begin{sketch}{gray}
  136. ...
  137. \end{sketch}
  138. \end{lstlisting}
  139. \end{Beispiel}
  140. \medskip{}
  141. \onslide<+->
  142. Argumente können nur im \texttt{begin}-Teil genutzt werden.
  143. \end{frame}
  144. \section{Ausblick: \enquote{Programmieren} in \TeX}
  145. \begin{frame}[fragile]
  146. \frametitle{Plain\TeX}
  147. \small
  148. \begin{lstlisting}[frame=none]
  149. \newif\ifprime \newif\ifunknown % boolean variables
  150. \newcount\n \newcount\p \newcount\d \newcount\a % integer variables
  151. \def\primes#1{2,~3% % assume that #1 is at least 3
  152. \n=#1 \advance\n by -2 % n more to go
  153. \p=5 % odd primes starting with p
  154. \loop\ifnum\n>0 \printifprime\advance\p by 2\repeat}
  155. \def\printp{, % we will invoke \printp if \p is prime
  156. \ifnum\n=1 and~\fi % `and' precedes the last value
  157. \number\p \advance\n by -1 }
  158. \def\printifprime{\testprimality \ifprime\printp\fi}
  159. \def\testprimality{{\d=3 \global\primetrue
  160. \loop\trialdivision \ifunknown\advance\d by 2\repeat}}
  161. \def\trialdivision{\a=\p \divide\a by \d
  162. \ifnum\a>\d \unknowntrue\else\unknownfalse\fi
  163. \multiply\a by \d
  164. \ifnum\a=\p \global\primefalse\unknownfalse\fi}
  165. The first thirty prime numbers are \primes{30}. \bye
  166. \end{lstlisting}
  167. \end{frame}
  168. \begin{frame}[fragile]
  169. \frametitle{Lua\LaTeX}
  170. \onslide<+->
  171. \footnotesize
  172. \begin{lstlisting}[frame=none]
  173. \documentclass[tikz,border=10pt]{standalone}
  174. \usepackage{pgfplots}
  175. \usepackage{luacode}
  176. \begin{luacode}
  177. function weierstrass(x0, x1, n, a, b, epsilon)
  178. local out = assert(io.open("tmp.data", "w"))
  179. ...
  180. \end{luacode}
  181. \begin{document}
  182. \directlua{weierstrass(-2,2,500,0.3,5,1.e-12)}
  183. \begin{tikzpicture}
  184. \begin{axis}[axis lines=middle, ymin=-1.5, ymax=1.75]
  185. \addplot[thick] table {tmp.data};
  186. \end{axis}
  187. \end{tikzpicture}
  188. \end{document}
  189. \end{lstlisting}
  190. \end{frame}
  191. \section{Debugging}
  192. \begin{frame}[fragile]
  193. \frametitle{Fehlermeldungen in \LaTeX}
  194. \onslide<+->
  195. \begin{block}{Problem \dots}
  196. \begin{itemize}
  197. \item<+-> Fehlermeldungen in \LaTeX\ sind meist schwer verständlich
  198. \item<+-> Ursache: Fehler werden meist oft erst erkannt, \emph{nachdem} alle
  199. Makros expandiert worden sind
  200. \item<+-> Fehlerbeschreibung ist deswegen meist \emph{nicht hilfreich}
  201. \end{itemize}
  202. \end{block}
  203. \onslide<+->
  204. \begin{block}{Allgemeine Lösungstrategien}
  205. \begin{itemize}
  206. \item<+-> Ordnung im \TeX-Dokument
  207. \item<+-> Fehlereinkreisung durch \enquote{binäre Suche}
  208. \item<+-> \lstinline|\RequirePackage{nag}| zum Auffinden veralteter Befehle
  209. \item<+-> Verwendung von externen \emph{Prüfprogrammen} wie \texttt{lacheck}
  210. oder \texttt{chktex}
  211. \end{itemize}
  212. \end{block}
  213. \end{frame}
  214. \begin{frame}[fragile]
  215. \frametitle{\enquote{Klassische} Fehlermeldungen}
  216. \onslide<+->
  217. \begin{itemize}
  218. \item<+-> Schließende \} ohne dazu passende, öffnende \{
  219. \begin{verbatim}
  220. ! Too many }'s.
  221. l.6 \date December 2004}
  222. \end{verbatim}
  223. \item<+-> Undefinierter Befehl (meistens vertippt)
  224. \begin{verbatim}
  225. ! Undefined control sequence.
  226. l.6 \dtae
  227. {December 2004}
  228. \end{verbatim}
  229. \item<+-> Mathematikbefehl außerhalb des Mathematikmodus' benutzt
  230. \begin{verbatim}
  231. ! Missing $ inserted
  232. \end{verbatim}
  233. \end{itemize}
  234. \end{frame}
  235. \begin{frame}[fragile]
  236. \frametitle{\enquote{Klassische} Fehlermeldungen}
  237. \onslide<+->
  238. \begin{itemize}
  239. \item<+-> Unerlaubter Absatz im Argument eines Makros
  240. \begin{verbatim}
  241. Runaway argument?
  242. {December 2004 \maketitle
  243. ! Paragraph ended before \date was complete.
  244. <to be read again>
  245. \par
  246. l.8
  247. \end{verbatim}
  248. \item<+-> Fehlendes \lstinline|\item| in Aufzählung
  249. \begin{verbatim}
  250. ! LaTeX Error: Something's wrong--perhaps a missing \item.
  251. ...
  252. l.37 \end{itemize}
  253. \end{verbatim}
  254. \end{itemize}
  255. \onslide<+->
  256. Mehr Hilfe unter
  257. \url{https://en.wikibooks.org/wiki/LaTeX/Errors_and_Warnings}
  258. \end{frame}
  259. \begin{frame}[fragile]
  260. \frametitle{Mehr Informationen bei Fehlern}
  261. \onslide<+->
  262. \TeX\ (und damit auch \LaTeX) kann dazu gebracht werden, bei Fehlern mehr
  263. Informationen auszugeben.
  264. \begin{itemize}
  265. \item<+-> \lstinline|\errorcontextlines=5| im Dokument sorgt dafür, dass bei
  266. Fehlern die ersten 5 Expansionsstufen angezeigt werden.
  267. \item<+-> \lstinline|\listfiles| in der Präambel zeigt die Versionen aller
  268. geladenen Pakete an
  269. \item<+-> Viele \emph{Tracing-Befehle} sind direkt in \TeX\ eingebaut
  270. \begin{lstlisting}
  271. \tracingmacros=1
  272. \tracingcommands=1
  273. \tracingall
  274. \end{lstlisting}
  275. (Siehe auch
  276. \url{https://tex.stackexchange.com/questions/60491/latex-tracing-commands-list})
  277. \item<+-> \lstinline|\usepackage{trace}|
  278. \end{itemize}
  279. \end{frame}
  280. \end{document}
  281. %%% Local Variables:
  282. %%% mode: latex
  283. %%% TeX-master: t
  284. %%% TeX-engine: luatex
  285. %%% End:
  286. % LocalWords: Makrodefinition Umgebungsdefinitionen