TikZ:非活动分号

TikZ:非活动分号

我曾使用 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}

在此处输入图片描述

相关内容