% \iffalse ********************************************* METACOMMENT % % TeX this file with LaTeX2e ! % % The following files will be written: % % ==> xword.dvi Documentation (read this first) % % --> xword.sty package file % %% Copyright : Kai-Uwe Bux %% --------- Norderneystraße 26 %% D-26419 Schortens/Heidmühle (Germany) %% %% ***************************************************************** % >>>>>>>>> !! Proliferation of UNCHANGED versions of !! <<<<<<<<< % !! this file is permitted !! % % >>>>>>>>> !! Don't change this file without changing !! <<<<<<<<< % !! it's name !! % ****************************************************************** % % \begin{macrocode} \def\FileVersion{$\alpha$-Test} \def\FileDate{1999/08/25} \def\FileDescription{Kreuzworträtsel} % \end{macrocode} % % ********************************************** END METACOMMENT \fi % % \CheckSum{523} % % \iffalse ********************************************* METACOMMENT % \begin{macrocode} %<*driver> \NeedsTeXFormat{LaTeX2e}[1998/06/01] \let\ThisVersion\FileVersion \let\ThisDate\FileDate % % \end{macrocode} % ********************************************** END METACOMMENT \fi % % \iffalse ******************************************** METATCOMMENT % % Dieser Abschnitt erscheint nicht in der Dokumentation % % \Section{Installation} % Was jetzt kommt, ist ein wenig trickreich, da wir diese % Datei zugleich als DocStrip-Batch benutzen m"ussen. % Das hei"st, wir m"ussen daf"ur sorgen, da"s sie auch % bei zeilenweiser Bearbeitung sinnvoll bleibt. % \begin{macrocode} %<*installation> \ifx\undefined\batchfile\begingroup\newtoks\List\fi \def\batchfile{xword.dtx} \makeatletter \let\@@end=\relax \List={} \def\File#1#2{\List=\expandafter{\the\List\file{#1}{\from{xword.dtx}{#2}}}} \File{xword.sty}{xword} \def\G{\expandafter\expandafter\expandafter\generate\expandafter{\the\List}} \def\GenerateAll{\G\let\GenerateAll\relax} \def\StopInput{\endinput\let\StopInput\relax} \input docstrip.tex \GenerateAll \StopInput \endgroup % \end{macrocode} % Jetzt liegen die folgenden Dateien vor: % \begin{enumerate} % \item \file{xword.sty} % \end{enumerate} % Diese Dateien geh"oren allesamt in ein Verzeichnis, % wo \TeX\ nach Paketen sucht. % % Jetzt basteln wir uns noch das Inhaltsverzeichnis und die % Hilfsdatei zusammen, damit nachher ein \LaTeX-Lauf reicht. % \begin{macroccode} \begin{filecontents}{xword.toc} \IfFileExists{babel.sty}{% \select@language {german} }{} \contentsline {section}{\numberline {1}Die Benutzerschnittstelle}{2} \contentsline {subsection}{\numberline {1.1}Einbindung}{2} \contentsline {subsection}{\numberline {1.2}Parameter}{2} \contentsline {subsection}{\numberline {1.3}Makros und Umgebungen}{2} \contentsline {subsubsection}{\numberline {1.3.1}Vorbemerkung}{2} \contentsline {subsubsection}{\numberline {1.3.2}Eingabe des Kreuzwortr"atsels}{2} \contentsline {subsubsection}{\numberline {1.3.3}Das Gitter}{3} \contentsline {subsubsection}{\numberline {1.3.4}Die Umschreibungen}{4} \contentsline {subsubsection}{\numberline {1.3.5}Die Auf{\kern 0pt}l"osung}{4} \contentsline {section}{\numberline {2}Die Implementierung}{6} \end{filecontents} \begin{filecontents}{xword.aux} \relax \IfFileExists{babel.sty}{% \select@language{german} \@writefile{toc}{\select@language{german}} \@writefile{lof}{\select@language{german}} \@writefile{lot}{\select@language{german}} }{} \@writefile{toc}{\contentsline {section}{\numberline {1}Die Benutzerschnittstelle}{2}} \@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Einbindung}{2}} \@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Parameter}{2}} \@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Makros und Umgebungen}{2}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.1}Vorbemerkung}{2}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.2}Eingabe des Kreuzwortr"atsels}{2}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.3}Das Gitter}{3}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.4}Die Umschreibungen}{4}} \@writefile{toc}{\contentsline {subsubsection}{\numberline {1.3.5}Die Auf{\kern 0pt}l"osung}{4}} \@writefile{toc}{\contentsline {section}{\numberline {2}Die Implementierung}{6}} \end{filecontents} % % \end{macrocode} % % ********************************************** END METACOMMENT \fi % % \iffalse ********************************************* METACOMMENT % % Dieser Abschnitt erscheint nicht in der Dokumentation % % \Section{Die Erzeugung der Dokumentation} % Nun liegen also alle Dateien vor. Jetzt sollte die Beschreibung % erfolgen. Zum Gl"uck k"onnen wir die Pakete schon benutzen. % % \begin{macrocode} %<*driver> \documentclass[12pt]{ltxdoc} \IfFileExists{babel.sty}{% \usepackage[german]{babel} }{% \usepackage{german} } \usepackage{xword} \newcommand{\pkg}[1]{\textsf{#1}} \newcommand{\cls}[1]{\textsf{#1}} \newcommand{\file}[1]{\texttt{#1}} \newcommand{\env}[1]{\texttt{#1}} \newcommand{\opt}[1]{\textsf{#1}} \newcommand{\sect}[1]{{#1}} \newcommand{\sty}[1]{\emph{#1}} \newcommand{\ARG}[1]{\emph{#1}} \newcommand{\GobbleOne}[1]{} \newcommand{\Section}{\newpage\section} \newcommand{\finalnopagebreak}{\nopagebreak} \newcommand{\finalpagebreak}{\pagebreak} \OnlyDescription \begin{document} \title{Kreuzwortr"atsel mit \LaTeX\\ Das \pkg{xword}-Paket} \author{Kai-Uwe Bux} \date{\begin{tabular}{ll} Datum: & \ThisDate\\ Version: & \ThisVersion \end{tabular}} \maketitle\thispagestyle{empty}\newpage \setcounter{page}{1}\tableofcontents \DocInput{xword.dtx} \end{document} % % \end{macrocode} % % ********************************************** END METACOMMENT \fi % % \Section{Die Benutzerschnittstelle} % \subsection{Einbindung} % Das \pkg{xword}-Paket kennt keine Optionen. Daher bindet % man es einfach mit % \begin{verbatim} % \usepackage{xword} % \end{verbatim} % in der Pr"aambel eines \LaTeX-Dokumentes ein. % % \subsection{Parameter} % Das \pkg{xword}-Paket definiert einen L"angenparameter: % \begin{verbatim} % \XwordGridWidth % \end{verbatim} % Er gibt die Breite an, in der Kreuzwortr"atsel und ihre % L"osungen gesetzt werden. % Der Benutzer kann ihn mit |\setlength| ver"andern, das % Paket gibt als Wert die Textbreite des Satzspiegels % (|\textwidth|) vor. % % \subsection{Makros und Umgebungen} % \subsubsection{Vorbemerkung} % Alle Makros und Umgebungen haben genau ein optionales % Argument, das dazu dient, ein Kreuzwortr"atsel unter % einem bestimmten Namen zu definieren. Dies ist f"ur Dokumente % n"otig, die mehr als ein Kreuzwortr"atsel enthalten. % % \subsubsection{Eingabe des Kreuzwortr"atsels} % Die Angaben, die ein Kreuzwortr"atsel erfordert, sind % \begin{itemize} % \item das rechteckige Feld von Buchstaben und geschw"arzten Feldern, % \item die Felder, die nummeriert werden m"ussen, % weil dort ein Wort anf"angt, und % \item die Umschreibungen der einzelnen W"orter. % \end{itemize} % Das \pkg{xword}-Paket stellt die \env{xword}-Umgebung zur % Verf"ugung, mit deren Hilfe, diese Angaben eingegeben werden k"onnen. % F"ur jedes nummerierte Wort muá ein Eintrag angegeben werden, der % die Koordinaten des Feldes angibt. Die allgemeine Syntax eines % Eintrages ist % \begin{quote} % |\entry(|\ARG{spalte}|,|\ARG{zeile}|)| \ldots\ |\endentry| % \end{quote} % Der hier ausgelassene Teil enth"alt Angaben "uber die W"orter, % waagerecht wie senkrecht, die in diesem Feld anfangen: % \begin{quote} % |\acr{|\ARG{waagerechtes Wort}|}{|\ARG{Umschreibung}|}|\\ % |\dwn{|\ARG{senkrechtes Wort}|}{|\ARG{Umschreibung}|}| % \end{quote} % % Ein kleines Beispiel wird das klar machen: % \begin{verbatim} % \begin{xword}[beispiel] % \entry(1,1)\dwn{DTX}{Extension dieser Datei.}\endentry % \entry(1,2)\acr{TEX}{Unser aller Lieblingsprogramm.}\endentry % \end{xword} % \end{verbatim} % \begin{xword}[beispiel] % \entry(1,1)\dwn{DTX}{Extension dieser Datei.}\endentry % \entry(2,1)\acr{TEX}{Unser aller Lieblingsprogramm.}\endentry % \end{xword} % Durch dieses Konstrukt wird ein Kreuzwortr"atsel unter dem % Namen ">beispiel"< definiert. Mit sp"ater behandelten Makros % kann f"ur dieses Kreuzwortr"atsel das Gitter, die Umschreibungen % und seine L"osung gesetzt werden. % % \textbf{Hinweis:} Beim Lesen dieser Umgebung, legt \LaTeX\ eine % Reihe von Hilfsdateien an. Diese werden bei erneutem \TeX{}en % allerdings nur dann "uberschrieben, wenn die \file{.aux}-Datei % gel"oscht wird. Das spart bei Dokumenten, die mehrere Durchl"aufe % ben"otigen, Zeit. Es f"uhrt aber dazu, daá Žnderungen im % Kreuzwortr"atsel nur ber"ucksichtigt werden, wenn man die % \file{.aux}-Datei hernach l"oscht. % % \subsubsection{Das Gitter} % Das Makro |\XwordPrintGrid| setzt das eigentliche Kreuzwortr"atsel. % Also, um bei unserem Beispiel zu bleiben, % \begin{verbatim} % \setlength{\XwordGridWidth}{3cm}% % \begin{center} % \XwordPrintGrid[beispiel] % \end{center} % \end{verbatim} % liefert % \setlength{\XwordGridWidth}{3cm}% % \begin{center} % \XwordPrintGrid[beispiel] % \end{center} % % \subsubsection{Die Umschreibungen} % Umschreibungen werden durch |\XwordPrintClues| gedruckt: % \begin{verbatim} % \par\noindent\XwordPrintClues[beispiel] % \end{verbatim} % liefert % \par\noindent\XwordPrintClues[beispiel] % % Man kann mit |\XwordRef| auf eine Umschreibung verweisen. % Dabei dient das umschriebene Wort als Label. Mit % \begin{verbatim} % \XwordRef[beispiel]{TEX} % \end{verbatim} % erzeugt man also den Hinweis auf den % Eintrag~\XwordRef[beispiel]{TEX}. % Dieses Makro kann "ubrigens auch in den Umschreibungen % Verwendet werden, was eine gewisse Selbstbez"uglichkeit des % Kreuzwortr"atsels erschafft. % % \subsubsection{Die Auf{\kern0pt}l"osung} % Schlieálich kann man mit |\XwordPrintSolution| die L"osung % setzen: % \begin{verbatim} % \setlength{\XwordGridWidth}{3cm}% % \begin{center} % \XwordPrintSolution[beispiel] % \end{center} % \end{verbatim} % Das ergibt % \setlength{\XwordGridWidth}{3cm}% % \begin{center} % \XwordPrintSolution[beispiel] % \end{center} % % % \Section{Die Implementierung} % Dieser Abschnitt ist nicht dokumentiert. % \StopEventually{} % \begin{macrocode} %<*xword> \NeedsTeXFormat{LaTeX2e}[1998/06/01] \ProvidesPackage{xword}[\FileDate LaTeX Kreuzwortraetsel Paket] \RequirePackage{ifthen} \newcounter{rowposition} \newcounter{colposition} \newcounter{rowlength} \newcounter{collength} \newcounter{lastrowpos} \newcounter{lastcolpos} \newcounter{maxrowpos} \newcounter{maxcolpos} \newcounter{entrycntr} \newwrite{\xword@grd} \newwrite{\xword@acr} \newwrite{\xword@dwn} \newwrite{\xword@ref} \newlength{\XwordGridWidth} \setlength{\XwordGridWidth}{\textwidth} \newcommand{\xword@size}{% \string\xword@setsize{\current@xword}{\arabic{maxcolpos}}{\arabic{maxrowpos}}% }% \newcommand{\@xword}[1]{% \typeout{Entering xword ``#1''.}% \def\protect{\string\protect\string} \ignorespaces \immediate\openout\xword@grd #1.grd \immediate\openout\xword@acr #1.acr \immediate\openout\xword@dwn #1.dwn \immediate\openout\xword@ref #1.ref \setcounter{lastrowpos}{0}% \setcounter{lastcolpos}{0}% \setcounter{maxrowpos}{0}% \setcounter{maxcolpos}{0}% \setcounter{entrycntr}{0}% \newcommand{\entry}{% \begingroup \xword@catcodes \expandafter\endgroup\entr@ }% \newcommand{\xword@catcodes}{% \@tempcnta=128 \loop\ifnum\@tempcnta<256 \catcode\@tempcnta=12 \advance\@tempcnta\@ne \repeat % \catcode`\~=12 \catcode`\"=12 }% \def\entr@(##1,##2)##3\endentry{% \addtocounter{entrycntr}{1}% \setcounter{colposition}{##1}% \setcounter{rowposition}{##2}% \ifthenelse{ \value{lastcolpos} > \value{colposition} }{% \OrderingError }{% \ifthenelse{ \( \value{lastcolpos} = \value{colposition} \) \and \not \( \value{lastrowpos} < \value{rowposition} \) }{% \OrderingError }{% \@namedef{ent@\roman{rowposition}:\roman{colposition}}{}% \setcounter{lastrowpos}{\value{rowposition}}% \setcounter{lastcolpos}{\value{colposition}}% \entryok{##1}{##2}{##3}% }% }% }% \newcommand{\ErrorPos}{ Entry Nr. \arabic{entrycntr}, Field (\arabic{lastcolpos},\arabic{lastrowpos})% } \newcommand{\OrderingError}{% \typeout{\ErrorPos: Order Error}% }% \newcommand{\entryok}[3]{% ##3% }% \newcommand{\acr}{% \@ifnextchar[{\@acr}{\@acr[\xword@argtwo]}% } \def\@acr[##1]##2##3{% \def\xword@argtwo{##2}% \setcounter{colposition}{\value{lastcolpos}}% \rowdef ##2\end \setcounter{rowlength}{\value{rowposition}}% \addtocounter{rowlength}{-\value{lastrowpos}}% \ifthenelse{ \value{maxrowpos} > \value{rowposition} }{% }{% \setcounter{maxrowpos}{\value{rowposition}}% }% \write@entry{acr}{##1}{##2}{##3}{\arabic{rowlength}}% } \newcommand{\dwn}{% \@ifnextchar[{\@dwn}{\@dwn[\xword@argtwo]}% } \def\@dwn[##1]##2##3{% \def\xword@argtwo{##2}% \setcounter{colposition}{\value{lastcolpos}}% \setcounter{rowposition}{\value{lastrowpos}}% \coldef ##2\end \setcounter{collength}{\value{colposition}}% \addtocounter{collength}{-\value{lastcolpos}}% \ifthenelse{ \value{maxcolpos} > \value{colposition} }{% }{% \setcounter{maxcolpos}{\value{colposition}}% }% \write@entry{dwn}{##1}{##2}{##3}{\arabic{collength}}% }% \newcommand{\rowdef}[1]{% increments by length of ! \def\@tempa{##1}% \def\@tempb{\end}% \ifx\@tempa\@tempb \let\next\relax \else \fielddef{rowposition}{colposition}{##1}% \addtocounter{rowposition}{1}% \def\next{\rowdef}% \fi \next }% \newcommand{\coldef}[1]{% \def\@tempa{##1}% \def\@tempb{\end}% \ifx\@tempa\@tempb \let\next\relax \else \fielddef{rowposition}{colposition}{##1}% \addtocounter{colposition}{1}% \def\next{\coldef}% \fi \next }% \newcommand{\fielddef}[3]{% \@ifundefined{xword@\roman{##1}:\roman{##2}}{% \@namedef{xword@\roman{##1}:\roman{##2}}{##3}% % \typeout{Field (\arabic{##1},\arabic{##2}) --> ##3}% }{% \def\@tempa{##3}% \edef\@tempb{\csname xword@\roman{##1}:\roman{##2}\endcsname}% \ifx\@tempa\@tempb \else \CrosswordError{##1}{##2}{##3}% \fi }% }% \newcommand{\CrosswordError}[3]{% \typeout{% \ErrorPos: Letter mistaken (\arabic{##1},\arabic{##2}) -->% \@nameuse{xword@\roman{##1}:\roman{##2}} - ##3% }% }% \newcommand{\write@entry}[5]{% % \typeout{\space\space{##1}{##2}{##3}{##4}{##5}} \immediate\write\xword@ref{\string\xword@label{#1}{##2}{\arabic{entrycntr}}{##1}} \immediate\write\csname xword@##1\endcsname{% \string\entryline {\arabic{entrycntr}}% {\arabic{lastcolpos}}% {\arabic{lastrowpos}}% {##5}{##3}{##4}{##1}% }% }% \newcommand{\PrintField}[2]{% \@ifundefined{xword@\roman{##1}:\roman{##2}}{% \immediate\write\xword@grd{\string\xword@black}% }{% \@ifundefined{ent@\roman{##1}:\roman{##2}}{% \immediate\write\xword@grd{\string\xword@white{\@nameuse{xword@\roman{##1}:\roman{##2}}}}% }{% \immediate\write\xword@grd{\string\xword@entry{\@nameuse{xword@\roman{##1}:\roman{##2}}}}% }% }% }% \newcommand{\@end@xword}{% \setcounter{colposition}{1}% \whiledo{ \value{colposition} < \value{maxcolpos} }{% \setcounter{rowposition}{1}% \whiledo{ \value{rowposition} < \value{maxrowpos} }{% \PrintField{rowposition}{colposition}% \addtocounter{rowposition}{1}% }% \addtocounter{colposition}{1}% \ifthenelse{ \value{colposition} < \value{maxcolpos} }{% \immediate\write\xword@grd{\string\par}% }{% \immediate\write\xword@grd{\string\endinput}% }% }% \addtocounter{maxcolpos}{-1}% \addtocounter{maxrowpos}{-1}% \immediate\write\@auxout{\xword@size} \immediate\closeout\xword@grd \immediate\closeout\xword@acr \immediate\closeout\xword@dwn \immediate\closeout\xword@ref \typeout{Size: \arabic{maxcolpos} columns x \arabic{maxrowpos} rows}% \typeout{Number of entries: \arabic{entrycntr}}% \typeout{Leaving xword.}% }% } \newenvironment{xword}[1][\jobname]{% \def\current@xword{#1}% \@ifundefined{xword@#1@size}{\@xword{#1}}{% \@nameuse{xword@#1@size}% \immediate\write\@auxout{\xword@size}% \def\entry##1\endentry{\relax}% }% }{% \@ifundefined{xword@\current@xword @size}{\@end@xword}{% }% }% \newcommand{\xword@square}[1]{% \begingroup \setbox2=\hbox{% \fbox{% \parbox[b][\dimen4][c]{\dimen2}{% \makebox[\dimen2][c]{% #1% }% }% }% }% \parbox[b][\dimen4][c]{\dimen2}{% \makebox[\dimen2][c]{\box2}% }% \endgroup \ignorespaces }% \newcommand{\xword@gridstart}[1]{% \makeatletter \@nameuse{xword@#1@size}% \addtolength{\XwordGridWidth}{-\fboxrule}% \setlength{\fboxsep}{-0.5\fboxrule}% \dimen2=\XwordGridWidth \divide\dimen2 by \value{maxrowpos}% \dimen4=\dimen2 \xword@adjust \setcounter{entrycntr}{0}% \setbox2=\hbox{\parbox[b]{\XwordGridWidth}{% \baselineskip=0pt \lineskip=0pt \lineskiplimit=0pt \parskip=0pt \parindent=0pt \InputIfFileExists{#1.grd}{}{}% }}% \addtolength{\XwordGridWidth}{\fboxrule}% \raisebox{\depth}{% \makebox[\XwordGridWidth][c]{\box2}% }% }% \newcommand{\XwordPrintGrid}[1][\jobname]{% \begingroup \typeout{Generating the grid of xword ``#1''\space ...}% \newcommand{\xword@black}{% \xword@square{\rule{\dimen2}{\dimen4}}% }% \newcommand{\xword@white}[1]{% \xword@square{}% }% \newcommand{\xword@entry}[1]{% \addtocounter{entrycntr}{1}% \xword@square{% \parbox[t][\dimen4][t]{\dimen2}{% \vspace*{1pt}% \hspace*{1pt}\footnotesize\arabic{entrycntr}% }% }% }% \newcommand{\xword@adjust}{% \ifthenelse{ \lengthtest{ \dimen4 > 12mm } }{% \dimen4=12mm% }{}% \ifthenelse{ \lengthtest{ \dimen4 < 8mm } }{% \dimen4=8mm% }{}% }% \xword@gridstart{#1}% \endgroup }% \newcommand{\XwordPrintSolution}[1][\jobname]{% \begingroup \typeout{Printing the solution of xword ``#1''\space ...}% \newcommand{\xword@black}{% \xword@square{\rule{\dimen2}{\dimen4}}% }% \newcommand{\xword@white}{\xword@entry}% \newcommand{\xword@entry}[1]{% \xword@square{##1}% }% \newcommand{\xword@adjust}{\relax}% \xword@gridstart{#1}% \endgroup }% \newcommand{\XwordPrintClues}[1][\jobname]{% \begingroup \makeatletter \typeout{Printing the clues for xword ``#1''\space ...}% \newcommand{\entryline}[7]{% ##1)~##6 }% \noindent\textbf{Waagerecht:} \InputIfFileExists{#1.acr}{}{} \medskip \par \noindent\textbf{Senkrecht:} \InputIfFileExists{#1.dwn}{}{} \endgroup }% \newcommand{\xword@label}[4]{% \expandafter\gdef\csname xword@#1@#2@label\endcsname{\xword@printref{#3}{#4}}% \ignorespaces }% \newcommand{\xword@refload}[1]{% \@ifundefined{xword@ref@#1@loaded}{% \@namedef{xword@ref@#1@loaded}{}% \begingroup \makeatletter \InputIfFileExists{#1.ref}{}{}% \endgroup }{}% } \newcommand{\xword@printref}[2]{% \begingroup \def\acr{w}% \def\dwn{s}% #1\csname #2\endcsname)% \endgroup } \DeclareRobustCommand{\XwordRef}[2][\jobname]{% \xword@refload{#1}% \@nameuse{xword@#1@#2@label}% } \newcommand{\xword@setsize}[3]{% \expandafter\gdef\csname xword@#1@size\endcsname{% \setcounter{maxcolpos}{#2}% \setcounter{maxrowpos}{#3}% }% }% % % \end{macrocode} % % \iffalse ********************************************* METACOMMENT % Die folgende Section erscheint nicht in der Dokumentation! % ------------------------------------------------------------------ % \Section{Die CharacterTable} % Das hier dient nur dazu, die CharacterTable aus den generierten % Dateien rauszuhalten. % \begin{macrocode} %<*installation> \endinput % % \end{macrocode} % |\endinput| veranla"st |\generateFile| zum Abbruch der % Bearbeitung. % ------------------------------------------------------------------ % ********************************************** END METACOMMENT \fi % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% % \Finale