示例(运行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
?可能,一些字符类操作就足够了。
\digraph
Graphviz 包中的命令看起来很简单但我对 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=""]
}
这是一种修补命令的奇怪方法,但由于它采用了特殊的技巧,因此它对其他方法具有很强的抵抗力。