\documentclass[11pt,compress,trans]{beamer}

\usepackage[latin1]{inputenc}
\usepackage{ngerman,parskip,fancyvrb,color,hyperref,listings}
\usepackage[color]{fvrb-ex}
\usepackage[ngerman]{babel}
\usepackage{../beamerthemeIEEE}

\date{12. Juni 2008}

\hypersetup{
	pdfauthor={Philipp Wendler},
	pdftitle={Formelsatz in LaTeX},
}

\title{Eigene Kommandos in \LaTeX}
\author{Philipp Wendler}
\institute{IEEE Student Branch Passau}

%\fvset{frame=single,numbers=left,formatcom=\color{blue}}
\fvset{frame=single,gobble=0}
\renewcommand\FancyVerbFormatLine[1]{\textcolor{blue}{#1}}
%\newenvironment{ex}{\begin{CenterExample}}{\end{CenterExample}}
\newcommand\sampletext{Beispieltext Beispieltext }
\newcommand\simpleformula{a^2 + b^2 = c^2}
%\newcommand\exformula{\lim_{x\to\inf} \left(\sqrt{\frac{b^2}{\binom{x}{n}}}\right)}
\newcommand\exformula{x_{1,2} = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}}

\newenvironment{block*}[1]{\vspace*{-\baselineskip}\begin{block}<#1>{}}{\end{block}}

\DeclareMathOperator \sgn {sgn}
\newcommand \abs[1] { \left \lvert #1 \right \rvert }
\newcommand\keywordstyle[1]{\texttt{\textbf{#1}}}
\newcommand\emphstyle[1]{\color{red}\texttt{#1}}
\lstset{language=[LaTeX]TeX, ],%
keywordstyle=\keywordstyle,emphstyle=\emphstyle,emphstyle=[2]\color{blue},emphstyle=[3]\textit,%
keywords={\RequirePackage,\@ifnextchar,\$,\%,\ü},%
emph={newsavebox,sbox,lrbox,savebox,usebox,newcounter,setcounter,addtocounter,stepcounter,refstepcounter,@addtoreset,@removefromreset,value,the,newcommand,renewcommand,providecommand,DeclareRobustCommand,CheckCommand,newenvironment,renewenvironment,ifthenelse,whiledo},%
emph=[2]{\mybox,mycounter,\mycmd,myenv},%
emph=[3]{width,pos,content,oldcounter,val,reset,counter,\comm@nd,args,default,command,definition,begcmd,endcmd,test,then,else}}

\begin{document}

% Titelseite
\frame{\titlepage}

% Inhaltsuebersicht
% \begin{frame}
% \frametitle{Inhalt}
% \tableofcontents
% \end{frame}

\section{Save boxes}

\newsavebox{\mybox}
\begin{lrbox}{\mybox}
\begin{lstlisting}
\begin{lrbox}{\mybox}
content
\end{lrbox}
\end{lstlisting}
\end{lrbox}

\section{Save boxes}
\begin{frame}[fragile]{Save boxes}
\begin{itemize}
\item Die Variablen von \LaTeX\ für Boxen.
\item Deklarierung: \lstinline|\newsavebox{\mybox}|
\item<2-> Befüllen:
\begin{itemize}
\item \lstinline|\sbox{\mybox}{content}| \hfill wie \lstinline|\mbox|
\item \lstinline|\savebox{\mybox}[width][pos]{content}| \hfill wie \lstinline|\makebox|
\item \usebox{\mybox}\hfill
wie \lstinline|\sbox|
\end{itemize}
\item<3-> Ausgabe: \lstinline|\usebox{\mybox}|
\end{itemize}
\end{frame}

\begin{frame}[fragile]{Save boxes, example}
\begin{Example}
\newsavebox{\ex}

\savebox {\ex} [5cm] {\color{red}\textbf{Beispiel} }

\framebox{ \usebox{\ex} }     \usebox{\ex}
\end{Example}
\end{frame}

\section{Counter}

\begin{frame}[fragile]{Counter}
\begin{itemize}
\item Die Variablen von \LaTeX\ für Integer.
\item Deklarierung: \lstinline|\newcounter{mycounter}[oldcounter]|\\
    Initialisierung mit 0
\item<2-> Untergeordnete Counter:\\
    \lstinline|\@addtoreset{reset-counter}{mycounter}| \\
    \lstinline|\@removefromreset{reset-counter}{mycounter}|
\item<3-> Setzen: \\
    \lstinline|\setcounter{mycounter}{val}| \\
    \lstinline|\addtocounter{mycounter}{val}|
\item<4-> Erhöhen um 1, resetted alle untergeordneten Counter:
    \lstinline|\stepcounter{mycounter}{val}|\\
    \lstinline|\refstepcounter{mycounter}{val}| \\
    Letzteres setzt \lstinline|\ref| auf \lstinline|\the|\lstinline|mycounter|
\end{itemize}
\end{frame}

\newcounter{ex}
\setcounter{ex}{8}

\begin{frame}[fragile]{Counter-Ausgabe}
\begin{itemize}
\item Verwendung, wo \LaTeX\ eine Zahl erwartet: \lstinline|\value{mycounter}|
\item<2-> Ausgabe als Text:

\begin{SideBySideExample}[xrightmargin=2.5cm]
£$\begin{tabular}{ccc}
§HLeµ\arabic¶{ex}§HLfµ&¶ §HLeµ\roman¶{ex}§HLfµ&¶ §HLeµ\Roman¶{ex}§HLfµ\\¶
§HLeµ\alph¶{ex}  §HLfµ&¶ §HLeµ\Alph¶{ex} §HLfµ&¶ §HLeµ\fnsymbol¶{ex}§HLfµ\\¶
£\end{tabular}$
\end{SideBySideExample}
\item<3-> Standard-Ausgabe: \lstinline|\the|\lstinline|mycounter|
\begin{itemize}\setlength\parskip{0.3\baselineskip}
\item Exisitiert für jeden Counter
\item wird z.B. durch \lstinline|\ref| aufgerufen
\item kann mehrere Counter gleichzeitig ausgeben:\\
\begin{SideBySideExample}[xrightmargin=1.7cm]
£\vspace*{2\baselineskip}
\renewcommand\theex %
    { \arabic{section}.\alph{ex}) }
\theex
\end{SideBySideExample}
\end{itemize}
\end{itemize}
\end{frame}

\section{\LaTeX-Befehle}

\begin{frame}[fragile]{Befehlsklassen}
\begin{itemize}
\item Befehle gedacht für Dokumente:\\kurze Namen und kleingeschrieben (z.B. \lstinline|\section|)
\item Befehle für Paket-Schreiber:\\CamelCase (z.B. \lstinline|\RequirePackage|)
\item Interne Befehle, Kernelbefehle:\\@ im Namen (z.B. \lstinline|\@ifnextchar|)\linebreak
    \alert{Benutzung möglichst vermeiden, Verhalten kann sich ändern!}
\end{itemize}
Leider nicht vollständig durchhaltbar.
\end{frame}

\begin{frame}[fragile]{Verwendung von internen Befehlen}
\begin{itemize}
\item können normal nicht verwendet werden\\wegen dem ungültigen Zeichen
\item in der Dokument-Präambel: \par \lstinline|\makeatletter \comm@nd \makeatother|
\item Verwendung ungefährlich, man muss nur daran denken
\item in Paketen und Klassen: nie \lstinline|\makeat*| verwenden, Standardverhalten ist bereits wie nach \lstinline|\makeatletter|
\end{itemize}
\end{frame}


\section{Eigene Kommandos}

\begin{frame}[fragile]{Namensbeschränkungen}
\begin{block}{Befehle:}
\begin{itemize}
\item \alert<1>{Nur Buchstaben (a-z und A-Z), kein \textunderscore:-+ etc.!}
\item Einzig der Modifier * am Ende erlaubt\\(technisch kein Namensbestandteil).
\item Ausnahme sind Namen aus nur einem Zeichen: \\
alles (ja!) erlaubt: \pause \lstinline|\ü| \pause \lstinline|\$| \pause \lstinline|\%|
\end{itemize}
\end{block}
\pause
\begin{block}{Umgebungen:}
\begin{itemize}
\item Theoretisch mehr Zeichen erlaubt, aber nicht offiziell (kann Probleme mit Paketen geben).
\item Einzig sichere Namensbestandteile sind a-z, A-Z und *.
\end{itemize}
\end{block}

\note{
\begin{block}{Label für \textbackslash label und \textbackslash cite:}
Theoretisch genauso, aber alle Pakete auf : eingerichtet, da üblich.
\end{block}}
\end{frame}

\begin{frame}[fragile]{newcommand}
\lstinline|\newcommand\mycmd[#args][default]{command definition}|
\begin{itemize}
\item \lstinline|\mycmd|: Name des Befehlsklassen
\item \lstinline|[#args]|: optional Anzahl der Parameter ($\leq 9$)
\item \lstinline|[default]|: optional Angabe eines Default-Werts für den 1. Parameter
\item \lstinline|{command definition}|: Inhalt des Befehls\par
    Auf die Parameter kann mit \#1 bis \lstinline|#args| zugegriffen werden.\par
    Bei verschachtelten Definitionen \#\#1 usw.
\end{itemize}
\end{frame}

\begin{frame}[fragile]{Argument-Beschränkungen}
\begin{block}{Einschränkungen für Befehls-Argumente:}
\begin{itemize}
\item Geschweifte Klammern müssen ausgeglichen sein.
\item \lstinline|\verb|, die \texttt{verbatim}-Umgebung und ähnliches nicht erlaubt
\item in optionalen Argumenten ist \lstinline|]| nur innerhalb von Klammern erlaubt (z.B. \lstinline|\item[{a]}]| geht, \lstinline|\item[a]]| nicht)
\end{itemize}
falls man \lstinline|\newcommand*| benutzt hat:
\begin{itemize}
\item Absätze (z.B. durch Leerzeilen oder \lstinline|\par| erzeugt) sind nicht erlaubt.
\end{itemize}
\end{block}
\end{frame}

\begin{frame}[fragile]{Andere Befehlsdefinitionen}
Alle Parameter wie bei \lstinline|\newcommand|, ebenso existieren analoge Versionen mit *
\begin{itemize}
\item \lstinline|\renewcommand|\\
    Redefiniert den Befehl. Änderung der Parameteranzahl sind möglich, aber keine Überladungen.
\item \lstinline|\providecommand|\\
    Definiert den Befehl nur, wenn er noch nicht existiert.
\item \lstinline|\DeclareRobustCommand|\\
    Definiert einen \glqq{}robusten\grqq Befehl.
\item \lstinline|\CheckCommand|\\
    Wirft einen Fehler, wenn die vorhanden Definition nicht exakt mit der angegebenen übereinstimmt.
\end{itemize}
\end{frame}

\begin{frame}[fragile]{newenvironment}
\lstinline|\newenvironment{myenv}[#args][default]{begcmd}{endcmd}|
\lstinline|\renewenvironment{myenv}[#args][default]{begcmd}{endcmd}|

\begin{itemize}
\item \lstinline|myenv|: Name der Umgebung
\item \lstinline|[#args]|: optional Anzahl der Parameter ($\leq 9$)
\item \lstinline|[default]|: optional Angabe eines Default-Werts für den 1. Parameter
\item \lstinline|{begcmd}|: Befehle die bei \lstinline|\begin{name}| ausgeführt werden
\item \lstinline|{endcmd}|: Befehle die bei \lstinline|\end{name}| ausgeführt werden
\end{itemize}
Zugriff auf Parameter nur in \lstinline|begcmd| möglich!

Abhilfe: z.B. save boxes oder einen temporären Befehl definieren.
\end{frame}

\newcommand\mycmd{}
\newenvironment{myenv}[2][Anfang]         %
    {#1\renewcommand\mycmd[1]{#2 (##1)}}  %
    {\mycmd{Demo}}

\begin{frame}[fragile]{Beispiel}
\begin{lstlisting}
\newcommand\mycmd{}
\newenvironment{myenv}[2][Anfang]         %
    {#1\renewcommand\mycmd[1]{#2 (##1)}}  %
    {\mycmd{Demo}}
\end{lstlisting}

\pause
\begin{Example}
\begin{myenv}{Ende}       und \end{myenv}

\begin{myenv}[begin]{end}
  aussen
  \begin{myenv} [[] {]} innen \end{myenv}
  aussen
\end{myenv}
\end{Example}
\end{frame}

\section{Ausblick}

\begin{frame}[fragile]{Nützliche Pakete}
\begin{block}{calc}
    Erlaubt Arithmetik mit Längen und Zahlen (z.B. Countern).
\end{block}
\begin{block}{ifthenelse}
    \lstinline|\ifthenelse{test}{then}{else}|\\
    \lstinline|\whiledo{test}{command}|\\
    String- und Längenvergleiche\\
    boolsche Variablen und Arithmetik
\end{block}
\end{frame}
\end{document}
