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-07-macros.tex 8.9KB

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