Polyglossia の babelshorthands はファイルへの書き込みコマンドの動作を台無しにし、graphviz と競合します。

Polyglossia の babelshorthands はファイルへの書き込みコマンドの動作を台無しにし、graphviz と競合します。

例 ( xelatex a.tex -shell-escape2 回実行するか、インストールされて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}

1番目と3番目のグラフはレンダリングされず、対応する.dotファイルは無効ですが、2番目のグラフは正常です。破損したファイルは

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{"}before \digraph(およびafter)を使用する必要があります\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}

例を実行した後の 3 つのファイルの内容は次のとおりです。

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

コマンドを修正する奇妙な方法ですが、特別なトリックを実行するため、他の方法に比べてかなり耐性があります。

関連情報