![TikZ:非活动分号](https://linux22.com/image/316606/TikZ%EF%BC%9A%E9%9D%9E%E6%B4%BB%E5%8A%A8%E5%88%86%E5%8F%B7.png)
我曾使用 TikZ 定义一个可扩展的箭头,并被类似于的符号打断\xrightarrow
。
\documentclass{article}
\usepackage{tikz}
\newcommand{\oprightarrow}[1]{%
\mathbin{%
\tikz[baseline=-3pt]{%
\node[text depth=0,inner sep=1.5pt] (n) {\ensuremath{\scriptstyle #1}};%
\draw (n.west) -- +(-.7em,0);%
\draw[->] (n.east) -- +(.7em,0);%
}}}
\begin{document}
\begin{figure}
\caption{$P\oprightarrow{\varphi}Q$}
\end{figure}
$P\oprightarrow{\varphi} Q$
\end{document}
虽然这在正常情况下可以正常工作,但我在图形标题中使用它时遇到错误:
./test_mwe.tex:16: Undefined control sequence.
\tikz@deactivatthings ->\def ;
{\tikz@nonactivesemicolon }\def :{\tikz@nonact...
l.16 \caption{$P\oprightarrow{\varphi}Q$}
./test_mwe.tex:16: Undefined control sequence.
\tikz@deactivatthings ...onactivesemicolon }\def :
{\tikz@nonactivecolon }\de...
l.16 \caption{$P\oprightarrow{\varphi}Q$}
./test_mwe.tex:16: Undefined control sequence.
\tikz@deactivatthings ...kz@nonactivecolon }\def |
{\tikz@nonactivebar }\def ...
l.16 \caption{$P\oprightarrow{\varphi}Q$}
./test_mwe.tex:16: Undefined control sequence.
\tikz@deactivatthings ...tikz@nonactivebar }\def !
{\tikz@nonactiveexlmark }
l.16 \caption{$P\oprightarrow{\varphi}Q$}
我知道将 babel 和 tikz 混合使用可能会有问题,例如,使用法语时冒号和分号会变成活动字符。但这似乎有些不同。
值得一提的是,标题排版正确。
有任何想法吗?
答案1
该\tikz[...]{...}
命令本质上等同于\begin{tikzpicture}[...]...\end{tikzpicture}
并且\begin
是脆弱的命令。这也会使您的\oprightarrow
命令变成一个脆弱的命令,\protect
当它出现在移动参数中时,例如标题文本或分段标题,它需要在它前面。
因此
\caption{$P\protect\oprightarrow{\varphi}Q$}
可以解决问题,但最好通过以下方式彻底解决\DeclareRobustCommand
它\newcommand
:
\DeclareRobustCommand{\oprightarrow}[1]{%
\mathrel{%
\tikz[baseline=-3pt]{%
\node[text depth=0,inner sep=1.5pt] (n) {$\scriptstyle #1$};%
\draw (n.west) -- +(-.7em,0);%
\draw[->] (n.east) -- +(.7em,0);%
}%
}%
}
请注意,箭头应该是关系符号(因此\mathrel
),这只\ensuremath
会让 TeX 做更多的工作。
\documentclass{article}
\usepackage{tikz}
\DeclareRobustCommand{\oprightarrow}[1]{%
\mathrel{%
\tikz[baseline=-3pt]{%
\node[text depth=0,inner sep=1.5pt] (n) {$\scriptstyle #1$};%
\draw (n.west) -- +(-.7em,0);%
\draw[->] (n.east) -- +(.7em,0);%
}%
}%
}
\begin{document}
\begin{figure}[htp]
\caption{$P\oprightarrow{\varphi}Q$}
\end{figure}
$P\oprightarrow{\varphi} Q$
\end{document}
您可以检查这是否也适用于babel-french
。
另一方面,你可以在没有 TikZ 的情况下解决同样的问题:
\documentclass{article}
\DeclareRobustCommand{\oprightarrow}[1]{%
\mathrel{-}
\mathrel{\vcenter{\hbox{$\scriptstyle\,\mathstrut#1\,$}}}
\rightarrow
}
\begin{document}
\begin{figure}[htp]
\caption{$P\oprightarrow{\varphi}Q$}
\end{figure}
$P\oprightarrow{\varphi} Q$
\end{document}