我有一個用 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}