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из пакета underscore (тот же результат) и \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}

введите описание изображения здесь

Связанный контент