在 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 在下面的评论中指出的那样。
答案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}
但我只对此进行了测试,因此可能会破坏其他一切......