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=""]
}

這是一種奇怪的修補命令的方法,但由於它具有特殊的技巧,因此它對其他方法具有很大的抵抗力。

相關內容