Polyglossia의 babelshorthands는 파일에 쓰기 명령 동작을 손상시키고 graphviz와의 충돌을 일으킵니다.

Polyglossia의 babelshorthands는 파일에 쓰기 명령 동작을 손상시키고 graphviz와의 충돌을 일으킵니다.

예( xelatex a.tex -shell-escape두 번 실행하거나 설치 xelatex a.tex하지 않은 경우 에만 실행 dot한 다음 생성된 파일을 수동으로 탐색):

\documentclass{article}
\usepackage[pdf]{graphviz}
\usepackage{polyglossia}

\setdefaultlanguage[babelshorthands=true]{russian}
\setmainfont{CMU Serif} % Fonts are loaded to avoid compilation errors
\setmonofont{CMU Typewriter Text}  

\begin{document}
  \digraph{test1}{
    vertex[label="v1",pos="2,3!"];
  }
  \digraph{test2}{
    vertex[label="v2"
    ,pos="2,3!"];
  }
  \digraph{test3}{
    vertex[label=""]
  }
\end{document}

첫 번째와 세 번째 그래프는 렌더링되지 않으며 해당 .dot파일은 유효하지 않지만 두 번째 그래프는 괜찮습니다. 버릇없는 파일은

digraph test1 {
vertex[label="v1\penalty \@M \hskip .2em\ignorespaces pos="2,3!"];
}

그리고

digraph test3 {
vertex[label=\hskip \z@skip ]
}

올바른 파일:

digraph test2 {
vertex[label="v2"
,pos="2,3!"];
}

\digraphPolyglossia가 파일에 쓰려고 할 때 명령 인수 내부의 일부 약어를 대체하는 것 같습니다 . ""로 말해보세요 \hskip \z@skip. 해당 동작을 일시적으로 비활성화하여 실행할 때 속기 교체가 수행되지 않도록 하려면 어떻게 해야 합니까 \digraph? 아마도 일부 문자 클래스 조작만으로 충분할 것입니다.

\digraphGraphviz 패키지의 명령꽤 간단 해 보인다그러나 나는 TeX 내부와 파일 처리에 대해 충분히 이해하지 못해 무엇을 해야할지에 대한 단서를 갖습니다.

답변1

\shorthandoff{"}사용 전 \digraph(및 이후) 에 사용해야 합니다 \shorthandon{"}.

\digraph올바른 작업을 수행하도록 패치하는 것이 가능합니다 . 보다 정확하게는 . 뒤에 \@digraph삽입하려면 패치가 필요합니다 .\shorthandoff{"}\begingroup

\documentclass{article}
\usepackage[pdf]{graphviz}
\usepackage{polyglossia}

\setdefaultlanguage[babelshorthands=true]{russian}
\setmainfont{CMU Serif} % Fonts are loaded to avoid compilation errors
\setmonofont{CMU Typewriter Text}

\makeatletter
\begingroup
\def\temp\begingroup#1\@nil{%
  \endgroup\def\@digraph{\begingroup\shorthandoff{"}#1}%
}
\expandafter\temp\@digraph\@nil
\makeatother

\begin{document}
  \digraph{test1}{
    vertex[label="v1",pos="2,3!"];
  }
  \digraph{test2}{
    vertex[label="v2"
    ,pos="2,3!"];
  }
  \digraph{test3}{
    vertex[label=""]
  }
\end{document}

예제를 실행한 후 세 파일의 내용은 다음과 같습니다.

digraph test1 {
vertex[label="v1",pos="2,3!"];
}
digraph test2 {
vertex[label="v2"
,pos="2,3!"];
}
digraph test3 {
vertex[label=""]
}

명령을 패치하는 이상한 방법이지만 특별한 트릭 때문에 다른 방법에는 상당히 저항적입니다.

관련 정보