几个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}