Babelshorthands de Polyglossia arruina el comportamiento del comando de escritura en archivo y entra en conflicto con Graphviz

Babelshorthands de Polyglossia arruina el comportamiento del comando de escritura en archivo y entra en conflicto con Graphviz

Ejemplo (ejecútelo xelatex a.tex -shell-escapedos veces, o simplemente xelatex a.texsi no lo tiene dotinstalado y luego explore los archivos generados manualmente):

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

El primer y tercer gráfico no se representan y .dotlos archivos correspondientes no son válidos, mientras que el segundo está bien. Los archivos dañados son

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

y

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

Archivo correcto:

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

Parece que Polyglossia reemplaza algunas abreviaturas dentro \digraphdel argumento del comando cuando intenta escribir en un archivo. Digamos, ""con \hskip \z@skip. ¿Cómo desactivo ese comportamiento temporalmente, para que no se realice ningún reemplazo de taquigrafía al ejecutar \digraph? Probablemente, alguna manipulación de clases de personajes será suficiente.

El \digraphcomando del paquete Graphvizparece bastante sencillopero no tengo suficiente conocimiento de los aspectos internos de TeX y el manejo de archivos para tener idea de qué hacer.

Respuesta1

Debes usarlo \shorthandoff{"}antes \digraph(y \shorthandon{"}después).

Es posible parchear \digraphpara que haga lo correcto; más precisamente, es necesario parchear \@digraphpara insertar \shorthandoff{"}después \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}

Aquí está el contenido de los tres archivos después de ejecutar el ejemplo:

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

Una forma extraña de parchear el comando, pero es bastante resistente a otros métodos debido a los trucos especiales que realiza.

información relacionada