Os babelshorthands da Polyglossia estragam o comportamento do comando de gravação em arquivo e entram em conflito com o graphviz

Os babelshorthands da Polyglossia estragam o comportamento do comando de gravação em arquivo e entram em conflito com o graphviz

Exemplo (execute xelatex a.tex -shell-escapeduas vezes ou apenas xelatex a.texse não tiver dotinstalado e explore os arquivos gerados 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}

O primeiro e o terceiro gráfico não são renderizados e .dotos arquivos correspondentes são inválidos, enquanto o segundo está ok. Arquivos estragados são

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

e

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

Arquivo correto:

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

Parece que o Polyglossia substitui algumas abreviações no \digraphargumento do comando quando tenta gravar em um arquivo. Diga, ""com \hskip \z@skip. Como desativo esse comportamento temporariamente, para que nenhuma substituição de atalhos seja realizada durante a execução \digraph? Provavelmente, alguma manipulação de classes de personagens será suficiente.

O \digraphcomando do pacote Graphvizparece bem simplesmas não tenho conhecimento suficiente dos componentes internos do TeX e do manuseio de arquivos para ter uma ideia do que fazer.

Responder1

Você deve usar \shorthandoff{"}antes \digraph(e \shorthandon{"}depois).

É possível corrigir \digraphpara que faça a coisa certa; mais precisamente, é necessário corrigir \@digraphpara inserir \shorthandoff{"}depois de \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}

Aqui está o conteúdo dos três arquivos após executar o exemplo:

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

Uma maneira estranha de corrigir o comando, mas é bastante resistente a outros métodos, por causa dos truques especiais que faz.

informação relacionada