Polyglossia 的 babelshorthands 破坏了写入文件命令的行为并与 graphviz 发生冲突

Polyglossia 的 babelshorthands 破坏了写入文件命令的行为并与 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?可能,一些字符类操作就足够了。

\digraphGraphviz 包中的命令看起来很简单但我对 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=""]
}

这是一种修补命令的奇怪方法,但由于它采用了特殊的技巧,因此它对其他方法具有很强的抵抗力。

相关内容