pgf-umlcd:类名中的下划线失败

pgf-umlcd:类名中的下划线失败

我有一张用 pgf-umlcd 绘制的简单类图,但是在类名中使用下划线会导致错误消息。

\begin{tikzpicture}
  \begin{class}{foo\_bar}{0,0}
    % some stuff here
  \end{class}
\end{tikzpicture}

消息出现在以下\end{class}行:

Missing \endcsname inserted. \end{class}

我也尝试了\textunderscore下划线包(相同的结果)和\verb|_|(挂起编译过程)。

这是 pgf-umlcd 中的错误吗?在属性和操作中使用下划线效果很好。有没有解决方法或者我遗漏了什么?

答案1

该包使用参数来\begin{class}实现两个不同的目的,即排版和制作节点名称。

当用于排版时,_是非法的,而\_作为节点名称则是非法的。

最简单的解决方法是添加

\usepackage[T1]{fontenc}

并使用

\begin{class}{Class\string_Name}

您还可以使用更复杂的解决方法来避免使用 T1 编码字体时出现的(相当难看的)下划线,该解决方法基本上是重写包,以便它使用两个不同的字符串来实现两个目的;一个有简单的下划线,另一个用 替换它们\_

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

在此处输入图片描述

相关内容