Babelshorthands von Polyglossia beeinträchtigt das Verhalten von Befehlen zum Schreiben in Dateien und steht in Konflikt mit Graphviz

Babelshorthands von Polyglossia beeinträchtigt das Verhalten von Befehlen zum Schreiben in Dateien und steht in Konflikt mit Graphviz

Beispiel ( xelatex a.tex -shell-escapezweimal ausführen oder nur, xelatex a.texwenn Sie es nicht dotinstalliert haben, und dann die generierten Dateien manuell erkunden):

\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}

Das erste und dritte Diagramm werden nicht gerendert und die entsprechenden .dotDateien sind ungültig, während das zweite in Ordnung ist. Ungültige Dateien sind

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

Und

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

Richtige Datei:

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

Es sieht so aus, als ob Polyglossia einige Abkürzungen im \digraphArgument des Befehls ersetzt, wenn versucht wird, in eine Datei zu schreiben. Sagen wir, ""mit \hskip \z@skip. Wie deaktiviere ich dieses Verhalten vorübergehend, sodass beim Ausführen von kein Ersetzen der Abkürzungen durchgeführt wird \digraph? Wahrscheinlich reichen einige Manipulationen der Zeichenklassen aus.

Der \digraphBefehl aus dem Graphviz-Paketsieht ziemlich unkompliziert ausaber ich verstehe nicht genug von den internen Vorgängen und der Dateiverwaltung von TeX, um zu wissen, was zu tun ist.

Antwort1

Sie sollten es \shorthandoff{"}vorher \digraph(und \shorthandon{"}danach) verwenden.

Es ist möglich, einen Patch durchzuführen, \digraphdamit das Richtige passiert; genauer gesagt muss ein Patch durchgeführt werden, um nach \@digrapheinzufügen .\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}

Hier ist der Inhalt der drei Dateien nach dem Ausführen des Beispiels:

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

Eine seltsame Art, den Befehl zu patchen, aber aufgrund der speziellen Tricks, die er ausführt, ist er ziemlich resistent gegenüber anderen Methoden.

verwandte Informationen