Babelshorhands от Polyglossia портит поведение команды записи в файл и конфликтует с graphviz

Babelshorhands от Polyglossia портит поведение команды записи в файл и конфликтует с 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!"];
}

Похоже, что Polyglossia заменяет некоторые сокращения внутри \digraphаргумента команды, когда она пытается записать в файл. Скажем, ""с помощью \hskip \z@skip. Как мне временно отключить это поведение, чтобы не выполнялась замена сокращений при выполнении \digraph? Вероятно, будет достаточно некоторых манипуляций с классами символов.

The\digraph из пакета Graphvizвыглядит довольно простоно у меня недостаточно знаний о внутреннем устройстве 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=""]
}

Странный способ исправления команды, но он довольно устойчив к другим методам из-за специальных трюков, которые он делает.

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