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}

여기에 이미지 설명을 입력하세요

관련 정보