pdflatex 挂在 centercolon 和 tikz 上

pdflatex 挂在 centercolon 和 tikz 上

在 tikz 图片中使用 centercolon 时,pdflatex 会挂起,没有任何错误消息。

例子:

\documentclass{article}
\usepackage{mathtools}
\usepackage{tikz}

\DeclareMathSymbol{:}{{:}}{operators}{"3A} 
\mathtoolsset{centercolon}    

\begin{document}
\begin{tikzpicture}
\draw (0,0) node [label=above:{$:=$}]{} ;
\end{tikzpicture}
\end{document}

有人知道为什么会发生这种情况吗?有什么解决办法吗?

我的系统:OpenSuSE 42.3 上的 pdfTeX 3.14159265-2.6-1.40.18(TeX Live 2017/TeX Live for opensuse.org)。

答案1

您可以centercolon在每个的开头禁用tikzpicture,然后在节点内部使用,或者\vcentcolon仅在节点内部重新激活。:centercolon

我按照@jfbu 的评论定义了一种centercolon停用/重新激活的样式:

\documentclass[tikz,border=7pt]{standalone}
\usepackage{mathtools}

\mathtoolsset{centercolon}

% disable 'centercolon' for every tikzpicture
\tikzset{
  centercolon/.code = {\csname MH_set_boolean_F:n\endcsname {center_colon}\mathtoolsset{centercolon=#1}},
  centercolon/.default=true,
  every picture/.prefix style = {centercolon=false},
  every node/.append style={centercolon},
  every node/.append style={scale=7, opacity=.5} % <-- just to compare the results
}

\begin{document}
  \begin{tikzpicture}
    \draw (0,0)
      node [red, centercolon=false]{$:=$}
      node [blue]  {$:=$}
      node [green] {$\vcentcolon=$};
  \end{tikzpicture}
\end{document}

注意事项:

  • 蓝色和绿色节点完全相同,红色节点与centercolon=false
  • 简单使用\mathtoolsset{centercolon}after\mathtoolsset{centercolon=false}不会将活动状态恢复:为类似状态\vcentcolon,正如@jfbu 在下面的评论中指出的那样。

enter image description here

答案2

关于如何调试 tikz 的几点看法

\documentclass{article}
\usepackage{mathtools}
\usepackage{tikz}

\mathtoolsset{centercolon}    

\makeatletter
\def\tikz@startup@env{%
  \lccode`~`;
  \lowercase{\let\tikz@activesemicolon~}%
  \lccode`~`:
  \lowercase{\let\tikz@activecolon~}%
  \lccode`~`|
  \lowercase{\let\tikz@activebar~}%
% (original coding is not good style in \ifnum tests)
  \ifnum\catcode`\;=\active\let\tikz@origsemi=\tikz@activesemicolon\fi
  \ifnum\catcode`\:=\active\let\tikz@origcolon=\tikz@activecolon\fi
  \ifnum\catcode`\|=\active\let\tikz@origbar=\tikz@activebar\fi
% missing origexlmark ??
  \tikz@deactivatthings
  \iftikz@handle@active@code
    \tikz@switchoff@shorthands
  \fi
}

\begingroup
\catcode`;\active
\catcode`:\active
\catcode`|\active
\catcode`!\active
\gdef\tikz@deactivatthings{%
    \def;{\ifnum\catcode`;=\active\expandafter\tikz@nonactivesemicolon
          \else\expandafter\tikz@activesemicolon\fi}%
    \def:{\ifnum\catcode`:=\active\expandafter\tikz@nonactivecolon
          \else\expandafter\tikz@activecolon\fi}%
    \def|{\ifnum\catcode`|=\active\expandafter\tikz@nonactivebar
          \else\expandafter\tikz@activebar\fi}%
% does not seem to be handled in \tikz@startup@env
    \def!{\tikz@nonactiveexlmark}%
}
\endgroup

\makeatother


\begin{document}
\begin{tikzpicture}
\draw (0,0) node [label=above:{$:=$}]{} ;
\end{tikzpicture}
\end{document}

但我只对此进行了测试,因此可能会破坏其他一切......

enter image description here

相关内容