pgf-umlcd: Unterstrich im Klassennamen schlägt fehl

pgf-umlcd: Unterstrich im Klassennamen schlägt fehl

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 \textunderscoremit 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}

Bildbeschreibung hier eingeben

verwandte Informationen