Ich habe ein einfaches Klassendiagramm mit pgf-umlcd gezeichnet, aber die Verwendung eines Unterstrichs im Klassennamen führt zu einer Fehlermeldung.
\begin{tikzpicture}
\begin{class}{foo\_bar}{0,0}
% some stuff here
\end{class}
\end{tikzpicture}
In der Zeile erscheint die Meldung \end{class}
:
Missing \endcsname inserted. \end{class}
Ich habe es auch \textunderscore
mit dem Underscore-Paket versucht (gleiches Ergebnis) und \verb|_|
(was den Kompilierungsprozess aufhängt).
Ist das ein Fehler in pgf-umlcd? Die Verwendung von Unterstrichen in Attributen und Operationen funktioniert einwandfrei. Gibt es eine Problemumgehung oder etwas, das ich übersehe?
Antwort1
Das Paket verwendet das Argument \begin{class}
für zwei unterschiedliche Zwecke, nämlich sowohl für den Schriftsatz als auch für die Erstellung von Knotennamen.
Wenn es für den Schriftsatz verwendet wird, _
ist es unzulässig, wohingegen \_
es in einem Knotennamen unzulässig ist.
Die einfachste Lösung besteht darin,
\usepackage[T1]{fontenc}
und Verwendung
\begin{class}{Class\string_Name}
Sie können den (ziemlich hässlichen) Unterstrich, den Sie bei T1-codierten Schriftarten erhalten, auch mit einer komplexeren Problemumgehung vermeiden, die im Wesentlichen darin besteht, das Paket so umzuschreiben, dass es zwei unterschiedliche Zeichenfolgen für die beiden Zwecke verwendet; eine hat die einfachen Unterstriche, in der anderen sind sie durch ersetzt \_
.
\documentclass{article}
\usepackage{pgf-umlcd}
\usepackage{xpatch}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\defineclassname}{m}
{
\tl_set:Nn \umlcdClassName { #1 }
\tl_set_eq:NN \umlcdClassNameString \umlcdClassName
\tl_replace_all:Nfn \umlcdClassName { \char_generate:nn { `_ } { 8 } } { \_\kern1pt }
}
\cs_generate_variant:Nn \tl_replace_all:Nnn { Nf }
\ExplSyntaxOff
\xpatchcmd{\classAndInterfaceCommon}
{\def\umlcdClassName}
{\defineclassname}
{}{}
\xpatchcmd{\endclass}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\xpatchcmd{\endinterface}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\xpatchcmd{\endabstractclass}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\xpatchcmd{\endobject}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\xpatchcmd{\endclassAndInterfaceCommon}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\xpatchcmd{\endclassAndInterfaceCommon}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\xpatchcmd{\endclassAndInterfaceCommon}
{(\umlcdClassName)}
{(\umlcdClassNameString)}
{}{\ddt}
\begin{document}
\begin{tikzpicture}
\begin{class}[text width=8cm]{Class_Name}{0,0}
\attribute{name : attribute type}
\attribute{name : attribute type = default value}
\operation{name(parameter list) : type of value returned}
% virtual operation
\operation[0]{name(parameters list) : type of value returned}
\end{class}
\end{tikzpicture}
\end{document}