\AtBeginEnvironment{tikzcd} 没有任何效果

\AtBeginEnvironment{tikzcd} 没有任何效果

几个babel模块(例如ngerman一个)使"角色活跃,这是包的麻烦的根源tikz-cd,并且tikz'babel库可能不够(参见例如这个问题)。

作为一种解决方法,我可以在环境之前和之后分别插入\shorthandoff{"}和。但是,因为这会变得乏味,所以我想用和来自动化。但这没有任何效果:在下面的 MCE 中,编译在第二个环境中失败。\shorthandon{"}tikzcd\AtBeginEnvironment{tikzcd}\AfterEndEnvironment{tikzcd}tikzcd

\documentclass[
, ngerman
, english
]{article}
\usepackage{tikz-cd}
\usepackage{babel}

\usetikzlibrary{babel}

\begin{document}

\shorthandoff{"}%
\fbox{%
  \begin{tikzcd}[ampersand replacement=\&]
    X\ar[-stealth,r,swap,"p" ] \&
    Y \ar[-stealth,l,swap,bend right=30,"s"]
  \end{tikzcd}
}
\shorthandon{"}%

\AtBeginEnvironment{tikzcd}{%
  \shorthandoff{"}%
}
\AfterEndEnvironment{tikzcd}{%
  \shorthandon{"}%
}
\fbox{%
  \begin{tikzcd}[ampersand replacement=\&]
    X\ar[-stealth,r,swap,"p" ] \&
    Y \ar[-stealth,l,swap,bend right=30,"s"]
  \end{tikzcd}
}
\end{document}

答案1

当 TikZ 作为“修复” catcodes 的参数的一部分(该参数已被读取)时,它不能做很多事情。

您可以定义自己的框宏,在抓取参数之前,先切换简写,然后才抓取参数。例如:

\newcommand*\BitouzeBox{\begingroup\shorthandoff{"}\BitouzeBoxInternal}
\newcommand*\BitouzeBoxInternal[1]{\fbox{#1}\endgroup}

你可以使用它作为

\BitouzeBox{%
  \begin{tikzcd}[ampersand replacement=\&]
    X \ar[-stealth, r, swap, "p" ] \&
    Y \ar[-stealth, l, swap, bend right=30, "s"]
  \end{tikzcd}%
}

而不必担心关闭简写。(但是,这仍然意味着您不能babel在图表中使用 s 简写,但您始终可以使用\babelshorthand{"-}。)

但是,如果您只需要在 CD 周围画一个框,那么就让 TikZ 绘制它们。
在下面的代码中,我定义了一个样式fbox,该样式将用作tikzpicture或 的tikzcd环境的选项,该环境会在您的图片周围绘制\fbox。我明确使用了 所使用的相同长度,\fbox以便结果相同。

backgrounds图书馆提供类似的按键和更多定制。

代码

\documentclass[ngerman,english]{article}
\usepackage{tikz-cd}
\usepackage{babel}
\usetikzlibrary{babel}
\newcommand*\BitouzeBox{\begingroup\shorthandoff{"}\BitouzeBoxInternal}
\newcommand*\BitouzeBoxInternal[1]{\fbox{#1}\endgroup}
\tikzset{fbox/.style={
  /tikz/execute at end picture={\draw[line width=\fboxrule]
              ([shift={(-\fboxsep-.5\pgflinewidth,-\fboxsep-.5\pgflinewidth)}]
                                       current bounding box.south west)
    rectangle ([shift={( \fboxsep+.5\pgflinewidth, \fboxsep+.5\pgflinewidth)}]
                                       current bounding box.north east);}}}
\begin{document}

\shorthandoff{"}%
\fbox{%
  \begin{tikzcd}[ampersand replacement=\&]
    X\ar[-stealth,r,swap,"p" ] \&
    Y \ar[-stealth,l,swap,bend right=30,"s"]
  \end{tikzcd}% ← !
}

\shorthandon{"}%
\BitouzeBox{%
  \begin{tikzcd}[ampersand replacement=\&]
    X \ar[-stealth, r, swap, "p" ] \&
    Y \ar[-stealth, l, swap, bend right=30, "s"]
  \end{tikzcd}% ← !
}

\begin{tikzcd}[fbox] % no ampersand replacement anymore!
  X \ar[-stealth, r, swap, "p" ] &
  Y \ar[-stealth, l, swap, bend right=30, "s"]
\end{tikzcd}
\end{document}

输出

在此处输入图片描述

相关内容