我多次使用同一个电路变体,只做了很小的改动,所以我用 tikz 命令定义了一个宏。这是我的文档:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{siunitx}
\usepackage{circuitikz}
\usetikzlibrary{babel} % fixes some other bug with tikz and babel french
\begin{document}
\newcommand\circuitbase{
\draw (2.5,4) node[label={above:$c$}] {} to[R, a=$\SI{2}{\kilo\ohm}$, *-] (2.5,2)
node[label={left:$a$}] {} to[R, a=$\SI{1}{\kilo\ohm}$, *-*] (2.5,0) node[label={below:$d$}] {};
}
\begin{circuitikz}[american]
\circuitbase
\draw (2.5,2) to[R, l=$\SI{470}{\ohm}$] (5,2);
\end{circuitikz}
\end{document}
但是使用宏时节点标签无法正常工作:
这很可能是因为 babel 被设置为法语,因为它适用于\usepackage{babel}
。我该如何修复它?
答案1
(请注意,可能@DanielFlipo 评论中的回答是一个更好的解决方案 --- 我希望他能发表一个答案;下面我的只是削减:
babel-french 中的功能)
babel
这是(我怀疑是冒号)中活动字符之间的交互,而且它circuitikz
一点也不具体。这个“更简单的示例”也显示了这个问题:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage{siunitx}
\usepackage{tikz}
\usetikzlibrary{babel} % fixes some other bug with tikz and babel french
\begin{document}
\newcommand\circuitbase{
\draw (2.5,4) node[label={above:$c$}] {} ;
}
\begin{tikzpicture}[]
\circuitbase
\draw (5,4) node[label={above:$c$}] {} ;
\end{tikzpicture}
\end{document}
如果你不需要简写,更好的解决方案是使用
\usepackage[french, shorthands=off]{babel}
然后使用 Unicode 字符表示法语字母和重音(虽然我不知道:
法语中应该怎么做,所以这里我可能错了)。
答案2
使用 pdflatex,babel-french 激活冒号,以便自动在其前添加法语所需的空格(与 ; ! ? 相同)。\NoAutoSpacing 命令用于不需要插入空格的情况。
但添加\NoAutoSpacing
到\circuitbase
命令(组中最佳)只会删除虚假空间:
\newcommand\circuitbase{\bgroup\NoAutoSpacing
\draw (2.5,4) node[label={above:$c$}] {} to[R, a=$\SI{2}{\kilo\ohm}$, *-] (2.5,2)
node[label={left:$a$}] {} to[R, a=$\SI{1}{\kilo\ohm}$, *-*] (2.5,0) node[label={below:$d$}] {};
\egroup}
我猜这不是你想要的。在本地切换为说“英语”也无济于事(冒号仍然有效)。
请注意,\circuitbase
当使用 lualatex 或 xelatex 进行编译时,您的原始命令可以立即使用,而这些命令不会在法语中产生有效的高标点符号。
使用 pdflatex\usetikzlibrary{babel}
应该可以解决这个问题,但是却没有。