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

此套件使用參數 to\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}

在此輸入影像描述

相關內容